【PHPフレームワーク】Ethna【スケルトン自動作成】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/08/03(水) 21:00:39ID:TuHx69hTEthna -PHPウェブアプリケーションフレームワーク-
http://ethna.jp/
SourceForge.jp: Project Info - Ethna
http://sourceforge.jp/projects/ethna/
0655nobodyさん
2006/11/27(月) 22:25:04ID:???これでどう?
class Test_HogeManager extends Ethna_AppManager
{
var $hoge;
function Test_HogeManager(&$backend){
parent::Ethna_AppManager(&$backend);
$this->hoge = $this->config->get('hoge');
}
function abc()
{
echo $hoge;
}
}
0656nobodyさん
2006/11/28(火) 01:56:02ID:???var $hoge = $this->config->get('hoge');
が、PHPとして間違ってない?それとも俺が知らないだけ?
いつこの$hogeメンバはconfigのgetを実行するの?
0657nobodyさん
2006/11/29(水) 11:53:08ID:???で、なんとなく上手く動いているようなのだけど、
Notice: Only variable references should be returned by reference in /usr/local/share/pear/simpletest/simple_test.php on line 74
Notice: Only variable references should be returned by reference in /usr/local/share/pear/simpletest/simple_test.php on line 62
なる notice がでます(php.ini では error_reporting = E_ALL にしてます)。
エラーの意味はそのまんまですが、皆様の環境でも同様の notice が
でますでしょうか?
0658657
2006/11/29(水) 13:55:00ID:???authenticateを使わないprepareとperformだけのaction formで
$forward_name = $this->ac->prepare();
$this->assertNull($forward_name);
$forward_name = $this->ac->perform();
$this->assertEqual($forward_name, 'hage');
と記入すると両ケースともpassするけど>>657のnoticeとExceptionが4つでる。
エラー処理を全てthrow exceptionしてるのがいけないのかな?
0659657
2006/11/29(水) 17:29:08ID:???使わないようにしたらnoticeやExceptionは出ませんね。
SimpleTestとEthnaのどちらに原因があるのか分からないけど、
これらを改造するスキルは無いのであきらめるしかなさそうです。
0660nobodyさん
2006/11/29(水) 20:31:18ID:???Exceptionはcatchしてないだけじゃないの?
0661nobodyさん
2006/11/29(水) 22:21:59ID:???> NoticeはSimpleTestでしょう。
ですかね。
> Exceptionはcatchしてないだけじゃないの?
それは無いです(たぶん)。
テスト自体は成功するのですが余分なExceptionがでます。
今、例外をraiseErrorに書き換えようか激しく思案中・・・。
0662661=657
2006/11/29(水) 23:29:07ID:???任意のApplicationManager(仮にProject_FooManager.php)に
例外をthrowするだけのfunctionを追加
function thex() { thrown new exception ('exception test'); }
コントローラに追加(include & 'foo' => 'Foo',)
app/action/bar.phpのperformに
try {
$this->foo = $this->backend->getManager('foo');
$this->foo->thex();
} catch (exception $e) {
$this->ae->addObject(null, $e);
return 'error';
}
return 'bar';
これでちゃんとerror.tplが表示されます。
次にethna add-action-test bar
としてBarTest.phpに
// barアクションの実装
$forward_name = $this->ac->perform();
$this->assertNotEqual($forward_name, 'error');
と書くとテストにはパスするが他に4つほどEceptionが表示されます。
こんな感じです。
0663nobodyさん
2006/12/02(土) 13:29:39ID:???0664nobodyさん
2006/12/02(土) 13:34:12ID:???俺も同じくアクセスできないです
pear install http://ethna.jp/pear/Ethna-2.3.0.tgz
しても
Connection to `ethna.jp:80' failed: Success
サイトは見れるんですけどね
0665663
2006/12/02(土) 14:36:09ID:???0666nobodyさん
2006/12/04(月) 15:06:04ID:???ethna_renderer_smarty.setplugin(class/Ethna_Controller.php:1624): Does not exists. [ERROR CODE(1)]
というエラーが表示されます。
http://ethna.jp/ethna-document-dev_guide-misc-migrate_project.html
を見てやってますが、
依然としてこのエラーメッセージだけ解決できません。
ご助言プリーズ
0667nobodyさん
2006/12/04(月) 20:47:07ID:???renderer関連を見直しましょう。
0668nobodyさん
2006/12/05(火) 03:58:07ID:???0669657
2006/12/05(火) 19:37:00ID:???でなくなりました。テスト項目以外のExceptionが出るのは変わりませんが。
とにかく例外は利用できそうなのでほっとしました。
0670nobodyさん
2006/12/05(火) 23:11:23ID:???作り方次第では非常に簡単にできそうなのですが。
ちなみに確認画面とは、アクションを実行する前の、
一度本当に〜〜してもいいですか?みたいな感じの画面のことです。
自分が思いついた一番楽そうな方法は
・prepare()内で確認フラグがたってたら、returnで確認画面表示、
確認フラグがたってなかったら、アクション実行。
です。もっと楽そうな方法ってあるでしょうか?
0671nobodyさん
2006/12/07(木) 16:51:48ID:???値を取得するには、いちいち controller のインスタンスを取得して、Backendを
読み出して、getConfig()して…とやっていかなくてはいけないんでしょうか?
なんだかどんどんめんどくさくなっていきますね…。
0672nobodyさん
2006/12/07(木) 22:21:58ID:???0675nobodyさん
2006/12/08(金) 10:05:51ID:???自分で登録したキーぐらい覚えとけよと言われたらそれまでなんですが。
セッションに関するメソッドにはそれらしいのがなさそうですね。
[Ethna_Session] => Array
(
[0] => ethna_session
[1] => restore
[2] => isvalid
[3] => start
[4] => destroy
[5] => regenerateid
[6] => get
[7] => set
[8] => remove
[9] => isstart
[10] => isanonymous
[11] => _validateremoteaddr
)
0676nobodyさん
2006/12/08(金) 12:04:06ID:???0678nobodyさん
2006/12/09(土) 15:19:40ID:???ココを参考に
ファイルのアップロードプログラムを作っています。
単体ファイルなら上手く成功したのですが、
複数ファイル(配列)をアップロードしようとすると、
どうもform値としてわたっていないようです。
フォーム側では
<INPUT type="file" name="up_file[]">
ActionFormクラスで 'up_file'に
'type' => array(VAR_TYPE_FILE),
という指定を行ってます。
どこか誤りはあるでしょうか?
0679nobodyさん
2006/12/10(日) 15:03:52ID:???私もそれ知りたいですね、
今は$_FILEを直接使って逃げようかと思案中・・・
ethnaのメリットが下がりますが。
0680nobodyさん
2006/12/10(日) 21:35:54ID:???間違ってないと思う。
とりあえず、ActionClassで、
var_dump($this->af->get('up_file'));
ってしたらどうなる?
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:???フレームワーク使ってるともう->書きまくるのたるくてしょうがない
■ このスレッドは過去ログ倉庫に格納されています