【PHPフレームワーク】Ethna【スケルトン自動作成】
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
2005/08/03(水) 21:00:39ID:TuHx69hTEthna -PHPウェブアプリケーションフレームワーク-
http://ethna.jp/
SourceForge.jp: Project Info - Ethna
http://sourceforge.jp/projects/ethna/
0844こんな藤本神は嫌だ
2007/03/14(水) 15:25:49ID:???0845nobodyさん
2007/03/14(水) 15:28:55ID:???0846nobodyさん
2007/03/14(水) 18:58:02ID:???0847nobodyさん
2007/03/14(水) 23:56:44ID:???0848nobodyさん
2007/03/16(金) 00:48:50ID:???/ \
/ ─ ─\
/ (●) (●) \ 「カワユスナァ、カワユスナァ」・・・・と
| (__人__) | ________
\ ` ⌒´ ,/ .| | |
ノ \ | | |
/´ カタ. | | |
| l カタ | | |
ヽ -一ー_~、⌒)^),-、 | |_________|
ヽ ____,ノγ⌒ヽ)ニニ- ̄ | | | ____
0849nobodyさん
2007/03/16(金) 23:20:57ID:???http://ethna.jp/ethna-document-dev_guide-appobj-overview.html
には
....
$prop_defメンバには、フィールド定義を記述します。
今のところ、スキーマの自動取得は対応していません(有った方がいいですかねー?)。 Ethna-2.3.0では自動取得されるようになりました。
....
とあって、多分これ
http://ethna.jp/pipermail/users/2006-January/000165.html
あたりがマージされてるのかと思ったんですが
ethna add-app-object sometable
としてもpropdefは空で何も無いですよね?つーかskel.app_object.php自体がテーブル名以外は作られそうに無いし・・・
DBからスキーマを自動取得してマッピングされたAppObjectを生成するのは特別な方法があるんでしょうか?
0850nobodyさん
2007/03/17(土) 00:50:06ID:???の使い方がリファレンス見ても良くわからんのですが、
$form = $this->af->get('test');
$form_array = $this->af->getArray();
で、
$form_array['test'] と $form は等しくなる、
という考えて間違ってますでしょうか?
なぜかうまくいかないので間違ってる気がするのですが。
0851nobodyさん
2007/03/17(土) 01:26:51ID:???prop_defは省略できる
最初のDBアクセスでテーブル定義を取得して、
/tmp/cache/default(だったかな?)にseriarizeしたものが保存されるようになってる
でも、prop_def自動定義も欲しいところだな
藤本神もいちい氏もAppObjectを改良したいみたいなこと言ってるから、そのうち(相当先だろうけど)変わるかもしれない
0852nobodyさん
2007/03/17(土) 03:37:48ID:???>/tmp/cache/default(だったかな?)にseriarizeしたものが保存されるようになってる
PHP5以降な。
0853nobodyさん
2007/03/17(土) 19:32:51ID:???なんだかなぁ。
0854nobodyさん
2007/03/17(土) 21:37:37ID:???不毛だ・・・
0855nobodyさん
2007/03/18(日) 08:17:38ID:???> 現在はすっかり飽きている様子。
依存症かよw
0856nobodyさん
2007/03/20(火) 17:22:43ID:???appManagerから別のappManager呼び出したい時って
どうやってするんでしょうか?
0857nobodyさん
2007/03/20(火) 17:42:03ID:???普通に
$this->backend->getManager('hogehoge');
とかでできるんじゃないか?
0858856
2007/03/21(水) 23:53:28ID:???あ、単純にtypoしてただけでした・・
1回やってみただけでこれじゃだめなんだと決め付けてました。
$this->backend->getManager('hogehoge');
で行けました。ありがとうございました。
0859nobodyさん
2007/03/22(木) 17:24:28ID:????action_edit=true&id=1
と指定された際にDBからid=1のレコードを取得($row)して
$this->af->setApp('name', $row[name]);
したものを
name:<input type="text" value="{$app.name}">
とフォームに表示して修正、と言った感じの場合に、
validate()に引っかかって再修正とか、「修正しました」とメッセージを表示してまた同じようにフォームを表示と言った処理をしたい
場合は毎回
$this->af->setApp('name',$this->af->get('name');
と書いて回るのが普通なんでしょうか?
それとも、最初に表示する際に
$this->af->form_vars['name'] = $row[name];
と直接代入してしまって($af->setForm()って無いですよね?)
name:<input type="text" value="{$form.name}">
と処理してしまって良いものなのでしょうか?
0860nobodyさん
2007/03/22(木) 18:48:43ID:???0861nobodyさん
2007/03/30(金) 18:17:00ID:???入力画面表示を
action_add
としたら、そこからPOSTしてDB登録する動作を
action_add_do
にした場合、ActionFormの中身って両方(Add.php,Add/Do.php)に同じものを書くしか無いんでしょうか?(Do.phpのprepare()でvalidate()する)
add.tpl内で{input_name="form_a"}とか使わないで全部<input type=text name=form_a value={$form.form_a}>
とか書いていけばDo.phpだけにActionForm書くだけでも問題は無いですけど・・・
0863nobodyさん
2007/03/30(金) 19:09:22ID:???add-view action_add
して、その中で
var $helper_action_form = array('action_add_do' => null);
する。
0864863
2007/03/30(金) 19:14:21ID:???{form ethna_action="action_add_do"}
{form_input name="form_a"}
{/form}
とか書けば、Viewの省略も可能。
0865861
2007/03/30(金) 20:17:37ID:???取り合えずEthna始めたばかりなのでなるべくコアは弄らないで試してみようかなと。
私はあまりに面倒だったので簡単な書式のテキストからActionForm形式のarrayを吐き出すスクリプトは作ったんで毎回指定しても良いんですけどねぇ。
なんか二度手間は気持ち悪いというか。
>>863
なるほど、使用するActionFormを指定することが出来るんですね。
有難う御座います。
ところでSELECT,CHECKBOXなんかで
$form=array(
'managers'' => array(
'type' => VAR_TYPE_INT,
'form_type' => FORM_TYPE_SELECT,
'name' => '担当者',
'option' => array(),
),
);
なんてのを定義して、リストは
function prepare() {
...
$res = $db->getAll("SELECT id,name FROM managers");
$options = array('0'=>'--');
foreach($res as $r){
$options += array($r['id']=>$r['name']);
)
$this->af->form['managers']['options'] = $options;
return null;
}
の様に動的にDBから取って来る、ってのも良くあるパターンだと思うんですがこう言う処理はAppManagerにして使いまわすのが流儀ですかね?
なんか、物凄いありがちでフレームワークによきに計らって貰いたいselected,checked処理関連がマニュアルから良さ気なのが見つけられ無かった・・・
0866863
2007/03/30(金) 21:22:18ID:???optionの指定は、配列指定する他に2種類あって、
array(
==snip==
'option' => 'managers'
)
こう指定してやると、ActionFormにmanagersメソッドがある場合は、その返り値がoptionに入る。$af->managers = array()みたいに、直接配列が入っていてもOK
そして、'option' => 'man, managers'としてやれば、AppID_ManManagerのgetAttrListが呼ばれる。
$man->getAttrList('manager');のように呼ばれるから、
manのgetAttrListをオーバーライドしてやる。
デフォルトだと、manの変数 $managers_list を参照しようとするから、DBかませたいときは、getAttrListのオーバーライドが一番手っ取り早いかな
ブラウザのフォームで書いてるからtypoあるかもしれない、適宜脳内変換して読んでください。。
ちなみに、ActionFormの定義は、BoBppさんのビルダが便利。
http://as-roma.com/ethna/formBuilder/
0867nobodyさん
2007/03/31(土) 03:05:42ID:???呼び出すとき、どう記述すればいいでのしょうか?
例:
class Hoge_AbcManager extends Ethna_AppManager
{
function Hoge_AbcManager( $watasitai_var )
{
通常の方法ではコンストラクタに渡す変数を指定できませんよね?
$HOGE_m =& $this->backend->getManager('Hoge');
0868nobodyさん
2007/03/31(土) 09:04:45ID:???0869nobodyさん
2007/03/31(土) 10:03:27ID:???コンストラクタに渡したいって変数なら、アクションやビューに
依存しない変数だよね。managerを呼ぶ時に常に行う処理ってことだから。
で、そういうのはbackendに詰めるでしょ。
すると、そもそもmanagerはbackendを持ってるから
$this->backend->ってやればコンストラクタで変数取れるじゃん。ってことだと思う。
やるなら、backend::getManagerをオーバーライドして、ってなるんだろうけど
ただのバッドノウハウになるね。
0870nobodyさん
2007/03/31(土) 12:22:34ID:???class Sample_Form_AddDo extends Sample_Form_Add
俺はこうしてる。
0871nobodyさん
2007/04/04(水) 18:42:23ID:???それって勝手にそれぞれのDo.php等の中で
例えばAdd/Do.php内で
require_once 'Add.php';
して?
うーむ、更にModify,Modify_Doとかでも使いまわすことを考えるとそれも現実的かなぁ・・・
0872nobodyさん
2007/04/04(水) 21:23:16ID:???870じゃないが、このやり方は確か藤本氏がサンプルでやってた方法だったかと。
ひとつ上のクラスだったら
require dirname(__FILE__).'.php' でおk
別のクラス呼ぶなら、直接ファイル名記述。
0873nobodyさん
2007/04/16(月) 15:15:35ID:KZll3+phWindowsXP + IIS にEthnaをインストールしようと
「アプリケーション構築手順(1) 」に従って
インストール、スケルトン作成まで終わったのですが、
index.phpを指定してもブラウザに表示されません
何が悪いのでしょうか?
アドレスは
http://localhost/sample/www/index.php
と指定しています
0874nobodyさん
2007/04/16(月) 23:03:05ID:ty8BPgJH0875nobodyさん
2007/04/17(火) 02:22:21ID:???> 何が悪いのでしょうか?
>初心者ですが
>WindowsXP
>IIS
>http://localhost/sample/www/index.php
この4つかな。
0877nobodyさん
2007/04/24(火) 01:57:17ID:XNYrKVIb昔作ったプログラムからEthnaへ遷移したいんだけど、session変数が渡せなくて、挫折気味・・・
0878nobodyさん
2007/04/24(火) 02:45:37ID:???んー、「昔作ったプログラム」のセッションIDの付け方がまちまちだとダメだね。
でないなら、Ethna_Sessionを自前のクラスでOverrideさせて、
SessionIDを決めるロジックだけそのIDで上書きすればOK。
あとは、ActionClassでセッションをスタートさせれば普通に取れるはず。
0879nobodyさん
2007/04/24(火) 11:13:37ID:???ありがとうございます!
「昔作ったプログラム」では、session_start()だけでID決めてるんで、IDはまちまち・・・だと思います。(この辺よく理解していないですが)
Ethna_Sessionのロジックがよくわからない初心者なので、とりあえず
�@クッキー($_COOKIE["PHPSESSID"])からセッションID取得して、
�Asession_id()でセッションID設定して、
�B「昔作ったプログラム」で保存されたディレクトリのセッションファイルと照合
って流れにムリクリしてるんですが、
�@でクッキーが取得できず・・・なぜだろう・・・、
0880nobodyさん
2007/04/24(火) 19:10:42ID:/+uAa599いつの間にか消えてたんだけど、$managerってobsoleteな仕様なの?
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/ethna/ethna/skel/app.controller.php?r1=1.21&r2=1.22
0881878
2007/04/25(水) 02:11:01ID:???SessionIDの言い方がマズかった。というか、間違った。すまん。
PHPSESSIDならそれをEthna_SessionのセッションIDのキーにしてやる。ということ。
デフォルトではEthnaはHoge_Controllerとか使ってる場合=HogeがアプリケーションIDの
場合、HogeSESSIDをセッションIDのキーに使う。PHPのデフォはPHPSESSIDだね。
で、この「HogeSESSIDをセッションIDのキーに使う」っていうロジックをOverrideさせろ
っていうこと。
ControllerでセッションのクラスをEthna_SessionからHoge_Sessionに書き換えて、
class Hoge_Session extends Ethna_Session{
function Hoge_Session($appid, $save_dir, $logger)
{
$this->session_name = "PHPSESSID";
//あとはEthna_Sessionのコンストラクタと同じのをコピペ
// もちろん、一行目は抜かせよ。w
}
}
0883nobodyさん
2007/04/28(土) 22:48:15ID:???$this->backend->ctl->getRenderer()->getEngine()->clear_all_cache();
とかをアクション、ビュー、コントローラ辺りに書いてみたんですが無効にならんとです。
Smarty単体なら
http://sky.freespace.jp/smarty/SmartyManual_2-6-7J_html/api.clear.all.cache.html
で出来るとですがEthnaが絡むと出来んとです。
どうかEthnaでのやり方を教えて欲しいとです。
0884nobodyさん
2007/04/29(日) 12:40:34ID:???0885nobodyさん
2007/04/29(日) 12:46:44ID:???セッションキーを指定せずに、session_start()してるならそのままEthna内でも使えるはず
恐らくEthnaが内部でセッションの保存先が元アプリのと違うんじゃない?
0887nobodyさん
2007/04/30(月) 18:59:50ID:???0888nobodyさん
2007/04/30(月) 20:08:50ID:???0889nobodyさん
2007/05/06(日) 20:44:18ID:???0890nobodyさん
2007/05/08(火) 03:03:53ID:???AppObject使いたくないからadodb使うんじゃないの?
0891nobodyさん
2007/05/10(木) 00:32:00ID:???前に誰か挑戦してたなーと、ブックマークを漁ってたら出てきました。
http://riaf.org/Test_DB.phps
作者のriafさんも、途中であきらめたとか言っていたような気がするので、もしかしたら使えないかもしれません。
0892nobodyさん
2007/05/13(日) 13:34:58ID:???helper_app_objectとか知らなかったんだが…
0893nobodyさん
2007/05/17(木) 21:08:16ID:???ごめんなさいごめんなさい。
それたぶんあまりうまく動かないです。。
>>892
BoBppさんのブログとかがそのあたり詳しいと思います。
(僕も普段は使って無いので。。。)
0894nobodyさん
2007/05/18(金) 01:35:51ID:???0897nobodyさん
2007/05/22(火) 00:55:13ID:???多分>>862って俺だったよなぁと思いつつポイントだけ
Ethna_ActionFormのコンストラクタが実行される前にフォーム定義をセットするように
Ethna_ActionFormを継承したクラスに書けばおkです
後は好きな形式からロードしてActionFormの定義配列を吐き出せるクラスなりを用意しておけば
俺の場合元々古いバージョンのEthna時代に作った物で、フォーム表示のsmarty関数とかも
作ってて、フォームの見栄えなんかも一緒に定義出来るようにしたりしてます。
0898nobodyさん
2007/06/01(金) 22:56:49ID:???>>866
を参考にしてActionForm内にmethodを書いてリストを取得していたんですが、同じような処理が多くなってきたのでAppManagerを呼び出して取って来る方式にしました。
ところが、ActionForm内のmethodとして記述していた場合は最後に
return array(0=>'a',1=>'b',...);
と言う配列を帰していれば良かったんですが、AppManagerで同様にやろうと思いgetAttrList()にmethodの中身をコピペして使用すると上手く動きません。
で、ViewClassのコードを追っていったら404行から
// マネージャから取得
$mgr =& $this->backend->getManager($split[0]);
$attr_list = $mgr->getAttrList($split[1]);
if (is_array($attr_list)) {
foreach ($attr_list as $key => $val) {
$options[$key] = $val['name'];
}
}
となっていたので、AppManagerから帰す時はgetAttrListで
return array(0=>array('name'=>'a'),1=>array('name'=>'b'),...);
と帰すと上手く行きました。
この形式じゃないと駄目なのってなにか歴史的経緯でもあるんでしょうか?
$options[$key] = $val;
だったら面倒がなくて良いんですが・・・
0899878
2007/06/02(土) 00:00:57ID:???んー、あまり読んでなくてレスするけど。
ActionForm内のメソッドからAppManager呼ぼうとしてる?
それはできないヨ。Ethnaって、ActionForm→Backend→AppManagerって順にnewしてるから
だから、自分は、ActionFormのプロパティをセットするのは、prepare()内って決めてる。
で、POSTされてってChain時は、parent::prepare()でオートセット(もどき・・・自分に言い聞かす)。
違ったらソマソ
0900nobodyさん
2007/06/06(水) 15:40:46ID:6likgS+I解決法どなたかきぼんぬ
0901900
2007/06/06(水) 15:54:31ID:???$this->backend->getConfig->get('hoge')も
両方だめぽです。
Call to a member function on a non-object
エラーがでます。
0902nobodyさん
2007/06/06(水) 16:05:23ID:???試してないけどEthna_AppManager見た感じではそれでいけそうなもんだけどなぁ
どっかで凡ミスしてない?
0903900
2007/06/06(水) 16:30:44ID:???また、$this->session->get('hoge');
などもマネージャ内では機能しないようです
0904nobodyさん
2007/06/06(水) 17:52:49ID:???ちょっと嫌かもしれないけど
俺ならそういうケースはとりあえずEthna_AppManagerのコンストラクタに直接var_dumpとかで
値取れてるのか確認するかなw
これまたEthna_AppManager見ただけで未確認で申し訳ないけど
普通ならちゃんと取れてるはずだから
Ethnaの古いバージョンだから違うとかEthna_AppManagerを継承したマネージャ作ってて
Ethna_AppManagerのコンストラクタ実行されてないとかそれくらいしか思いつかない(;´Д`)
0905900
2007/06/06(水) 18:40:02ID:???0906nobodyさん
2007/06/06(水) 21:41:01ID:???$this->backend->getConfig->get('hoge')はエラーで当たり前。
絶対凡ミス。
0907nobodyさん
2007/06/06(水) 22:31:09ID:???var_dump(get_class($this->backend));
とかしてみないの?
0908878
2007/06/07(木) 00:18:01ID:???>$this->backend->getConfig->get('hoge')も
getConfigはメソッド。
$hoge_config = $this->backend->getConfig()->get('hoge');
だよ。@PHP5
PHP4ならひとつかませて
$config =& $this->backend->getConfig;
$hoge_config = $config->get("hoge");
0909nobodyさん
2007/06/07(木) 00:27:25ID:???0910900
2007/06/07(木) 14:58:11ID:???再三チェックしましたが、誤りは無いようです。
PHP4で
$config =& $this->backend->getConfig;
$hoge_config = $config->get("hoge");
も試してみましたが、
$config =& $this->backend->getConfig; の行でエラーが発生します。
$config =& $this->backend->getConfig();
も試しましたが同じくです。
>>907
bool(false)
となりました。
backendの時点でだめっぽいです。
0911900
2007/06/07(木) 15:00:58ID:???では
string(19) "project_hogemanager"
が表示されます。
0912nobodyさん
2007/06/07(木) 21:56:08ID:???困っています。
echo get_class($this->backend) で画面に表示させた場合、ちゃんとethna_backendとかえってきています。
また、Ethna_Backendクラス内の、getDB()関数の最初の行に、 echo "a";と書きましたが、
$this->backend->getDB()の実行で表示されていません。
誰か助けてください。
0913nobodyさん
2007/06/08(金) 00:20:17ID:???Ethnaの普及具合を表しているようだ。
0914nobodyさん
2007/06/08(金) 01:50:49ID:???ほんとうにありがとうございました。
0915900
2007/06/08(金) 03:08:18ID:???> Ethna_AppManagerを継承したマネージャ作ってて
> Ethna_AppManagerのコンストラクタ実行されてないとかそれくらいしか思いつかない
これっぽいんですが、
改善策が良くわかりません、あふぉの俺に救いの手を orz
0916900
2007/06/08(金) 03:22:16ID:???HogeManagerでコンストラクタ作ってたのがだめでした、、、
あああ、はまりました、、、
0920nobodyさん
2007/06/09(土) 10:13:10ID:???0921nobodyさん
2007/06/09(土) 14:09:54ID:???そんなことは自動的にやってくれる言語が大半だろ。
手動で呼ばなきゃいけないってのはどっちかっつーとPHPの基礎。
0923nobodyさん
2007/06/09(土) 21:09:43ID:???super()相当のメソッドをコールしなくても
自動的にスーパークラスのコンストラクタが
コールされる言語ってある?その言語の場合、
オーバーライドしたコンストラクタだけをコールして欲しくて
スーパークラスのコンストラクタを呼び出したくない時はどうやってんだろう?
0924nobodyさん
2007/06/10(日) 00:08:48ID:???統合環境によっては、クラス生成時のテンプレで用意くらいはしてくれるかもしれんが。
0926nobodyさん
2007/06/10(日) 14:04:30ID:???あまりいろんな言語知ってる訳じゃないが、C++とかC#とか。
Javaは呼ばれないの?
>>924
コンストラクタ以外なら勝手に親を呼ばれて困るのは当然だが、
親のコンストラクタを呼ばれちゃ困るってのはカプセル化が上手く出来てないのと違うか?
親のprivateフィールドとかどうやって初期化するんだよ。
0927nobodyさん
2007/06/10(日) 15:10:20ID:???0928nobodyさん
2007/06/26(火) 21:27:23ID:???↑これ買った人いる?
0929nobodyさん
2007/06/26(火) 22:39:12ID:???0930nobodyさん
2007/06/27(水) 09:01:31ID:???0931nobodyさん
2007/06/27(水) 11:06:55ID:???0932nobodyさん
2007/06/27(水) 11:35:05ID:???0933nobodyさん
2007/07/01(日) 00:19:17ID:???0934nobodyさん
2007/07/01(日) 10:27:50ID:???0938nobodyさん
2007/07/01(日) 23:45:37ID:???> あれば満足する?
mixi 位の規模のサンプルコードがないとダメだろ。
常識的に考えて。
0939nobodyさん
2007/07/02(月) 20:57:37ID:???0940nobodyさん
2007/07/03(火) 03:16:53ID:???Mixiまでは行かないが、そこら辺のBlogスクリプト規模とか
ぐらいがあれば、どうにでもなりそう。
0941nobodyさん
2007/07/03(火) 08:05:26ID:???0942nobodyさん
2007/07/03(火) 09:23:46ID:???じゃあオマエは読むな
サンプルや使用例なんて多いに越した事はない
しかし、symfony.jpみたいにグダグダ書かれても読む気がウセるので
ちゃんとカテゴリや用途別にしっかりと纏めて読み易くすべき
フレームワークなんて楽する為にあるのに殆ど(っていうか全部?)のフレームワークが
わからんところはソース見てあたりまえの現状になってるのは本末転倒
ドキュメントの整備が追いつかないのであればEthnaに限らず
サイトに問い合わせコーナーを設けてどんなに下らん質問でも
ソース見ろとか言わずに誠心誠意真面目に答えるべき。
0943nobodyさん
2007/07/03(火) 09:31:39ID:???レス数が900を超えています。1000を超えると表示できなくなるよ。