【PHPフレームワーク】Ethna【スケルトン自動作成】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/08/03(水) 21:00:39ID:TuHx69hTEthna -PHPウェブアプリケーションフレームワーク-
http://ethna.jp/
SourceForge.jp: Project Info - Ethna
http://sourceforge.jp/projects/ethna/
0681nobodyさん
2006/12/11(月) 18:58:01ID:???当然だよな
0683nobodyさん
2006/12/12(火) 04:16:06ID:???FILEはそもそもが配列なので、そこんとこでethnaがなんか変なことになっていた気がする
オレはethnaに適当にパッチ書いて動くようにしてしまった
0685nobodyさん
2006/12/12(火) 09:29:08ID:???683じゃないけど。
Ethna_ActionForm.phpの533行目辺り
foreach (array_keys($form_vars) as $key) {
// 値が空かチェック
if ($type == VAR_TYPE_FILE) {
if ($form_vars[$key]['size'] == 0
|| is_uploaded_file($form_vars[$key]['tmp_name']) == false) {
この辺やね。
$form_vars[$key]['size']しか使って判定してないんで、Arrayの時はこけるね。確かに。
0686nobodyさん
2006/12/12(火) 14:04:54ID:???>>685 もその前にis_arrayしてるから問題ないし。
0687nobodyさん
2006/12/12(火) 17:06:29ID:???かけることが可能ですが、この関数をひとつのファイルに収めて各フォーム
で共有することは可能でしょうか?
function _filter_str2upper($value)
{
return strtoupper($value);
}
こういう細かい関数をいっぱい定義しているのですが、各ページに書くのも
手間なので・・・
0688nobodyさん
2006/12/12(火) 17:57:01ID:???0689nobodyさん
2006/12/12(火) 18:00:26ID:ymrP8Ip7俺が問題に対処してたバージョンは2以前だったけど、
さすがに678さんがそんな古いバージョンを使っているとは思えんし、
なんか別原因と考えたほうがよさそーね
0690687
2006/12/12(火) 19:35:37ID:???なるほど。
{Project_ID}_ActionForm.php に書いておけば良いのですね。
ありがとうございました。
0691nobodyさん
2006/12/14(木) 22:19:50ID:???0692nobodyさん
2006/12/15(金) 01:52:12ID:???0693nobodyさん
2006/12/15(金) 09:19:35ID:???・新規(new new_do)
・更新(update update_do)
・削除(delete delete_do)
の6画面が1テーブル毎に毎回必要になります。
importform() exportform()があるので
コーディング自体はそれほど苦ではないのですが
テンプレートの枚数が多くなって鬱になってきます。
上手くまとめる方法ないのでしょうか・・
0694nobodyさん
2006/12/15(金) 10:03:40ID:???ねーなw
0695nobodyさん
2006/12/15(金) 10:44:48ID:???0696nobodyさん
2006/12/15(金) 14:25:35ID:dxQfzRiehttp://blog.as-roma.com/BoBlog/index.php?itemid=1267
0697nobodyさん
2006/12/16(土) 00:15:34ID:???ethnaを使おうと思うのですが、
CGIでPHPを動作させたい場合、
プロジェクト名/www 内を.cgiにするだけでいけます?
0700nobodyさん
2006/12/16(土) 03:22:58ID:???0701nobodyさん
2006/12/16(土) 03:25:51ID:???Actionだけ作成して、みたいな感じですかね。
ethnaでやるメリットが少なそうですが。
0703nobodyさん
2006/12/16(土) 11:46:54ID:???バッチ処理とかに使ってる人もいるんじゃないかな。
>>699
揚げ足取ってないで、自分は理論上どうなると思ってるのか書きなよ。
700の言うとおり、理論上ならどうにでもなる。
0705nobodyさん
2006/12/16(土) 12:48:08ID:???Webの方でAppManager類が充実してきてて、CLIでもDB処理したいなーと
思う時は使います。あと、メールの送信とか楽だし。もちろん、Viewレスの
ActionClass::perform()のみね。
>>699
理論上でできないと思ったらそのワケを。
実践してできなかったら、どこで詰まったかを書けばいいんじゃないの?
0706nobodyさん
2006/12/16(土) 15:32:44ID:???似たような種類のデータを扱うとき、
そのデータ名のID(?)って変えますか?
例えば、苗字データと名前データを表示するアクション、テンプレをそれぞれ作る場合、
それぞれのアクションで
$this->af->setApp('myouji_data', $myouji)
$this->af->setApp('namae_data', $namae)
と名前を分けますか?
私はそのつど対象のデータによって分けているんですが、
テンプレが似通ってる場合、.tplの{$app.***}の***の部分をいちいち
変更するのが非常に手間に感じます。
$this->af->setApp('data', $myouji)
$this->af->setApp('data', $namae)
としておけばほぼテンプレの変更は必要なくなるわけで。
一方で、分けておくと、ミスなどに気づきやすくなります。
普通の人はどうしてますでしょうか?
自分は完全独学なのでこういうコードデザインなどにひどく悩みます。
0707nobodyさん
2006/12/16(土) 21:01:30ID:???内容にまとまりがある部分は
配列でまとめて渡すのが良いんだろうけど。
0708nobodyさん
2006/12/17(日) 01:34:22ID:???テンプレート内で呼び出されるテンプレートにしちゃって
$this->af->setApp('myouji_data', $myouji);として
smartyなら{include file="hoge.tpl" data=$app.myouji_data}で
{$data}とかするのは?と言おうとしたけど
EthnaはテンプレートにViewクラスが個別に作れるんだから
$this->af->setApp('data', $myouji);
で良いと思った。
個人的には、dataは名前が不意に衝突しそうでいやだ
$person = array('myouji' => $myouji, 'namae' => $namae);
$this->af->setApp('person', $person);
とか、他のViewでも使う時に名前変えないですむ意味のある名前つけたいところ
0709nobodyさん
2006/12/23(土) 19:38:14ID:???0710nobodyさん
2006/12/23(土) 23:49:18ID:gjDqizfh0711nobodyさん
2006/12/24(日) 00:37:30ID:???0712nobodyさん
2006/12/24(日) 01:05:05ID:???0713nobodyさん
2006/12/24(日) 14:19:52ID:???0714nobodyさん
2006/12/25(月) 11:12:56ID:???ActionClassのperformメソッドにはあまり処理内容を書かず、AppManagerに
ロジックを書くことを推奨していたと思います。
しかし、ビジネスロジックの中にはサイトの中で一度しか呼ばれない
処理が多く、AppManagerがどんどん膨らんでいきます。
こういう場合もperformにビジネスロジックを書くのってやはり推奨されないんでしょうか?
一度しか呼ばれない処理なのにいちいちAppManagerクラスを見に行かねば
ならないのは、返って可読性を落とすような気がするのですが・・・。
0715nobodyさん
2006/12/25(月) 11:38:53ID:???程度問題かな。ActionForm値に依存しすぎる場合はAppManagerじゃなくて、
基本のActionClassに記述してそれを継承。
それでも自分はAppManagerに書くことのほうが多いです。
後で別どころで使う可能性もあるので。
または、「とりあえず」performに記述しておいて、後で「あ、前のを使う」と思えば、
その時にAppManagerに移植とかも結構やる。
ただ、一人ならいいけど複数人開発の場合は基本設計をちゃんとしないと混乱するよね。
0716nobodyさん
2006/12/25(月) 11:55:23ID:???どうもです。
現在一人で開発してまして、引き継ぐ人があらわれたとしても複数人での開発には
ならない規模の社内アプリです。
現在は極力AppManagerに書いてますが、ツール的なものはいいとして、ビジネス
ロジックは共通化できそうなのが少ないので迷ってきました。
「とりあえず」performに書いて汎用的に使えそうなのは抽出していくって言うのも
よさそうですね。
ちょっとこの路線でやってみます。
0717nobodyさん
2006/12/27(水) 19:43:12ID:???結局、
header(Location: /?action_hoge=true);
とかしてるけど。
UrlHandlerの使い方がまだよくわからん。
0718nobodyさん
2006/12/27(水) 20:24:34ID:???呼びたくなっちゃう事自体が設計ミスらしいですよ。
処理を別クラスに作成して、それを共通で呼び出すようにした
方が良いかと。
0720nobodyさん
2006/12/28(木) 00:33:39ID:???ttp://dozo.matrix.jp/pear/index.php?Framework%2FEthna%2Faction
こんなのも見つけてまいりました。
0721nobodyさん
2006/12/28(木) 01:07:43ID:???>アクション内で別のアクションに飛ばしたいときはどうしたらいいんでしょ...
すません。これ、私はこういうことを思ったことは無いんですが、
具体的にどうゆう場合にこういうことをしたい!!と思うんでしょうか?
なるだけ具体的に書いてくださると、
「その場合は、***をViewに集めれば良いじゃん」
とかレスしますんで、よろしく。
0722721
2006/12/28(木) 01:09:30ID:???ということなんで、ActionClassも自動的に似通ったものになり、やっぱり
ActionClassの継承を使って
parent::perform();
をくし島t食っています。
0723717
2006/12/28(木) 12:14:25ID:???ありがとうございます。
0724nobodyさん
2006/12/28(木) 14:52:35ID:???持たす方法は無いでしょうか。
0725nobodyさん
2006/12/28(木) 16:24:21ID:2NQtv/LQ実行するようなものも作れます?
フレームワークのイメージ自体がちょっとできてないんですが…
0726nobodyさん
2006/12/28(木) 18:21:33ID:???出来るみたいです。
http://labs.gree.jp/Top/Document/20060707.html#h3954b09
ゲートウェイシステム
ゲートウェイシステムとは,単純にいうとコントローラをゲートウェイとして利用して,
通常のブラウザからのリクエスト,コマンドラインからの実行,XMLRPCなど
(現バージョンでサポートされているのはこの3つです)のリクエストを全て「アクション」として
処理するための機構です
index.phpじゃなくて、コマンドライン用のヤツを作ればいいのかな?
0727nobodyさん
2006/12/29(金) 00:16:43ID:???または
ethna add-action -g=cli
0728nobodyさん
2006/12/30(土) 00:32:59ID:???APPID_ViewClass.phpの中で
$this->af->setAppしてもテンプレで使用できないんですが、
これは仕様?
0730728
2006/12/30(土) 17:57:25ID:???内で指定するんですよね?
PHP4でもいけますか?
0731721
2006/12/30(土) 22:27:30ID:???>function _setDefault(&$renderer)
>内で指定するんですよね?
違う。preforward()
Viewクラス全部にデフォルトで適用させたい場合は
_serDefaultだけども、$rendererから$smartyを取り出して
その$smartyにassignする。
取り出し方はRenderer
$smarty =& $render->getEngine();
function _setDefault($renderer)
{
$smarty =& $render->getEngine();
$smarty->assing('test', array('hoge' => 'uki'));
}
とかかな。多分
0732nobodyさん
2006/12/31(日) 15:53:49ID:???_setDefaultは、
$renderer->setProp('test', array('hoge'));
でできるよ。
0733nobodyさん
2007/01/01(月) 03:52:43ID:???特定のエスケープ関数(例えばmysql_escape_string)を賭けたい場合、
app下のAPPID_ActionClass.phpに組み込めば簡単かと思うのですが、
特定のアクション(またはフォーム値)に対しては
mysql_escape_stringをかけないようにする良い方法が思いつきません。
元旦早々ですが、良いアイデアありましたらお願いします。
0734nobodyさん
2007/01/01(月) 05:19:28ID:???action内でうまくAPPID_ActionClass.phpが継承されない。
ためしにAPPID_ActionClass.phpのperform()内で
echo "エコーされるか?";
としてみたが一切認知されてないっぽい。
同じような人いませんか?
0735nobodyさん
2007/01/01(月) 17:22:12ID:???Ethnaに限った話しでは無いのですが、クラスのオーバーライドという概念を
調べてみてください。
「PHPの薬箱」って本のクラスの説明が解りやすいので、機会があれば
見てみると良いと思います。
0736nobodyさん
2007/01/01(月) 21:13:24ID:???ってところのキガス
0737nobodyさん
2007/01/01(月) 21:44:04ID:???中でオーバーライド(処理無しの空メソッドを作るだけ。)すれば良いので
>>733 のような質問は出ないのではなかろうか・・・。
app/actionの下に作成されている、アクション達はみんな app/APPID_ActionClass.php
を継承しているということに気づいてないかな?
0738734
2007/01/03(水) 21:03:27ID:???0739734
2007/01/03(水) 22:06:08ID:???APPID_ActionClass.phpのauthenticate() は機能します。
APPID_ActionClass.phpのprepare(),perform()機能しないとです・・・・
0740nobodyさん
2007/01/03(水) 23:40:00ID:???0741734
2007/01/04(木) 00:25:50ID:???オーバーライドされてただけの話でした・・・
orz=3
メソッドのオーバーライド(上書き)というより,
加え書き、みたいなのってないですよね・・・
ある一定部分までは同じで、アクションによってちょっとだけ
違う処理を付加する、っていう場合は
appmanager使うとかしかないですかね・・・
0742nobodyさん
2007/01/04(木) 03:23:40ID:???function perform()
// 処理
return parent::perform();
}
みたいにするか、
処理が異なる部分のみ切り出してテンプレートメソッド風にするとか。
0743nobodyさん
2007/01/04(木) 17:27:26ID:???それともそれぞれのアクションクラスを作ってフォームのaction属性として連携させるんでしょうか。
0744nobodyさん
2007/01/04(木) 23:58:29ID:???Mojaviは知らないし「入力用」「実行用」は色んな意味に取れて
具体的にどの処理を指してるのか解らないけど
1.画面に入力
2.登録ボタン押下
3.DB更新処理
4.結果表示
という、良く行われるであろう画面を作る場合、自分的には
/app/action/アクション
function prepare()
{
入力チェック
}
function perform()
{
DB更新処理
※(処理が大きくなりそうだったり、他の処理と共通化出来そう
だったら「アプリケーションマネージャ」で別クラス化。
処理がちょっとで済みそうだったら直書き。)
}
/app/view/ビュー
function preforward()
{
画面表示に必要な値を取得する処理。
例)
・現在時刻取得
・コンボボックスの内容をDBから取得
}
こんな感じ。
0745nobodyさん
2007/01/04(木) 23:59:39ID:???ttp://ethna.jp/ethna-document-dev_guide-appobj-manager.html
0746nobodyさん
2007/01/06(土) 08:36:33ID:???画面を作りたいのですが、アクション設定する入力チェックはどうやったら
動的に変更出来ますか?
アクションの
function prepare()
の中で
$this->af->validate()
する前に、DBを読んで動的に入力チェックを行う事が
出来ますでしょうか?
0748nobodyさん
2007/01/06(土) 15:46:33ID:???↑これは、もっと評価されるべきじゃないの?w
0749nobodyさん
2007/01/12(金) 23:14:55ID:l7BIz4fN0750nobodyさん
2007/01/12(金) 23:36:56ID:???PHP5+Ethna2.3.1です。
単純化した例で申し訳ないんですが、
/*マネージャ*/
class Nichan_MonaManager extends Ethna_AppManager{
function giko(){
//いろいろ処理して、とりあえず・・・
$neko = "にゃ〜";
}
}
/*コントローラ*/
var $manager = array(
'Test' => 'Mona',
);
/*アクション*/
class Nichan_Action_Index extends Nichan_ActionClass{
function perform(){
$this->Test = $this->backend->getManager('Test');
$this->Test->giko();
$this->af->setApp('neko', $neko);
return 'index';
}
}
/*テンプレート*/
{$app.neko}
0751750
2007/01/12(金) 23:37:28ID:???Call to a member function giko() on a non-object
というエラーが出ます。
クラスとか初めて使うので、何かが根本的に間違ってる気がするんですが、
自分では気が付けず。
どなたかご指導お願いします。
0752750
2007/01/13(土) 01:19:54ID:???コントローラのvarは不要、
アクションで
$this->Mona = $this->backend->getManager('Mona');
$neko = $this->Toppage->giko();
$this->af->setApp('neko', $neko);
で出来ました。
Ethnaのドキュメント、新旧入り乱れてて分かりづらいよ・・・
0753721
2007/01/13(土) 13:48:05ID:???>コントローラのvarは不要、
だね。2.3以降は$managerメンバを使う必要が無くなってるから。
Managerを呼び出す方法は幾つかあるみたいだけど、
基本的に自分も>>750と同じ方法でやってる。
あと、PHP5だとAppManager/AppObject/ActionClass/ViewClassでは
$this->backend->getManager('Mona')->giko();
で行ける。2段階にしなくてもオK。
自分は
$this->backend->getManager('Mona')って長いのが嫌なので、上記の4つの
クラス全部にgetM()というメソッドを追加して
$this->getM('Mona')
とかしてる。
0754721
2007/01/13(土) 13:58:50ID:???あと、アクションで$this->MonaってやってMonaメンバに
Managerを保存してるみたいなんだけど、EthnaのgetManagerは
(というよりFactory?)一度newしたManagerは使い回してくれるので
何度もgetManagerしてOK。ViewでもActionでも同じインスタンスを
使ってくれる。
0755nobodyさん
2007/01/14(日) 11:09:33ID:???フレームワーク使ってるともう->書きまくるのたるくてしょうがない
0757nobodyさん
2007/01/14(日) 14:46:24ID:???0758750
2007/01/14(日) 23:00:46ID:???おっしゃるとおり、1段階でも出来ました。スゴス
2段階も長いけど、1段階でもまだ長いっすよね。
そのgetM()メソッドというやつ、デフォで組み込んでて欲しいとか思ってみたり。
ちなみに、MonaメンバにManagerを保存してたのは、
$thisの使い方が分かってなかっただけです。
今もあんま分かってないですが。
Ethna使いながらオブジェクト指向とかも勉強しようかなって感じです。
いま、非FWで作りかけてたものを移植してるんですが、
使えば使うほどFWの便利さが身にしみますね。
0759nobodyさん
2007/01/15(月) 01:59:38ID:???これの使い方が解ったら、FWの便利さが飛躍的に上がる。
0760nobodyさん
2007/01/15(月) 02:02:42ID:???0763nobodyさん
2007/01/15(月) 22:26:13ID:???>>この中の$action_mapを設定することでUrlHandlerが利用できます。デフォルトではなにもしません。
何でデフォルトで何もしないんだろう?
こんなんはsymfonyみたいにスケルトンを作成した段階で
自動的にアクセスできるようにすればいいんジャマイカ?
上記の例で行くと ethna add-action echo_msg ってやった瞬間に
/echo/msgでアクセスできるようにしたほうが便利なのでは?
0766nobodyさん
2007/01/18(木) 04:05:03ID:???数が多いんで、app/managerとかのディレクトリに入れることは可能?
ただ入れるだけだと、Fatal errorが出るんだよね。
どこを弄れば、読み込んでくれるのでしょうか?
0767nobodyさん
2007/01/18(木) 11:20:20ID:???コントローラの上のほうで、
/** include_pathの設定(アプリケーションディレクトリを追加) */
$app = BASE . "/app";
$lib = BASE . "/lib";
$manager = $app. "/manager";
ini_set('include_path', ini_get('include_path') . PATH_SEPARATOR . implode(PATH_SEPARATOR, array($app, $lib, $manager)));
とかしてやれば動くんじゃない?
確かめてないけど。
0770764
2007/01/21(日) 04:53:17ID:???俺も柔軟な方法があったら知りたいんだがw
とりあえずはUrlHandlerのgetInstanceメソッドをオーバーライドして
アクションのマッピングが見つからなかった時に
マッピング設定をするようにしたら出来るよ
当然値を自動的にセットはしないし
(ルール設けてデフォルトのマッピングをそう生成すればいいんだけど)
smartyのurl関数とかも使えないんじゃないかと思う
俺の場合は元々そこら辺をフォローするマネージャとか作ってあったから
どっちも使えるようマージするだけでよかったんだけどね
0771769
2007/01/21(日) 11:31:55ID:???めんどくさいなぁ
例えばスケルトンを作成する際に-url等のオプションをつければ
【利用者が何も意識しなくても】 ステキURLでアクセス出来るようにして欲しいな。
つまり>>763の例で行くと
ethna add-action -url echo_msg
↓
特に設定を変更することなく /echo/msg でアクセス
↓
(゚д゚)ウマー
0772764
2007/01/21(日) 15:51:48ID:???無い袖は振れんのだ
しょうがない
一応、UrlHandler自体もうちょっとどうにかしようという流れはあるみたいだし
それに期待じゃないかね
俺は足りない部分はさくっと追加しちゃって後は本家の実装待ちみたいな感じだw
上記の変更も実質数行足すだけだったし
不満はあるけどEthnaは改造しやすくていいんだよねぇ(俺でも改造の道筋がすぐ見えるという意味)
0773nobodyさん
2007/01/21(日) 22:50:42ID:???validate()した後、エラーがある場合の
遷移先を自動的に指定したいのです。
フォーム値に渡す方法しか思いつきませんでした。
もっと簡単な方法があったらおながいします
0774nobodyさん
2007/01/22(月) 10:55:40ID:grOsWXoXセッション使うことにこだわらなければ、セッション使う。
ViewClass::forward()のオーバーライドでその決定後のactionを保存。
っつーか、>>773の1つ前というのが、1リクエスト前のactionという意味ならだけど。
そうではなく、PHP内の内部処理内でって言うなら、PHP5限定で現在のActionClass名
__CLASS__からActionNameを解析するしかないな。
解析はViewClassのメソッドに付け加えて、validate()でエラーが出た際はerror_viewとか適当な
クラスを作ってそこでジャンプ。
んー。Backendクラスもオーバーライドしないといかんかな。
0775nobodyさん
2007/01/23(火) 23:33:59ID:OL4nj+JT$tests= array("1"=>"さいしょ","2"=>"つぎ","3"=>"さいご");
$this->af->setApp('tests',$tests);
としておいて、
tplで、
{select name=test_select empty="選択してください" list=$app.tests}
と、してるんだが・・
出力が、
<select name="test_select">
<option value="">選択してください</option>
<option value="1" >ぜ/option>
<option value="2" >ぜ/option>
<option value="3" >ぜ/option>
という、わけのわからない化け方をするし、
最初の一文字しか出てこないし、なんだかわかりません。
どう解決すればよいか、力をお貸しくださいませm(_ _)m
0776721
2007/01/23(火) 23:40:30ID:???最初の一文字しか出てこないのは、多分PHPにおいて文字列も配列として
認識されるのが影響してると思う。
例えば、
$str = "abcde";
echo $str[0];
とすると、aって出る。
これを$strがマルチバイトの場合でバイト欠損になってるんだと思う。
0777775
2007/01/23(火) 23:50:58ID:???そ、そうなの??
若干Ethnaから離れて大変申し訳ないですが。。
もしそうだとすると、配列を渡すようなsmarty_functionのselectとかcheckboxとか、
全滅ってことになるよねぇ??
0778nobodyさん
2007/01/24(水) 00:43:32ID:???0779775
2007/01/24(水) 00:52:45ID:???print_rで配列出すとブラウザ上に
Array ( [1] => さいしょ [2] => つぎ [3] => さいご )
って中身が出てるので。
0780778
2007/01/24(水) 00:59:51ID:???そのプラグインの中で値がどうなってるか調べれば委員で内科医。
■ このスレッドは過去ログ倉庫に格納されています