【PHPフレームワーク】Ethna【スケルトン自動作成】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/08/03(水) 21:00:39ID:TuHx69hTEthna -PHPウェブアプリケーションフレームワーク-
http://ethna.jp/
SourceForge.jp: Project Info - Ethna
http://sourceforge.jp/projects/ethna/
0482nobodyさん
2006/09/06(水) 20:20:01ID:???$conditionがNULLでWHERE IS NULLとかいうSQLになっちゃう...。
$key, $key_type付きでwhere付きのgetはできるのに、getせずにインスタンスしたそのままでremoveしてもかわらず...
皆さんはちゃんとうごいてます?
0483nobodyさん
2006/09/07(木) 00:23:32ID:???なんかよくわからないけど、いままで変な挙動したこと無いから何か間違ってると思う。
AppObjectでgetしたっていうのがよくわからない。
AppManagerでgetObjectPropとかgetObjectListとかじゃなくて?
AppObjectでgetするのは、AppObjectのpropだけだよね。
新しく作りたいならnewだし。
0484482
2006/09/07(木) 16:25:20ID:???$key_type = array('userid', 'config');
$key = array($userid, $config);
$config1 =& new Test_Config1($this->backend, $key, $key_type);
$data['config'] = $config->get('config');
//$data処理
$config2_values = array(
'userid' => $config->get('userid'),
'config' => $data['config'],
);
$config2 = new Test_Config2($this->backend, NULL, NULL, $config2_values);
$config2->add();
$config1->remove();
とすると
クエリエラー SQL[DELETE FROM config1_tbl WHERE IS NULL]
のエラーで返されます
0485483
2006/09/07(木) 19:29:19ID:???まぁそれはおいといて。
$config2->add();
するなら、
$config2 = new Test_Config(&$this->backend);
$config2->set('userid', $user_id);
$config2->set('config', $data['config']);
$config2->add();
する方が良い。なぜなら、AppObjectをnewするときの第4引数は
全てのプロパティをセットする必要があるからな。2つのプロパティじゃなければ面倒でしょ?
あと、$config1->remove();でWHERE IS NULLは、Test_Config1の
primary_keyがAppObjectでちゃんと設定されて無いと思われる。
もう一度、appobjectのMappingをチェックするのが吉と、
0486nobodyさん
2006/09/07(木) 22:55:15ID:???してるのに何故
$config->get()
typo?
0487nobodyさん
2006/09/08(金) 10:48:28ID:???どうしても生SQLを発行する場面があると思うのですが、
AppObjectを使ったりSQLを書いたりするコードが混ざっていると
気持ち悪い(というか不適切なコード?)な気がします。
実際にEthnaを使っている方はどうされているんでしょうか?
0489nobodyさん
2006/09/09(土) 18:41:06ID:???どこに記述したいいのか、どこにファイルを置けばいいんでしょう?
どこに書いても、libやappにおいてもだめだし
携帯向けにsjisのページが作りたいとおもったけど開発ページにはoutputをどこにおいたらいいの書いてない...
0490nobodyさん
2006/09/10(日) 08:05:27ID:???もちろん、ここはチェックしたよな
http://www.ethna.jp/ethna-document-dev_guide-app-sjis.html
0491nobodyさん
2006/09/10(日) 19:35:53ID:???原因はIncludeパスがずれてたみたいです。
そこはみたんですけど、そのfunctionはどこに書いてどこにおいたらいいのかわからなくて。
0492nobodyさん
2006/09/15(金) 01:32:45ID:???ロードマップでは未到達かもしれないけど、コンスタントに
リリースしてくれたほうが嬉しい。というか、はやく2.1.2から
乗り換えたいので頼んます。。。
0493nobodyさん
2006/09/19(火) 08:05:38ID:???0494nobody
2006/09/19(火) 15:05:49ID:l653wI+U以下のサンプル通りにスクリプトを書いて動作させたけど、
json.tplがないよと怒られます。
流れとして、actionのFlare_Action_IndexCheckからviewのFlare_View_Jsonまでは、
分るけど、この先どこの.tplに、いくの?
http://labs.gree.jp/Top/Document/20060707.html
ヒント頂戴。
0495nobodyさん
2006/09/19(火) 17:21:16ID:???専用のmethodはないのでしょうか?
Ethna_RendarerのgetEngineとかいうのを使ってfetchするしかないのでしょうか?
0496nobodyさん
2006/09/19(火) 22:32:04ID:???tp://some.host/~foo/?action_login=trueというようにアクセスしてる場面を見受けるけどこれを
tp://some.host/~foo/loginみたいな形式に変えることは出来ないんかなぁ?
0497nobodyさん
2006/09/19(火) 22:37:17ID:R6sen3Jlそのメソッドは無いね。
フィルタ使ってob_で拾うとか、いろいろ手段はあるけど。
>>496
mod_rewrite使えば可能。
0498nobodyさん
2006/09/19(火) 23:22:06ID:???Ethna_Controller.php の ChangeLog にこんなのがある。
> Ethna_UrlHandlerクラスを追加(ステキurl対応)
これに期待する。
0499nobodyさん
2006/09/19(火) 23:27:54ID:gBF89jCS場合と、データベースに接続できなかった場合のエラー処理って
どこで行えばいいのでしょうか?
どちらもフレームワークに任せてしまっている部分の処理なので
いまいち解りません…orz
環境はPHP 5.1.6 + Ethna 2.3.0-dev(CVS)です。
0500nobodyさん
2006/09/19(火) 23:39:38ID:???試してないので恐縮ですが、json.tplを出力しようとしている
ということは、Flare_View_Jsonクラスのforward()をオーバー
ライドしていないのではないでしょうか?
0501496
2006/09/20(水) 00:53:00ID:???mod_rewriteを使えば確かに出来そうですね
何とかEthnaで頑張ってみたかったので
http://wasuren.blog67.fc2.com/blog-entry-17.html
を参考にしながらやってみたんですが
どうもうまく動かない。・゚・(ノД`)・゚・。
ちなみに公式に書いてある
http://ethna.jp/ethna-document-dev_guide-action-formname.html
は問題なく出来ますた。(・∀・)
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するのが一般的だと思う。
使うときは普通に使いたいところで使えばいい
■ このスレッドは過去ログ倉庫に格納されています