【PHPフレームワーク】Ethna【スケルトン自動作成】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/08/03(水) 21:00:39ID:TuHx69hTEthna -PHPウェブアプリケーションフレームワーク-
http://ethna.jp/
SourceForge.jp: Project Info - Ethna
http://sourceforge.jp/projects/ethna/
0502nobodyさん
2006/09/20(水) 14:30:41ID:Ni5iDH7a0510nobodyさん
2006/09/21(木) 04:53:57ID:uR4E3gkh0511sage
2006/09/21(木) 19:25:16ID:amkCKdmGご指摘ありがとうございます! ご指摘どおりpreforward()をオーバライドしていました。
ですが、forward()に書き直して見ましたが、駄目でした。
メールアドレスにタイプしても、なにもエラーが表示されません。
onkeyup='alert("key Up");'なら動作するのでjavascript自体は問題なさそうです。
ためしに、Flare_View_Jsonのforward()でprint_r($json_object)と記述して、
送信ボタンをクリックすると意図したエラーが表示されるのですが、
上記を記述しないと、Web画面上は真っ白が表示されます。
※/etc/flare-ini.php で 'debug' => 'true'としてます。
う〜〜ん、ヘルプ プリーズ。
0512nobodyさん
2006/09/21(木) 22:02:04ID:???phpeditor使いたいとです
0513nobodyさん
2006/09/22(金) 00:20:14ID:???まぁスケルトン参考にして、必要な物を自分で用意すればいいじゃないか
0514nobodyさん
2006/09/22(金) 13:12:23ID:???という流れのアクションが30個ほどあります。
確認処理が地味にうざいのですが、
確認画面の部分を30個分テンプレ用意する方法と、
確認画面の部分を変数に入れて1つのテンプレから動的に確認画面を表示
させる方法を思いつきました。
できれば後者で行こうと思いますが、
もっと良い方法やスマートな記述法があれば教えてください。
また、今回のような場合に使えるメソッドはないでしょうか?
0515nobodyさん
2006/09/23(土) 13:04:01ID:???0516nobodyさん
2006/09/23(土) 13:42:38ID:???0517nobodyさん
2006/09/23(土) 14:00:20ID:???0518nobodyさん
2006/09/23(土) 14:34:34ID:???0519nobodyさん
2006/09/23(土) 17:47:51ID:???preview3を待ち望んでる身としては嬉しい限りだけど
9月末に出てくれるかな。。。
0520nobodyさん
2006/09/23(土) 23:15:08ID:???なんとかならないんでしょうか?
0521nobodyさん
2006/09/23(土) 23:22:39ID:???記述するのが面倒ならASP.NET+Visual Studio使ってみてはいかがでしょうか?
一考の価値はあるかと。
EthnaEditorってのもあるけど。
0522nobodyさん
2006/09/24(日) 00:57:44ID:???コピペでがんばります。ありがとう
0523nobodyさん
2006/09/24(日) 01:10:47ID:???setFormVars()をオーバーライドするとか。
mod_rewriteでCoolURIにしてるんだけど、POSTだと$_POSTの内容しか
取得しないので、自分で追加してる。
$_REQUESTから全部取らないのってメモリ節約のため?
それとも指定以外のフォーム値は受け取らないというセキュリティへの配慮?
意図しないフォーム値は使わないだけだから、とりあえず全部格納しても
問題なさそうだけど、理由があるなら教えて偉い人。
0525nobodyさん
2006/09/24(日) 11:27:27ID:???0526nobodyさん
2006/09/24(日) 22:00:35ID:???なんでそんなのを標準にしたいのかはわからんが、今でも
_getActionName_Form()の上書きでできるし、
CVSではUrlHandlerも追加されてるぞ?
0527nobodyさん
2006/09/25(月) 00:12:30ID:???その方法が標準になった場合って、サブミットボタンでアクションを振り分けるのって
できなくなるよね?あったら教えてください。
perform()
{
if ($this->af->get('submit_action_a'){
.........
} else if ($this->af->get('submit_action_b'){
.........
}
}
とかは無しね。もしかして、それでアクションチェーンがどうたらとか
言ってる奴らがいるのかな?
0529nobodyさん
2006/09/25(月) 15:06:44ID:???そのうちEthnaにも取り入れられると思うよ
0530nobodyさん
2006/09/26(火) 21:09:48ID:???つくりをしていましたが、Action別にそれぞれ用意したほうが分かりやすくないですかね?
みなさんはどうやってますか?
0533nobodyさん
2006/09/27(水) 09:47:21ID:???コードがばらけていて面倒とかはあると思いますよ。
オブジェクト指向の勉強とかするといいと思いますよ。
(語れる程詳しくは無いので、語らないですけどw)
0534nobodyさん
2006/09/27(水) 13:42:42ID:???0535nobodyさん
2006/09/28(木) 08:14:17ID:???すべての使用されているActionを見直さないといけないっていう問題がでると思うんですよね。
こういうのって画面単位で分担作業するものだから、お互いに変更時に支障がないように
作るものなんじゃないかなぁ。
0536nobodyさん
2006/09/28(木) 09:36:33ID:???それがどんな作りなのかは分からんけど、どうしても回避出来ないよっぽどの理由がない限り共用にしとくのが無難
0537nobodyさん
2006/09/28(木) 22:07:34ID:???そうなのかぁ
ということはいろんな処理に使えるようにSQLはなるべくシンプルな処理にしておくのが無難なのかな
複数Joinとかして、1つの画面に必要なデータをいっぺんにとってくることもできるけど、
ほかの画面では不要なものが多すぎて使えないってこともあると思うし。
なんか微妙だけど、共通化(オブジェクト指向ではない)しようと思います。
ありがとうございました。
0538nobodyさん
2006/09/29(金) 01:56:32ID:???1年前の俺みたいだ。w
あと半年ほど使いまくってEthnaで10個くらい同じことやれば
「あー、この辺共有か」とか分かると思う。
自分はもうEthna使わないでPHPって書いてないからな。
0539nobodyさん
2006/09/30(土) 18:02:23ID:???Ethna_AppObjectの検索部分が使いづらくてたまらない
$db->getall();//テーブル全レコード取得
$db->search($column_name,$value);//$column_nameが$valueのレコードを取得
俺の使い方だと、これだけで8割方、用が足りるんだが・・
0540nobodyさん
2006/09/30(土) 23:20:58ID:???全部レコード取得
$this->appmanager->getObjectPropList('AppObjectClassName');
$valueのレコード
$this->appmanager->getObjectPropList('AppObjectClassName', null, array($column_name) => new Ethna_SearchAppObject($value, OBJECT_CONDITION_EQ));
後者をラップするメソッドをAppObjectの基底クラスに作ってやれば、そんな面倒じゃないと思うけど。
0541nobodyさん
2006/10/01(日) 00:53:21ID:???selectは様々なバリエーションがあってむずいな。
joinとかhavingとか、そのへんまでスマートにこなしてるORMってある?
RORのActive Record が一番ですか?
0543nobodyさん
2006/10/02(月) 16:34:53ID:???http://www.ethna.jp/ethna-document-dev_guide-db.html
上の例だと、
$this->backend->getDB('r');
した場合、
勝手に iniファイルの
'dsn_r' => 'mysql://user:pass@unix+localhost/dbname',
の設定を拾ってくるんでしょうか??
$this->backend->getDB('hoge');
なら
'dsn_hoge' => 'mysql://user:pass@unix+localhost/dbname',
でしょうか?
0544nobodyさん
2006/10/02(月) 17:38:21ID:???0546nobodyさん
2006/10/03(火) 23:18:59ID:???全く違うDSN書けば違いがわかると思うんだけど。
0548nobodyさん
2006/10/05(木) 14:55:25ID:???普通に自分で関数カキカキしてactionディレクトリあたりに
入れればつかえる??
0549nobodyさん
2006/10/06(金) 10:09:32ID:O2kp1NLjapp/action 階層の下に
system1_hoge.php
system2_hoge.php
と設置する場合の手順が書いてありますが、
system1/hoge.php
system2/hoge.php
という風にアクションファイル自体を system1 とsystem2 で設置ディレクトリを分けたいと考えています。
この場合のアクション定義などが非常にこんがらがってしまったのですが、
どなたか助言おながいします。
0550nobodyさん
2006/10/06(金) 11:36:19ID:???のエラーが出るんだけど、
PEARのDBクラス継承してるんですよね?
ほわい?
0553nobodyさん
2006/10/06(金) 13:47:06ID:???$this->af->setApp('hairetu', $hairetu);
して
tplで下のようにしてみたんですが、機能しません。
{section name=cnt loop=$app.hairetu}
ほわい?
0554nobodyさん
2006/10/06(金) 15:35:21ID:Ky3gzt1xfatal Errorになったんですけど、こういう場合のエラー処理は
ethna上でのエラー処理に組み込むことはできないんでしょうか?
0555nobodyさん
2006/10/06(金) 18:01:45ID:???0556nobodyさん
2006/10/06(金) 19:31:49ID:???Ethna_ClassFactoryの変更部分で悩んでいます。
app/[project_id]_Controller.php の $class メンバに
'user' => 'Some_Foo_Bar',
と付け足すのは良いとして、
$user =& $this->backend->getObject('user');はどこに記述するのでしょうか?
Ethna_ActionFormでいちいち記述するのかな?
マニュアル直ってないし・・・
ttp://ethna.jp/ethna-document-dev_guide-appobj-manager.html
0557nobodyさん
2006/10/07(土) 01:27:47ID:???なんかねー、そのへん俺もよくわからんのだけど、とりあえず
class Hogeproject_User extends Ethna_AppObject
class Hogeproject_UserManager extends Ethna_AppManager
って作ったら、そのファイルをControllerでincludeして
$user =& $this->backend->getObject('User');
$user_manager =& $this->backend->getManager('User');
ってやってる。$classメンバには何も付け足してない。
なんつーか、以前より面倒になった気がするし。w
0558nobodyさん
2006/10/07(土) 11:29:23ID:???それは面倒ですなw
Ethna_Controllerの$classメンバに追加するのが標準的なやり方
見たいなのでもうちょっと簡易な方法があるといいのだけれど。
ウェブサイトには「(不評なら戻します@preview2)」って書いてあるけど
MLでは話題にすらなってないし、このまま定着するのかな?
とにかくサンプルかもうちょっと詳細なヘルプが欲しいです。
0559nobodyさん
2006/10/07(土) 13:48:08ID:???どうすればいいでしょうか?
require("絶対パス/hoge.inc.php");
しか思いつきませんでした。
0561nobodyさん
2006/10/07(土) 18:33:16ID:???$classへの追加も不要でしょ。
多少面倒な気もしてるけど、俺はActionClassで毎回
$hoge_manager =& $this->backend->class_factory->getManager('Hoge');
$hoge_manager->getHogeList();
とかやってる。もしかして間違ってる?
0562557
2006/10/08(日) 00:31:43ID:???いや、君が正解だと思う。
おいら、$this->backend->class_factoryプロパティを知らなかったよ。THX.
しかし、Ethnaって「多少面倒な気も」というのにいまいち合致しないよね。イメージ的に。
というのは、$this-->appmanager->って、PHPの
「メソッドを追加できないくせにプロパティはE_NOTICEも吐かずにガンガン追加可能」
っていう特徴を活かしてるなって思ったから。その辺がEthnaの「絶妙に妥協」というのに
共感を覚えてたところでもあって。
というか、シングルトンでAppObject/AppManager/ActionClass/ViewClassで
Managerオブジェクト(ActionFormオブジェクトもだけど)を持ち回ししてるところに
「すげー」って思ったのだ。最初。それが無くなったのは残念。
あと、PHP5なら
$this->backend->getManager('Hoge')->hogeManagerMethod();
ができるよね。だから
$this->gm('Hoge')->hogeManagerMethod();
くらいまで簡略化できるなら従来の
$this->hoge->hogeManagerMethod();
と同等と思える。
0563nobodyさん
2006/10/08(日) 13:29:42ID:???parent::Ethna_ActionClass($backend);
$c =& $backend->getController();
$manager_list = $c->getManagerList();
foreach ($manager_list as $k => $v) {
$this->$k =& $backend->getManager($v);
}
こうしてやれば、従来どおりなわけだが
0564563
2006/10/08(日) 13:34:23ID:???こことか参考にしてみたらいいと思う。
0565nobodyさん
2006/10/09(月) 10:51:17ID:???フィルタをフォーム値検証の前に実施する方法は無いでしょうか?
ある変数を半角英数字しか受け付けないように設定、
かつ全角で受け付けたときには自動的に半角にするようフィルタを設定
しているのですが、
全角で入力してしまうと、validate()が0にならないためです。
0566nobodyさん
2006/10/09(月) 13:02:01ID:???Controllerの$managerに追加された名前で$this->hogeとアクセスできてしまうのは
問題ありまくりだし、気持ち悪かった。
AppManagerの呼び出し方にワンクッション追加されただけだから、個人的にはそこまで
面倒は感じてないし、記述が長いならメソッドひとつ仲介させれば済む話だと思う。
562氏の言うとおり、ActionFormやAppManagerがAction/Viewを問わずリクエスト内で
自由に使えるのは他のフレームワーク(symfonyとかZend Frameworkとか)には無い考え方で
自分がEthnaを気に入った理由のひとつだけど、そのメリットは無くなってないんじゃないかな?
0567nobodyさん
2006/10/09(月) 18:37:23ID:NhVn4oaT0568562
2006/10/09(月) 19:52:52ID:???>問題ありまくりだし、気持ち悪かった。
実際に問題と言うと
・DB接続しなけりゃ使えない
・Manager全てnewしてるから(シングルトン使ってるとはいえ)重い
くらいかな?他に何かある?Managerって作ってもせいぜい20くらいだったから
重いとは思わなかったけど。
キモイのは確かに気持ち悪かったけど、「PHPだしいいじゃん」という気にもさせてくれる。
その辺が「絶妙に妥協」なのかなと。
で、気持ち悪さを払拭しようとすると、Action/View/AppManager/AppObjectそれぞれを
ラップしたクラスでoverloadを使って、プロパティへのアクセス方法を定義してやれば
ちょっとは気持ち悪くなくなると思う・・・。
http://jp2.php.net/overload
自分的には「前のが便利、だけど(きっとメリット色々ありそうだから)新方式に従います」
って感じ。
0569566
2006/10/09(月) 20:38:58ID:???上書きしてるから、メンバ変数が破壊されるってことです。
既存のもので言うと、試しにControllerの$managerに
$manager = array( 'af' = > 'AirFrance' );
とか入れてみるとActionFormが使えなくなるのが解ると思う。
($this->af はActionForm じゃなくて AirFrance になったからね)
$managerに設定する値についての注意事項も書いていないし、使う側が
注意していればいい、というには危険な仕様じゃないかな。
0570562
2006/10/09(月) 21:02:06ID:???>んーと、ActionClassのコンストラクタとかでチェックもせずに
>上書きしてるから、メンバ変数が破壊されるってことです。
あぁ、なるほど。すっごい盲点でした。
managerが増えすぎていった場合、ハマりポイントになりそうですね。
0571nobodyさん
2006/10/10(火) 07:39:28ID:???厳格なのがよければにしとけば。
0572nobodyさん
2006/10/10(火) 07:40:00ID:???Javaにしとけば。
0573nobodyさん
2006/10/12(木) 12:29:20ID:???これと同じエラー(mysql_close)起きてるんですが、
ethna本体とか弄らないと厳しいんでしょうか・・・・
他に解決方法きぼんぬ
0574nobodyさん
2006/10/12(木) 17:17:50ID:???あとは、継承してそこにパッチを当てておけば、後ほどバージョンアップしても気にならずに済むかも。
stableの保守も考えてほしいよね。
0575nobodyさん
2006/10/16(月) 16:19:02ID:???function kansuu()をperform()内に書いて
$this->kansuu で呼び出すだけでOK?
0577nobodyさん
2006/10/16(月) 22:29:35ID:???0578nobodyさん
2006/10/17(火) 13:52:04ID:???0581nobodyさん
2006/10/20(金) 13:43:30ID:???579じゃないけど
Controllerでincludeするのが一般的だと思う。
使うときは普通に使いたいところで使えばいい
0582nobodyさん
2006/10/21(土) 09:57:55ID:???フィルタが見つからないって言われる…
0583582
2006/10/21(土) 11:27:38ID:???コントローラーで、requireしなきゃいけなかったんですね。
なんかめんどくさいような。
0585nobodyさん
2006/10/21(土) 20:49:07ID:???>>582は間違いだと思うが、他は何がおかしいの?
俺も同じようにしてるんだけど、何か違う方法でもあるの?
0586nobodyさん
2006/10/22(日) 21:38:10ID:bEm1HQtNcustomで関数を作って値をチェックしたいとします。
で、それは送られてきた値がDBに該当のレコードがあるかどうかっていう感じ
のことをしたいのですが、チェックするメソッド自体はManagerに実装してます。
それでActionFormクラス内にcheck_valueというメソッドを作り、そっからManager
クラスを呼びたかったんですが、呼べませんでした。
公式サイトには、「上の3以外のクラスで使いたい場合は*2、Ethna_BackendのgetManager([manager_name])で取得できます。」
って記述があったんですが、ActionFormはbackendも持ってないみたいで取得できず…。
こういう使い方は想定してないんでしょうか?
それとも俺のやり方がクソなんでしょうか。
まぁprepare関数内でやればいい話なんでしょうけど…。
せっかくなんでActionForm内でチェックしたいです。
何かいい方法あれば教えてください。
0587nobodyさん
2006/10/22(日) 21:46:29ID:???_smartyプラグインは登録もしないとダメだよね。
_PEARってControllerで全部includeしないでしょ。使うところでincludeしてるだけで。
0589nobodyさん
2006/10/23(月) 00:30:27ID:???そこをsmartyの$plugins_dirに登録してくれるからそれでいいんでない?
0590nobodyさん
2006/10/23(月) 12:53:41ID:iU9TDYVmすみません。どうやってとればいいんでしょうか?
ActionFormクラスのコンストラクタは確かにcontroller持ってるみたいですが、
メンバ変数には入ってないぽいのでEthnaのソースいぢるしか方法思いつきません…。
0591nobodyさん
2006/10/23(月) 13:41:47ID:???試してないけど、
$ccc =& Ethna_Controller::getInstance();
ではだめかな?
0593582
2006/10/23(月) 15:53:14ID:???pluginディレクトリを指定するところがあったんですね。
見落としていました。勉強になります。
個人的には解決です。ありがとうございました。
0594nobodyさん
2006/10/24(火) 14:00:42ID:???アクションクラスで使った変数を取得するには
どうすればいいんでしょうか?
作成中のソフトで
データベースの status というフィールドを 1〜5 に割り当ててるんですが、
表示させるときには 1->普通 2->駄目 3->最悪
という感じで数字ではなく日本語で表示させたいと思ってます。
よくわからんのですが、
この1を普通と表示させるようなことは
ビューでするというのが一般的なポリシーになるんでしょうか。
0595nobodyさん
2006/10/24(火) 22:19:26ID:???0596nobodyさん
2006/10/25(水) 01:46:10ID:???基底のViewクラス作ってstatusを全部のViewで有効にするか(その場合Viewは省略しないこと)
全てのstatusを継ぎたいViewClassでextends ViewWhatStatusDefined して
そのpreforwardメソッドでド頭に
parent::preforwardを全部させておけ。
0597nobodyさん
2006/10/25(水) 04:26:17ID:QhoBwbI3おれは、
/index.php?action_static=true&file=page1
/index.php?action_static=true&file=page2
/index.php?action_static=true&file=page3
ってな感じで、
function preform() {
return $this->af->get('file');
}
ってやってるよ。
# かなり古い記事に反応していまった自分が痛い(汗)
0598nobodyさん
2006/10/25(水) 20:28:02ID:???473でほぼ同じの出てるし
0599nobodyさん
2006/10/26(木) 23:33:48ID:???右側がメニューで選択した内容を表示させる部分としてます。
この場合、左側部分はどのアクションでも常に同じ内容を表示しているわけで、
できれば include とかすると楽なんですが、
ethnaでincludeのが適切なのか良く分かりません。
(actionクラスでincludeかつtplでinclude??)
またincludeする場合も相対パスでどうやって記述すればいいのか、
が分かりません。
(よく本体は設置場所を動かすので、影響を受けないように相対パスで
指定したいと考えています。)
助言おながいします
0600nobodyさん
2006/10/27(金) 01:36:41ID:???http://www.itt-web.net/modules/bwiki/index.php
の
「テンプレートからEthnaのActionを起動」
とかどう?
0601599
2006/10/27(金) 13:23:57ID:???レスサンクスです
「SmartyPluginに下記の関数を用意」のところなんですが、
直接smarty自体を弄る必要が出ますよね?
ここなんとかならんでしょうか?
■ このスレッドは過去ログ倉庫に格納されています