【PHPフレームワーク】Ethna【スケルトン自動作成】
1 :
nobodyさん :
2005/08/03(水) 21:00:39 ID:TuHx69hT
3 :
1 :2005/08/03(水) 21:02:18 ID:???
Web+DB Vol.27 でEthnaとMapleの特集が あって始めてみた奴は多いはず。 しかし、へたれな俺はいまだ初期サンプルすらうごかず。 Windowsでやるのはちょっと面倒らしい
>>1 Mapleスレも立ってないのに特集にあったからってスレたてるのもどうかと
5 :
1 :2005/08/03(水) 21:32:22 ID:???
6 :
1 :2005/08/03(水) 21:39:20 ID:???
Smartyそのまま、インスコだと、フォルダ構成が違うんだな… 一応、動いた
7 :
4 :2005/08/03(水) 22:02:08 ID:???
ごめん、MapleじゃなくてMojavi Mojoviスレも立ってないのに特集にあったからってスレたてるのもどうかと 大体、藤本スレがあるじゃんエスナ。
8 :
1 :2005/08/03(水) 22:08:43 ID:???
>>7 藤本スレってどれ?
フレームワークって一つのスレでやるわけにもいかないし
Mojaviがいるならそれを立てたらいいんじゃない?
糞スレがいっぱいあるんだし、下のほうで落ちかけてる
糞スレよりマシなら新スレはありだとおもうけど。
あと、新しい技術とかネタは、資料が少ないので枯れた技術より
スレの価値はあると思うけどな
>>1 Phrame スレが実質的フレームワーク総合スレみたいになってるから、そっちでやると良いよ。
多分次スレは、総合スレにすると思うし。
オリフレ
いちいちコマプロ起動すんの邪魔くさいので、 ブラウザから骨作成できるようにかえてみた
12 :
nobodyさん :2005/08/07(日) 10:44:22 ID:haxCMb+Y
PHP使いのレベルの低さを露呈するスレですか?
>>13 10レス程度しかないスレの判断が自分でできないの?
>>14 10レス程度しかないから判断に困ってるんじゃないのか?
日本語おかしいぞ。
PHP使いの日本語のレベルの低さを露呈するスレのようだな。
18 :
nobodyさん :2005/08/08(月) 02:36:56 ID:5eB+RryD
>>17 他スレの内容もよく確認せずに立てるからこういうことになる。
>>9 で誘導された以降は埋めに入っているだけだ。
>>18 埋めずに放置したほうが早いと思うが・・・
FFの魔法?
$res1 = new m9('a')->("プギャァ~");
23 :
nobodyさん :2005/08/19(金) 16:22:35 ID:G4tV6ApK
保守
24 :
21 :2005/08/20(土) 03:45:36 ID:???
>>22 一応自作
md5('a')がプギャーに見えると誰かが言っていたのが元ネタ
25 :
nobodyさん :2005/09/07(水) 08:13:27 ID:mmk2nS5q
GREEがEthnaに全面移行だって。 Ethnaの波がきそう。
Ethna見たけどPEAR::DB前提なのがなぁ
27 :
nobodyさん :2005/09/08(木) 03:02:26 ID:rKSNVtMq
>>25 オープンソースものができないと波は来ないと思われ
GREEの中の人が作ってるものがGREEに適用されるだけでは
たいした変化は無いと思われ
あ、更新はもうちょっと盛んになるかな
>>27 GREEで使われている→OSSで使われる→浸透
ってなるかもしれないし,採用されること自体は良いことだと思うなー
何しろEthnaの開発者自身が使うんだし.
>>29 今のところEthna_AppObjectがMySQLの場合の処理しか書いてないから
そうみたいだね。
あと、Ethna_AppObjectがPEAR::DBに結構べっとりなんで、orz。
GREEってめちゃくちゃ負け組だし。
33 :
nobodyさん :2005/10/20(木) 20:17:48 ID:gGHMowG8
34 :
nobodyさん :2005/10/20(木) 20:44:36 ID:CoKHMuIL
>ちなみに、CTOの藤本は一部で「PHPの神」とも呼ばれている人物です。 ふじもと神カッコヨス!
36 :
nobodyさん :2005/10/29(土) 00:45:05 ID:cpVuZiEl
>>30 PEAR::DB以外でも使えます。
たしかにEthna_AppObject.phpのDBオブジェクトを格納しているメンバ変数名は
my_dbなのでMySQL限定にみえますが、getDBListでもってきているので
Controller側で設定されたDBオブジェクトが格納されるようになっています。
さらに、SQL生成部分も抽象化されているのでPEAR::DBよりも手前のレイヤー、
getSQL関連の部分をQueryBuilderなどに置き換えることで他のライブラリに対応させることも可能です。
ただJOINとかには'まだ'対応していません。(設計上は実装可能ということです)
とりあえずimportForm,exportFormが便利なのでオススメ。
37 :
30 :2005/11/02(水) 01:11:18 ID:np1WZqZr
いやー、詳しい説明ありがとう。 自分が、Ethna_AppObjectが結構PEAR::DBにべっとりだなって思ったのは、 Ethna_AppObject::searchPropで ------- $r =& $this->my_db_ro->query($sql); if (Ethna::isError($r)) { return $r; } $n = $r->numRows(); ------- ってところ。 $rにnumRowsメソッドを期待してるところからです。 なんで、Ethna_DB_PEAR以外にEthna_DB_HOGEってのを使おうと思って、 class Ethna_DB_HOGE extends Ethna_DB ってのを作ったのですが、これだと少なくともsearchPropで上手く行かないので、 PEAR::DBと同じようにPEAR::DB_Resultと同等のメソッドを持つラッパー的に class HOGE_DB_Result ってのを作りました。 ドキュメントには、「Ethna_AppObjectは自分による自分のためだけの・・・」 なんて書いてますが、Ethna使ってて他のORマッパー使おうとは思えないんで。 テーブルJOINは function _SQLPlugin_SearchTable(){return "";} を見て、ややコケました。 なんで、なんかかなり強引にやった気がする。 importForm/exportFormは便利ですね。EthnaはDB/Formが明確に分かれて扱えながらも 接着は容易という点で使いやすいです。
今日はじめてEthna使ってみたけど、 O/RマッピングはJOINが出来ないって書いてあったから 最初から使う気無かった。 JOIN使わないSELECT文ってほぼ有り得ないだろうと思うんだけど。 PDOを使ってDB接続、SQL発行管理用にクラス作ってControllerクラスでincludeしてるよ。 Ethnaってかなりいいなぁと思うけど、更新の遅さがちょっと気になる。
そこで予めJOINしておいたVIEWを使うのですよ。
>>39 び、びゅ〜が使えないDBの場合はどうすれば・・・
41 :
nobodyさん :2005/11/04(金) 15:59:09 ID:Rgaz27bJ
>>40 AppObjectにこだわる必要はないし使わなければいいのでは?
自分は実務ベースではAppObjectは使ってない。
MySQL 5.0! MySQL 5.0!
MySQLは4.0系で終了してます。
>>44 4.1 系、 5.0 は怖くて使ってないです。
マルチバイトの問題をまとめて本家に伝えるみたいなのはどうなったんだろう。
自動変換をやめるオプションの記事を どこかのブログで読んだ記憶がある
コミッターにhaltタソが加わりました。 少し動きが出ればいいんですが。
Web+DB Vol.27 を見て興味を持ったんだけど、サイトにある最新版は 0.1.5 ですね。 0.2.0 はどこか別の場所にあるんですかね? サイトには8月中には出したいと書かれているけど?
>>49 俺も見つけられなかった・・・たぶん無いんじゃないかな
sourceForgeのCVSからとってくるのが一番マシかと。
>>50 そうなんだ・・・。
記事に 0.2.0 を落とせって書いてあったので、てっきりどこかにあるのかと。
CVS版で始めてみます。
あまり盛り上がってないようですが質問です。 Ethnaの出力ってEUC-JP固定なのかな? UTF-8で出力(できればphp、tplファイルなんかも)したいんだけど、 EthnaのソースをUTF-8にコンバートして、 skel\template.index.tpl tpl\info.tpl のメタタグ書き換えて、class\Ethna_SmartyPlugin.php の一部機能を あきらめればいいのだろうか? それともなんかもっとスマートな方法ありますかね?
事故レス Ethna_I18NクラスにsetLanguageメソッドがあるから なんとかなるのかも。 すれ汚しスマソ
>>54 なるほど。参考になりました。
私の場合はデータもUTF-8化してしまっているので
(人名をなるべく忠実にとの依頼を断りきれず)、それを取り扱う
ファイル自体もUTF-8化しておきたかったりします。
もう少しソース読んでみますです。
56 :
nobodyさん :2005/12/01(木) 12:44:15 ID:KQRT48SC
>>53 それはgettext関係のだから今回とはちょっと関係ない。
>>55 DBとかファイルのデータがUTF-8ってことかな。
EUC-JP使うよりはUTF-8の方が良い。自分もUTF-8でやってる。
しかしEthnaでUTF-8するには日本語が使われてる部分を片っ端からUTF-8に
変更するしかないかも。
最低限の構成だと、エラーメッセージとか、
外部に日本語が表示されるファイルだけUTF-8にして
UTF-8で作ったスケルトンを用意しておいて普通に開発すればいい
(けど面倒くさいよね)
57 :
55 :2005/12/01(木) 13:45:00 ID:???
> DBとかファイルのデータがUTF-8ってことかな。
そうです。
internal_encoding も http_output も UTF-8 化してしまってるんで
コンバート処理をはさみたくないなと。
PHP も 6.0 からはユニコードが標準になるみたいですし、Ethnaの方も
対応してくれるとありがたいですね。
ちなみに
>>52 の方法でもとくに問題ないようです。
EthnaのDBってPEAR::DBですよね? $sql = "select * from hoge where foo = ? and bar = ?"; $result =& $db->query($sql, array($a, $b)); ってやると nativecode=1064 ** You have an error in your SQL syntax と なってしまうのですが?? $sql = "select * from hoge where foo = '" .$a. "' and bar = '" .$b. "'"; $result =& $db->query($sql); とすると通るので$dbは正しいDBオブジェクトだと思うのだけど・・・。 こうなる方いませんか? Ethnaは0.2.0-devです。
59 :
58 :2005/12/05(月) 12:01:45 ID:???
>>58 に続いて、
$sql = "select * from hoge where foo = ? and bar = ?";
$sth =& $db->prepare($sql);
if (PEAR::isError($sth)) {....}
$result =& $db->execute($sql, array($a, $b));
としてみたが、Call to undefined method Ethna_DB_PEAR::prepare()と返る。
?と思ってEthna_DB_PEAR.phpをみると・・・。なるほど。
でも、
>>58 の書き方を禁止する意味って何なんだろうか?
うーむ。さっぱりわからないです。
>>59 禁止っていうか、作りかけなだけでは?
getAll とか getRow getCol とかのメソッドもないし。
めんどいけど、いっこいっこ追加していくか。
61 :
58 :2005/12/06(火) 00:35:05 ID:???
>>60 >
>>59 > 禁止っていうか、作りかけなだけでは?
そうですね。反省。
Ethna使いの皆さんはここらへん独自に拡張して使ってるんでしょうか?
追加していくのは構わないのですが、バージョンアップの度に独自に追加した部分の
整合性をとるのがめんどいなぁと思ったもので。
>>61 fujimoto神はかまってもらえなそうだから、haltたんにお願いして
自分が加えた分をcommit してもらえばいいんじゃないかな。
63 :
58 :2005/12/07(水) 22:40:05 ID:???
>>62 まだまだ勉強中の身でして、fujimoto神のソースに取り込んでもらうなど
恐れ多いことでw
最近やっとEthnaの概要が見えてきた。
ethnaってactionのforwardみたいなのある? actionの中で別のactionを実行したいときはリダイレクトするの?
>>58 $db = $this->backend->getDB();
$db->db->prepare();
じゃ駄目な理由を教えて欲しい。
メンバ変数にDBのオブジェクトあるんだから
継承しなくてもそっち参照すればいいんじゃないの?
(Ethna用のエラーを書くなら継承する理由はでてくるけど)
>>64 actionからactionを呼ぶ具体的な例を教えてほしい。
EthnaはMojavi2と違って
Actionには1画面の遷移しか記述しないからActionChainは
必要ない。共通で使うロジックはAppManagerに書いたりする。
というかMojavi陣営もActionChainの矛盾に気がついてMojavi3では
実装してないとかじゃなかったっけ。
アクションやビューをコントローラにしてアクション呼び出し時に
実行するアクションを振り分けたい場合は
ttp://dozo.matrix.jp/pear/index.php/Framework/Ethna/Module.html の人がやってるから参考にするといいかも。
67 :
nobodyさん :2005/12/11(日) 17:44:23 ID:lCfSK4rb
ぼくは ノ^ヽ, ___ i┐ ヘ _____. ,ヘ ,ヘ ,ヘ ,¬, ┌───┐ /∠ゝ,,ヽ! | | | ノ/└┐i-i┌-! ┌ゝムゝム!∠-i ノ ヘ,.ヽ.,, |__!三三!__| くイ'三三┐| | | | / |'┌┘!-!└┐ | |二二二二マ | ,.-''" ∠--ゝ ,"フ i'''i二二二i'''i | ,二二, | | | | | <,. | | n n n |  ̄ !---'ゝ/└┘ 丶-'======='= |.,二二二', | | i三三┘| | | | | | | || | | | | | ┌----! '----┐ └--, ,-,..---┘ | 二二二,. | 丿,. ┌┐"|U | | | | | U U U | " ̄ ̄] | ̄ ̄" _/ ∠,..ゝ\ |__, ̄二 ̄__| 'V |__二_| エ_| |_| |__i-----i__| 匸_.」 !,. ----''''"ヽ,ゝ i二ノ \_
200文字を超えたら、「なげーよ」 表示とか。
6.フォーム値の自動検証を行う(複合チェック編)
と書きつつ、よく読むと自動検証は行わないみたいね。
>>69 3.フォーム値の自動検証を行う(基本編)
それは、これでできるから複合チェックではないよ。
ただ、複数のテキストボックスで合計の文字数200文字とかは、6番だね
71 :
68 :2005/12/16(金) 22:23:13 ID:???
ちょっと長めの入力フォームを作っていて、ラジオボタンで入力内容を切り替え ようかと思ってます(ラジオボタンをチェックするとjavascriptでフォームの一部を チェンジします)。 このようなフォームだと、Aに値がセットされているときは、BとCは必須という 感じのチェックが必要になり、そういうチェックが簡潔に書けるのかなと。 まあ、場合分けしてごりごり書いても良いんだけど、フジモト氏やhalt氏なら どう書くのか参考にしたいんですよね。
>>71 フォーム間のチェックは_validateplusメソッドですが、そういうことではなくてですか?
このメソッドは泥臭く書く以外ないですが。
73 :
68 :2005/12/16(金) 22:37:55 ID:???
>>72 お、ヒントありがとうございます。早速調べてみます。
泥臭く書くしかないのは理解してますが、Ethnaの流儀に従えば少しは
楽できるのかなと期待してるんですがw
74 :
72 :2005/12/17(土) 02:51:25 ID:???
たとえば、「Aのフォームでhogeを選択した場合にBが必須になる」くらいだったら 簡単だよね。 validateメソッドでチェックする前に、ActionFormの定義値を変えてやればいい。 HOGE_ActionClass::prepareの中で if($this->af->get('a')=='hoge'){ $this->af->form['b']['require'] = true; } if($this->validate()>0){ return 'post'; } とかかな。これがEthnaの流儀かどうかはしらんが、ActionFormを使うならこうするかな。
75 :
68 :2005/12/18(日) 14:23:11 ID:???
>>74 ありがとうございます。
なるほどこういう書き方ができるんですね。もっと泥臭い処理を考えてました。
細かいチェックをしたい場合は同様にフィルタをセットすればいいのかな?
(後で試してみます)
よくできてるなぁ。
76 :
72 :2005/12/18(日) 21:49:38 ID:???
少なくともActionFormのないフレームワークは使いたくなくなるね。 フィルタでフォームをチェックしようとするとコードが散らかるし、 Ethnaの流儀ではカスタムチェックメソッドをActionFormクラスに追加するかな。 Hoge_ActionFormにチェックメソッドを追加して、formにカスタム登録 class Hoge_ActionForm { var $form = array( 'hoge' => array( // ..... 'custom' => 'hogecustom,foocustom', // ..... function hogecustom($name){ } function foocustom(){ } } でイイと思うけど。詳しいhogecustomの実装方法は、Ethna_ActionForm::checkURLとか参考に。
77 :
68 :2005/12/18(日) 22:29:36 ID:???
>>76 すみません。フィルタじゃなくカスタムチェックでしたね。
いいかげんな事書いちゃいました。
これだけできれば十分ですね。非常に簡潔ですし。
Ethna_ActionForm::checkURL も参考にします。
#Ethnaのバージョンが低いうちにソースに目を通しておかねば。
ethna、便利なんだけど、 ActionFormの定義と、AppObject の定義を書くのがすげー面倒。 フォームの内容がたくさんあったりするとシコシコと $form の配列を書かないといけないから。 みんなどうしてるんだろう。
>>78 面倒だけどシコシコ書いてる。
省略もできるんだろうけど、後から見直す場合は全部書いておく方が
見通しがいいと思うので。
>>78 AppObjectは、先にDBでテーブル作って自作のtoolでテーブル定義→オブジェクト定義を
コピーするスケルトン作成。
・・・・・って方法はどう?作ってリリースしてくれ。
ActionFormはどうしようもないね。画面設計に依るから。
Javascriptなどでフォームの数が動的に変化するページがある場合、 ActionFormクラスの$form定義をどう書いてますか? inputタグのname値を配列としてsessionに記録していますが、 ActionFormクラスではsessionにアクセスできないし、ActionClassの prepareメソッドで$formを追加してもvalidate()メソッドを呼ぶとエラーになります。 あきらめて$_POSTを直接参照してもいいのだけれど、解決法があるなら Ethnaの流儀にそって書いておきたいです。 このようなページを処理した事がある方、ヒントをいただけないでしょうか。
Ethnaを使って、一般配布されているスクリプトってありませんか? 勉強のため参考にしたいのですが、中々見つかりません。 もちろん付属のSampleもいじっています。
[ethna-users:0155]のhaltタソのコードは参考になるなぁ。 Ethna_Controllerクラスでマネージャを登録することで、ActionClassで 初期化作業をすっ飛ばして直接呼び出せるようになるんだね。 ところで、Ethna_Controllerクラスでは、 'Yjs' => 'Query' としているのだけど、この'Query'にはどんな意味があるのだろう?
>>83 あ、出ていましたね。ありがとうございます。
早速DLして見てます。
86 :
nobodyさん :2006/01/04(水) 01:59:43 ID:ST4/dfIz
ロゴが変わったな。
ほんとだ、前の覚えてないけど、新しいのイマイチな気がする。 と言うより、デザインは良いけど、罫線ないほうがシックでかっこいい。 ミニサイズのバナーとおそろいに青系一色とか。
88 :
nobodyさん :2006/01/04(水) 21:26:29 ID:ST4/dfIz
おおざっぱだな。
EthnaでSmartyの'hierselect'を利用するにはどうしたらいいのでしょう? ヒントいただけませんか?
91 :
nobodyさん :2006/01/06(金) 17:06:34 ID:EEplBUgD
>>90 smartyにも hierselect ってあるんだ。プラグイン?
92 :
90 :2006/01/06(金) 17:19:54 ID:???
>>91 デフォルトで組み込まれてますよ。
Smartyオブジェクトにアクセスできればいいんじゃないかと思うけど
その方法がわからん・・・
>>92 ActionClassからなら
$smarty =& $this->backend->ctl->getTemplateEngine();
で使用中のSmarty取れる。
何したいかよくわからんけど、とりあえずそんな感じ.
94 :
90 :2006/01/06(金) 22:15:02 ID:???
いやSmartyにhierselectはないでしょ
96 :
90 :2006/01/06(金) 23:49:52 ID:???
>>95 ・・・・・・・。
すんません。HTML_QuickFormでした。
休みボケでした。お恥ずかしい・・・orz
97 :
90 :2006/01/07(土) 00:04:03 ID:???
あ、でも renderer に Smarty を使っていて、renderer のインスタンスを
作るときに Smarty のインスタンスを渡す必要があるので、
>>93 さんの
情報は役に立ちます。ありがとうございました。
また、スレ汚しすみませんでした>皆様
98 :
nobodyさん :2006/01/07(土) 00:22:07 ID:vbU0E729
僕は ethnaでは quick_form の必要性を感じないけどなぁ。 ActionForm でも $form を定義して、 quick_form でも form のエレメントを作成して、 って2度手間な気がします。 validateも ethnaのvalidateでいいし。 javascriptを自動生成してくれるのは便利だけど。
hierselectを使いたいんでしょ
100 :
nobodyさん :2006/01/12(木) 01:26:04 ID:F7HO2NXc
Ethnaいいんだけど、ファイルの階層構造が深くなるのがちょっとやだな。
階層は深くなるけど見通しは良くなった。 Ethna使う前の設計が拙かっただけだけど。 階層が深くて困ることってなに?
102 :
nobodyさん :2006/01/12(木) 10:35:54 ID:F7HO2NXc
>>101 目的のファイルにたどりつくのが大変。
templateとviewとactionが結構離れてるでしょ。
emacsで行ったり来たりするのが大変なんです。
>>102 納得。
俺もそれでエディタでの開発をあきらめて、今はPHPEclipseを使ってる。
エディタの手軽さも捨てがたいんだけど全体の見通しが良いほうが
後でメンテナンスするときに楽だからね。
でも開発者以外の人もソースみたりテンプレートいじったりするならわかりやすくフォルダ分け⇒階層深くなるも利点だったりする。 どこいじったらいいかわかりやすい…
>>102 あらかじめ一括でぶちこむフォルダ(unify)を用意して
作成したプロジェクトのコントローラーの$directoryを
'action' => 'unify',
'view' => 'unify',
'template' => 'unify'
とか全部同じディレクトリにすればいい。
コントローラーで設定すればアクションの自動生成も対応できる。
フォルダ階層は好みの分かれるところだから
かなり自由にいじれるようになってる。
「これだ俺のデフォルトスタイルだ」とおもったら
Ethna本体のskelをいじれば以後プロジェクトを作った場合も
勝手に自分の好きなフォルダ階層になる。
106 :
nobodyさん :2006/01/14(土) 05:22:07 ID:YyEEFPbb
108 :
nobodyさん :2006/01/14(土) 14:55:41 ID:YyEEFPbb
109 :
nobodyさん :2006/01/21(土) 12:43:44 ID:bRqE5FUc
Windows上にApache+MySQL+PHP+Ethnaの環境を作りたいのですが、 PEAR::DBの設定で行き詰ってます。 Managerクラス(fooと登録)で、 public function connect() { $db = $this->backend->getDB(); if (Ethna::isError($db)) throw new Exception('DB error', 1); $this->db = $db; } としてEthna_ActionClassのperformメソッドで、 try { $this->foo->connect(); $this->foo->xxx();// queryを発行するメソッド } catch (Exception $e) { $this->ae->addObject(null, $e); return 'yyy'; } とすると、コネクトではエラーは返らず、queryを発行するメソッドの 方で Fatal error: Call to a member function query() on a non-object in エラーが発生しました。getDB()した直後で$dbをis_objectするとfalseが 返ってくるので、getDBに失敗してるみたいなんですが、どこを 見直すべきでしょうか? Ethnaはpear innstallコマンドでインストールしてます。 チュートリアルにある空のindex pageの作成・表示までは上手くいっております。
110 :
109 :2006/01/21(土) 19:10:43 ID:???
109です。 大変失礼しました。 dsnの記述を間違っていただけでした。
$r =& $rs->fetchRow(DB_FETCHMODE_OBJECT); //これは普通に使えてます するのが面倒なので、アプリケーションオブジェクトにて、 class Sample_Foo { var $db; function Sample_Foo(&$backend) { if (! ($this->db =& $backend->getDB()) ) { // } $this->db->setFetchMode(DB_FETCHMODE_OBJECT); //これができない } } のようにコンストラクタに指定しようとしたところ、 Fatal error: Call to undefined function: setfetchmode() ... となりました。$backend はアクションクラスにて、 function perform() { $foo =& new Sample_Foo($this->backend); // } fetchRow() のデフォルトの振舞いはどこで設定するのがよいですか?
$this->db->db->setFetchMode() かな。 Ethnaが実装してない部分はこうして 直接指定してます。
112>> 動作しました。 勉強不足で、なぜそれで OK なのかわかりません...orz これからgetDB()のコード探して読んでみます。 ありがとう!!
>>58 なんかも見てみましょう。
実は自分もこのスレで教えてもらいますた。
115 :
nobodyさん :2006/01/22(日) 01:47:34 ID:MuWpGim1
action を作ったときに templage も生成してくれると楽なんだけどなー
116 :
nobodyさん :2006/01/26(木) 23:26:36 ID:P4JZCK77
完全にスレ違いだが。
>>116 これはちょっと・・・・Ethnaとの越えられない壁を感じる。
まず、ローマ字綴りのファイル名とかいきなりorz。
setter/getterはせめてisset確認して欲しいとか。
ShiftJIS使うなとか。
もしかして、JJ?
>>117 ローマ字はキモイな。
でも形にして公開するあたりは評価に値する。
内容は見てないけど。
120 :
nobodyさん :2006/01/27(金) 20:59:08 ID:IoK0izfX
Ethnaのスクリプトを一ファイルにまとめる機能って Actionも含めて一ファイルにするんですか? システム関連のファイルのみ?
>>120 やった事ないからわからないんですが、たいしてパフォーマンスは改善されなかった
って書いてあったような気がします。
予想だけど、actionは無理じゃないかな。
Ethnaのソースコードはそんなにファイル数ないからあまり効果ないのでは。
Ethna-0.2.0正式リリース
Ethna-0.2.0 リリースキター 藤本神のblogでも、時間がとれるようになったからどんどんフィードバック していきたいみたいな事が書いてあって、期待大。
確かにどこかで見たような気がする・・なんだっけ。 シンプルに4番って気もするけど、個人的には遊びゴコロを感じる1番を押したい
EthnaってMojaviでいうModuleないの? Actionだけだとファイルがごちゃごちゃになりそうな気がするんだけど
>>128 ないと思う。
action_foo_bar_baz と 自分で階層を作るのかな?
工夫すればそれっぽい事はできそうだけど。
やっぱり? 個人的には 人間が容易に把握できると言われる オブジェクトのプロパティー数=7+-2個程度が 一つのディレクトリにいれておくActionファイル数としても ちょどいいと思う。
Windows 2K+PHP 5.2.1なんですが・・・ C:\>pear install Ethna-0.2.0.tar.gz parsePackageName(): "0.2.0.tar.gz" is neither a valid version nor a valid state in "Ethna-0.2.0.tar.gz" invalid package name/package file "Ethna-0.2.0.tar.gz" Cannot initialize 'Ethna-0.2.0.tar.gz', invalid or missing package file Package "Ethna-0.2.0.tar.gz" is not valid install failed となりました。 一応ご報告まで。
Ethna-0.2.0正式版がでてからWindows上できちんと動作してます? Ethnaのディレクトリをinclude_path(*)に加えても、 Warning: main(Ethna/Ethna.php): failed to open stream: No such file or directory in D:\foo\bar\app\Bar_Controller.php on line 20 とかいわれるし・・・。PHP 5.2.1とPHP4.4.2の両方で試したけど。 (*)php -i > info.txt include_path .;D:\PHP\PEAR;D:\PHP\Ethna .;D:\PHP\PEAR;D:\PHP\Ethna
>>130 Ethna ディレクトリの親ディレクトリを include_path に加えなはれ。
ていうか PEAR のディレクトリが include_path に入ってるなら
pear install Ethna-0.2.0.tgz だけで済むのに。
132 :
130 :2006/02/02(木) 16:17:36 ID:???
>>131 動きました。
助かりました。ありがとう。
すみません
>>129 も私でした。
他のパッケージはインストールできるのですが、Ethnaは
1) pear install Ethna-0.2.0.tar.gz
2) pear install Ethna-0.2.0.tgz
どちらもだめですね。うむむ。
1) [ethna-users:0191] より。
ちなみに2)の場合はこんなメッセージでした。
D:\>pear install Ethna-0.2.0.tgz
No releases available for package "pear.php.net/Ethna"
Cannot initialize 'Ethna-0.2.0.tgz', invalid or missing package file
Package "Ethna-0.2.0.tgz" is not valid
install failed
>>132 ダウンロードしたEthnaが置いてあるディレクトリに移動するとか、
Ethnaのある場所を指定してやれば良いんじゃないの?
134 :
130 :2006/02/03(金) 08:50:06 ID:???
>>133 そういう意味だったの・・・。
てっきりダウンロードから自動でやってくれるのかと・・・。
失礼しました。
136 :
130 :2006/02/04(土) 14:25:12 ID:???
AppObjectは面倒くさくて使う気になれないんですが、使うとどういう点で幸せになれますか? いまいちピンときません。
138 :
nobodyさん :2006/02/12(日) 16:10:39 ID:HHAh2SKQ
>>137 テーブルを永続オブジェクトとして扱える。
↓
SQLを使わずに永続オブジェクトを通してテーブルにアクセスできる。
↓
DB非依存のコードになる。
↓
ちょっと幸せ
>>138 AppObject自体が mysql にべっとりだけど?
>>139 まぁ、AppObjectを使うのはその考え方(O/Rマパ)を採用してるみたいなところあるから。
自分の使うRDBMSに合うように書き換えれば済む話だからあまりMySQLべっとりは本質的ではないと思う。
142 :
nobodyさん :2006/02/15(水) 23:25:12 ID:ysMvv2cd
サンプルみたいなものは無いの? 実際にEthna使ってるアプリのソース見てみたいんだけど。
僕も色々見てみたいんだが、Ethna使ってるのってあんまりサンプル出回ってないよな。 公式にあるのと、MLに1,2個上がってるからそれ見るぐらいしか。
Ethnaよさげなんだけど ・moduleがない ・compositeViewがない これが問題
>>144 moduleとcompositeViewってなに?
何かいいことあるの?
Ethnaしか知らんので、教えてくれればうれしい。
moduleはAction-View-Templateのコンテナ。 クラスが増えすぎた時にごちゃごちゃにならない。 compositeViewはCompositeパターンを適用したView。 複数のAction-Viewを組み合わせて 一枚の画を作る時にとっても便利 from Mojavi3
ActionFormにて あるフォームに値が入ると周辺のフォームもrequiredになるフォームグループ。 それぞれのフォーム定義に 'group' => 'hoge', ってしとくと _validateする前にざざっとissetで値が入ってるか調べてrequiredしたりしなかったり。 type=radio,checkbox,select等に「その他」の項目を作ってそれを選んだ時だけ すぐ下のtype=textに書かせるような疑似コンボボックス。 'combo' => array( '8' => 'other' ), ってしとくと value="8" をPOSTすっと <input type="text" name="other">がrequiredされるという。微妙。 需要ある?
あります! 是非アップお願いしまっす。 コードを気軽に投稿できる場所があるといいですねぇ。
149 :
nobodyさん :2006/02/17(金) 15:38:48 ID:pZsluFn9
>>149 関係者 or 藤本神ご本人?
期待してます。wktk
>149 は モジュール構造というか、どっちかというと >144が言うところの compositeView の事だと思っていたのですが。。。
>>150 そういういらん確認はしないほうがいいんじゃね?
関係ない人が参加しようとしてるときにテンション下がりそうだし。
期待してるだけでいいじゃん
>>151 モジュールは保留だけどCompositeViewは作り中ってことでは?
>>152 いや俺自身何の面識もない部外者なんだけど…
なんでテンションが下がるの?
セイセイセイ
Ethnaに関係なんだけどさ。 [ethna-users:0215] W+D Vol31に載ってたDNS検索の実装 31号なんて見当たらんのだが。どこに売ってるんだ?
156 :
nobodyさん :2006/02/23(木) 22:58:50 ID:InB2CvHj
>>155 過去にWEB+DB MAGAZINEに執筆したことのある人のところには
今週のはじめくらいに届いてる。
うちにもあるよ。
>>157 なるほど。
じゃあもうすぐ発売されるのね。
楽しみに待っとく。ノシ
>>156 でも@todoには「複数テーブルのJOIN対応」と書いてあるし
JOINしたクエリを返す_SQLPlugin_SearchTableは未実装。
更新履歴のはJOINでなくてANDという意味だったりして。
>>157 定期購読も早く届く。
>>159 たしかに未実装と言えば未実装なんだけど、_SQLPlugin_SearchTableは
継承先クラスでベタなSQLを書いてやれば動作するっていう意味では
実装済みとも言える。
AppObjectにJOINする側のプロパティとJOINする側のテーブルとJOIN条件を
記述するプロパティとその記述方法があれば、具体的に_SQLPlugin_SearchTable
も実装できるね。ただ、ORMではその記述方法は一般的にやや複雑になりがち。
MapleのActiveRecordもJOIN条件を記述するルールは「へー」って感じだった。
>>161 ソースも確認しないでエスパー回答するけど、
$this->af->form じゃね?
>>163 わかってるなら wikiなんだから直してよ〜
てか、直しました。
2月の肉の日リリースはないのは28日までだから?
バージョンおかしくない?
Sessionってどうやって使ったらいいのでしょう? ActionFormはSessionでも保ってくれていいんじゃないかと思うんだけどなー。
>168 確かに。 hiddenつくるのめんどうだし
>>168 使い方って、
$this->session->set('hoge', $hage);
$hage = $this->session->get('hoge');
こういうことじゃなくて?
formの値は$formに保持してるでしょ?
そういうことじゃなくて?
配列strに$this->af->set()する方法がわからないです。 読むのはできるんだけどなー。
方法があると思い込んでたけど、ないみたい。 Ethna_ActionForm.php に function setArray($name,$name2, $value) { $this->form_vars[$name][$name2] = $value; } を追加してみた。 何か問題でるかなぁ。
$this->af->set('hage', array('hoge' => 'fuga')); って無理?コード読んで無いけど。
>173 出来ました。 ありがとうございます。 でも、 hage[’hoge’] hage[’moge’] hage[’poge’] とかあった場合、 hage[’moge’]だけをセットしたいとかってできますかね? 上のだと全部置き換わっちゃうので。
$this->af->set('hage', array('moge' => $hage['moge']));
配列型のformって、 var $form = array( 'hage' => array( 'name' => '禿', 'form_type' => FORM_TYPE_TEXT, 'type' => array(VAR_TYPE_STRING), ), ); こんな風に書きますよね。 だから連想配列をセットするっていう感覚が無いなぁ。 連想配列をセットするときはもっぱら $this->af->setAppを使うと思うんだけど・・・。
>175 ちょっと理解できませんでした。 これだと、$hageの中身が$hage['moge']だけになっちゃうんじゃないかと思うんですが。 >176 配列なら連想配列じゃなくても添字が数字でも構わないんですが $this->af->set 出来るんでしょうか?
afって言われるとアナルファックと思ってしまうのは 俺だけ?
$arg = $this->af->get('hage'); $arg['moge'] = 'moge'; $this->af->set('hage', $arg);
>179 出来ました。なるほど! 感謝です。 ちょっと使いづらいかなぁと素人考え的には思いますけど、これでなれたほうがいいのかなぁ。
181 :
179 :2006/03/24(金) 22:57:08 ID:???
俺も素人だから、詳しいところはよくわからない。 MLに投げるのが一番じゃないか?
>>170 便乗質問です。
例えば、
ActionA -> ViewB(画面表示) -> ActionC -> ViewD(画面表示)
という流れの中で、ActionAでSessionに値を保存し、
ViewBで取り出して画面に埋め込むと正しく表示されるのですが、
ViewDで取り出しても値が残っていないようで表示されません。
ViewBとActionCの間で何か処理しないとダメなのでしょうか?
Sessionなのでずっと値を保持してくれていると思っていたのですが…。
直接は関係ないと思いますが、$this->sessionと
$this->backend->sessionは何か違うのでしょか?
環境はPHP5.1.2+Ethna0.2.0です。
>>182 処理は不要。
$this->session->remove したり、上書きしない限り保持されたままだと思う。
session自体は値をseriarizeしてファイルに保存してるだけなので、
shellで直接覗いてみては?
/{project}/tmp にsess_xxxxxxxxなファイルがあるから。
$this->backend->session は使ったことないからわかりません。
>>183 レスありがとうございます。
確かにtmpディレクトリ下にsess_xxxxという名前のファイルがありますね。
恐らく、セッション情報はファイルで保存されているが、画面間の遷移で
上手く持ち回せていないような感じです。
一般的にセッションIDをhiddenやURLパラメータ、クッキーで持ち回すようにすると思いますが、
Ethnaを利用した場合、この辺は意識しなくて良いはずということなのでしょうか?
Ethna_Sessionクラスの定義を見ると、何やらクッキーの操作が書かれていますが、
例えばブラウザ側がクッキーを拒否する設定にしてあると、
Session機能が使えないということはありませんか?
>>184 Ethnaだけでなくphp.iniの設定も影響するのでは?
自分は
session.use_cookies = 1
session.use_only_cookies = 1
にしてるんでcookieを禁止すると当然セッションは利用できませんね。
>>185 クッキーに関してPHPのセッション設定とブラウザの設定を行ったところ、
Ethnaのセッション機能が上手く機能するようになりました。
フレームワークとは言っても、所詮PHPの上に構築されたものなので、
この辺の設定は影響するのは当たり前ですよね。
アドバイス、どうもありがとうございました。
prefilterで設定したメンバ変数とかをアクションで使いたい場合って どうするのが一番スマートでしょう?
HTMLのリンクの値はどうやってActionで取得するの? 画面A: <a href="index.php?action_admin_Hoge=true&uid=1>リンク</a> Hogeクラスでuidの値1を取得しようとして、 $this->af->get('uid'); だと取得できない。 ちなみに、$UID=$_GET['uid']; だとHogeクラスで取得可です。 ※ActionFormクラスにuid書いてあります。
>>188 HTMLいい加減に書いてるのか?
&は&にして、hrefがケツの"が抜けてるのが原因とか。
&は&amp;
29の日リリースは???
>>189 >>190 後ろの"はタイポです。&を&にしてみましたが、結果同じで$_GET['uid']
ならうまく行くんですがねぇ。
う〜ん、何がいけないんだろう?
そもそも、$this->af->get('uid')で値取得するという方法自体はあってます?
193 :
nobodyさん :2006/03/30(木) 02:43:29 ID:3Q5YeNEn
普通は取得できるはず
194 :
189 :2006/03/30(木) 08:39:35 ID:???
>>192 POSTメソッドの時は$_POSTのみがactionFormに送られて、
GETメソッドの時は$_GETがactionFormに送られる。
なので、
<form action="?action_admin_hoge&uid=1" method="POST">
とした場合、$this->af->get('uid')は得られない。
もちろん、ControllerのActionFormに送る部分をオーバーライドして定義すれば
問題ない。
そういうことではなく、ただのリンクで?
であれば、ActionFormを継承で定義してるつもりがgenerate_actionで
自動生成されるvar $formで上書き定義されているとかかな?
195 :
189 :2006/03/30(木) 08:43:02 ID:???
>>188 というか、Hogeクラスってなんだ?
何を継承したクラスだ?
$this->af->getできるのは、ActionClass/ViewClass内と「登録済みの」AppManagerだ。どこでgetしてる?
とりあえず棚。 現象が再現する最小限のソースを書いて。
>>194 >>196 ありがとうございます。
再現スクリプトを書いていたら、
>>194 さん指摘の
var $formが上書き定義されていたのが原因だった事がわかりました。
ありがとうございました!!
>>195 HogeクラスはEthna_ActionClassを継承したActionClassでした。
すいません、Ethnaとはちょっと関係ないですが、配列の質問です。 selectリストボックスの作り方を教えてください。 WEB+DB PRESS Vol.27にリストボックスを つくりには、の部分で以下のような感じの記述があります。 $gender = array( 1 => array('name' => '男'), 2 => array('name' => '女'), ); これを月(1月〜12月)をforで回して作りたいのです。 どのように作ったら良いですか? また、今月をselectedにした状態で表示したいのですが、 どのように実現させたらいいですか? テンプレートでは以下のように書いています。 {select list=$app.month name="month" value=$form.month}月 よろしくお願いします。m(__)m
199 :
nobodyさん :2006/04/08(土) 03:14:33 ID:NDJpgQtZ
AppObjectのPostgres対応化断念。 さようならEthna・・・。
>>199 さようならPostgres のほうがいいよ
>>202 Ethna_AppSQL::unescapeSQL() あたりじゃないかな。
自分もMySQLに依存しないようにPEAR::DB対応にしようとして、それで挫折した。
Ethna_AppSQL::unescapeSQL() でエスケープに addslashes() を使ってることも問題なんだけど。
204 :
200 :2006/04/08(土) 20:25:37 ID:???
>>199 それなら$dsn取ってきて、それぞれのRDBMにあわせた処理すればいいだけじゃん。
これくらいで諦めるのはもったいないですよ。
function escapeSQL(&$var)
{
$ctl =& Ethna_Controller::getInstance();
$dsn = current($ctl->dsn) ;
$db_type = substr($dsn, 0, strpos($dsn, ':'));
if (!is_array($var)) {
if (is_null($var)) {
$var = 'NULL';
} else {
switch($db_type){
case 'pgsql' :
$var = pgsql_escape_string($var) ;
break ;
default :
$var ='¥'' . addslashes($var) . '¥'';
}
}
return;
}
205 :
200 :2006/04/08(土) 20:30:11 ID:???
あ、unescapeか。スマソ。 でも、RDBMにあわせたunescape自体が結構面倒そう。 ライブラリ探すか、力技使うしか無いと思うが。
予めこういうところが設定の書き換えだけで切り替えられるようになってるともっといいのにね。
mysqlとpostgresとsqliteくらいつかえればたいていの人が満足するのかな。 oracleとか使ってる人いる?
ノ
210 :
202 :2006/04/09(日) 10:16:14 ID:???
mantis でも使われている adodb あたりも考えたことがあるんだけど これも面倒そうなんだよね。
私はpostgreSQLですが、AppObjectを使わないという選択肢をとってます。 ちょっとさびしいけどねぇ。 postgreSQLは日本では結構なユーザがいるので、非対応はコミットしてくる人を減らてるような気がします。 偉い人がんばれ
>>209 MSSQL をわざわざ PHP から使うのか
PHPからOracle使ってる俺がきましたよ。
Oracleは普通に使われてると思う。 MSSQLはPHPで使ってる人が少なすぎて、MSSQLモジュール自体が メンテされずに、大分怪しいものになってるという噂も聞く。
アクションから別のアクションを呼ぶのってどうやればいいんですか? バリデートエラーのときに、前のアクションを実行して戻したいときのような
DBで、queryした後のエラー判定とかってできないでしょうか? ethnaとおってるからisErrorが効かないようなんですが
>>215 parent::prepare();
とか
>>217 わからん・・・
parentのprepareを呼ぶとどうなるんや・・
Ethna::isError($res) とかで判定できない? エラーになった場合、返り値のクラスは何になってる?
>>215 ActionClass の prepare の戻り値が遷移先名になっているから、
戻り値に飛ばしたい、アクション名じゃいかんの?
prepareの戻り値は null->正常 null以外->テンプレート名 ではないんですか? たとえばDBからユーザーの新規追加フォームとユーザー一覧が表示されているようなページに戻したいんです。 普通に新規追加のバリデーションエラーとしてreturn 'user_list';とかにするとテンプレートを呼び出すだけなのでユーザー一覧が表示されません。 もうちょっと調べてみます。情報ありがとうございます。
222 :
nobodyさん :2006/04/15(土) 18:14:06 ID:q5ZbQNWP
mapleだと [View] input = action:アクション名 みたいにできるんだけどな
>>221 俺も良く分かっていないんだけど、
action->view->template と呼ばれる中で、例えば action でエラーが
発生した場合、前の(元の)ページへ戻るよう return 値を設定しても、
元のページの view->template しか実行してくれないんだよな。
だから view がなくせ無いし、view で値を取得するような処理も削除できない。
haltさんは view は不要って言ってるけどどうやって実現しているのだろうか?
224 :
nobodyさん :2006/04/18(火) 03:35:13 ID:AmgnkAQV
テンプレートで表示する{$errors}の変数を Actionクラスからアクセスしたいんだけど、 どうやってやればいいですか?
>>221 viewクラスからリダイレクトすればいいんかな?
>>224 $this->ae->getMessageList()
でいけるはず
>>226 アクションクラスだから
$this->af->ae->getMessageList()
228 :
224 :2006/04/18(火) 23:57:24 ID:???
229 :
nobodyさん :2006/04/23(日) 21:24:44 ID:AC8rHv07
2.1.0-preview1が公開されてるよ。 試験的に導入してみよう。
generate_project_skelton.phpがなくなってた。。
現行よりはいいよ。 清潔感あるし。最近はやってるねこういうデザイン。
俺はあまり好きじゃないな。 なんかセンス古くない? Mapleのデザインはシンプルでいいと思う。
sidebarが下にずれとる@Safari
ADODBとか標準がうれしい
おー、サイト変わってたのか。 2.0.1→2.1.0の変更点ってまだ載ってない?
238 :
nobodyさん :2006/04/26(水) 11:31:00 ID:d7Bd/O1A
Operaもずれとる
>>221 つまり、「ユーザー登録を行ったあとにユーザ一覧を表示する」ってことでいいかな?
これは掲示板でいえば「投稿したあと記事の一覧に戻る」みたいなかんじ?
ここはredirectするのが正しい。
Actionのreturnでtemplateやviewを呼んで表示させた場合ブラウザ内部で
POSTしたデータをもったまま画面遷移してしまうのでリロードしたときに
再度データ送信してしまう可能性がある。のでredirect。
これはMojaviとか他のフレームワークでもフレームワーク使ってなくても同様。
redirect.tplってのを作ってそこのHTMLのMETAで飛ばすとGREEっぽい。
(ActionでsetApp('redirect_to', '
http://example.com/ '); return 'redirect'って感じで)
このへんのテクニックは近日発売の超極めげふんげふんにある
ソースコードに書いてあります。あれはView一つあるかないかくらい。
>>223 そのケースはエラー発生時にエラー画面に飛ばすということだから
>>221 とは
ちょっと違う感じ。Formのvalidationでエラーがでたときの話?
もう少し具体的な例をあげてくれると答えられるかもしれません。
フレームワークを使うメリットがいまだに分からん。 PHPを覚えたうえに他人が決めたルールをさらに覚えるなんてムダな・・・
>>241 なら苦労し続ければいいと思う。
フレームワークにメリットがなければRailsもCatalystも流行らないわけで。
j;;;;;j,. ---一、 ` ―--‐、_ l;;;;;; 『フレームワークなんて使うよりも {;;;;;;ゝ T辷iフ i f'辷jァ !i;;;;; 自分ルールで書いた方が早いし分かり易いじゃん』 ヾ;;;ハ ノ .::!lリ;;r゙ `Z;i 〈.,_..,. ノ;;;;;;;;> そんなふうに考えていた時期が ,;ぇハ、 、_,.ー-、_',. ,f゙: Y;;f 俺にもありました ~''戈ヽ `二´ r'´:::. `!
一人でやってるうちは良いんだけどね。>おれおれ主義 自分はあんまりセンスが良くないので、達人のエッセンスを流用できて 勉強にもなったし、メリットは大きかった。
中途半端にフレームワーク使おうとすると 逆に辛くなるよね。 身体まるっと投げ出すくらいにすると結構楽になる。
Ethnaのドキュメントってオンライン版だけしかないんかな?
Irvine でも使って落としたら
248 :
nobodyさん :2006/04/30(日) 13:31:50 ID:9b2aSJKI
上の方でもちょっと話題出てたけど action1→action2→view2 ってのはむりなのかい? どうしてもやりたい場合はリダイレクトが無難? 他のフレームワークではできるの?
>>248 なんでActionをわける必要がある?
あるとすれば設計がおかしい
>>242 だって全然苦労してないもん。
一つのスクリプトなんてせいぜい500行以下(大規模なアプリはそれらを複数組み合わせる)だし、
そんなもん1日あれば十分書ける。
繰り返し出てくる似たような処理は以前に作ったコードを関数化してコピペすりゃいいし、
フレームワークどころかクラスの必要性すら感じない。
>250 自分の手足のような再利用性の高いコードをたくさん持ってる人にはたしかに一理あるかも。 逆に言うと、フレームワークの機能を手足のように使えるようになればいろんな人がコミットした便利なコードがどんどん使えるようになるのでは?
まあ今も今後も250しかそのスクリプトに関わる事がないなら別にいいんじゃないか。
つか、直接Ethnaに関係ない話題は オブジェクト指向スレか、フレームワークスレでやったほうがいいよ
255 :
250 :2006/04/30(日) 20:01:12 ID:???
>>251 フレームワークを手足のように・・・は、その通りかもね。
でも俺は個人的には他人のソースを読んで理解する手間をかけるなら、自分で書くほうが早いと思う。
>>252 他人が関わるとなると大変だろうね。でもコメント含め、極力分かりやすく書いてるけど。
ここにいる人たちは個人開発でもフレームワークを使ってるんだろうか??
既に慣れてるから個人開発でも使ってるよ。 分かりやすいしね。
257 :
250 :2006/04/30(日) 21:11:35 ID:???
>>256 でもさ、いくら慣れようとも、やっぱり他人の作った枠組み(フレームワーク)を
使うことによってまた新たな(余計な)問題や悩みが出てくるわけだよね。
だからこのスレみたいな質問スレもあるわけだし。
ってことは、チーム開発でもしない限り、フレームワークなんて
使うだけ二度手間で無駄だと俺は思うんだが。
デザパタとかのプログラミング的教養が 自然に身に付くメリットもあるよ
>>258 たしかに、俺はEthnaを使えるようになる過程で
・ORM
・MVC
について、勉強させられた。
結果として、それらが理解できて今幸せだけど、
>>250 みたいに、
その壁を超えるのが嫌ってのもわからんでもないから、それはそれで良いと思う。
ただ、今のところ、出てきた問題が「余計」とか思ったことはないなー。
その問題が解決されたときに「また勉強になった」と思えたし。
あと、Ethnaはそれに固着した問題が出にくい構成だと思う。
結構「なんでもあり」で素晴らしいフレームワークだと思ってる。
(と、話をEthnaに戻す)
>260
私もすごく勉強になってます。
初心者から中級者になるのってとても溝が深いと思うけど、Ethnaを使いこなそうと思ってがんばる過程がその一助になるんじゃないかなぁと妄想してます。
ところで、ここのToDoみてハアハアしてます。
http://beta.ethna.jp/index.php?ethna-document-roadmap かなりテンコ盛りですよねー。正式版はいつになるのかなぁ。
postgreSQL好きなので
Ethna_AppObject改善
直SQLサポート
DB依存改善
ってところを先行でお願いします。ぺこり。
ところでEthnaは基本的にPHP4をベースで バージョンアップしていくと考えていいのかな? 先日ちょっと触ってみて良さそうだったので 本格的にEthnaで開発しようと思ってるんだけど、 基本的にまだバージョン4の環境の方が多いので・・・。
>>260 新しい知識や枠組みを理解して「ランナーズハイ」を得るのはいいけど、
問題はそれが実際にどれくらい役に立つか、どれくらい生産性を上げるか、に尽きるよね。
>>250 みたいに、1日〜数日で書けるようなスクリプトのために
わざわざフレームワークが必要なのかどうかが疑問。
(そもそもPHPでそこまで大規模なものを作る必要がある個人や組織って、そんなに多くいるか??)
>>263 >
>>250 みたいに、1日〜数日で書けるようなスクリプトのために
一つ一つのスクリプトは小さくてもサイト全体では何十個も書くわけで、
それが統一的な書式で書かれるメリットはあるんじゃない?
また、協業するほどの規模ではなくても、メンテナンスを他人に任せる
ことはあるし、その時に考えたやプロセスの流れをゼロから説明するよりも、
Ethnaの用語を共通語として説明する方が楽という面もあるなぁ。
引き継ぐ人にはEthnaの勉強をしてもらわないといけないけど、自分流を
押し付けられるよりは反発が少ない>経験上
ま、250氏は物は試しで Ethna を使って2,3アプリを作ってみて
判断すれば良いんじゃないかな?
265 :
250 :2006/05/01(月) 01:48:07 ID:???
>>264 なるほど、それはたしかに一理ありますね。
でも俺はアホだからEthnaを勉強するのにすげー時間がかかりそうですorz
あと、「サイト全体では何十個も」って、いったいどんな規模のサイトなんだろう・・・??
たとえばmixiを例にとると、1000行以下のスクリプトが15個くらいあれば足りると思うんだけど・・・
>>265 mixiは15個じゃ足りない。1000行よりももっと小さくファイルを分割する。
>>266 具体的に何にいくつ使うんだ??
表面的に見えてるもの(home.plなど)だけで10個くらい、
裏方で動いてるであろうもの(cronで動かしてるもの含む)も
せいぜい10〜20個くらいじゃないか?
どんなに多く見積もってもせいぜい30だな。
>>248 mapleはできる
>>249 1,ユーザ一覧と、ユーザ登録フォームがあるページ
2,ユーザを登録するためにフォームに入力->submit
3,validateエラーなので1に戻す
普通にテンプレートだけ指定すると当然ユーザ一覧は表示されない
だから1のアクションをもう一度実行したい。
location使ってもいいけどフォームの入力値が保存されないのが問題
>>268 そういう場合は共通の動作(ユーザ一覧を取得とか)をactionクラスの中のメソッドにして
3の時にもう一回そのメソッド呼ぶって感じで処理してるな。
俺も他にスマートな方法があったら知りたい。
>>267 見えてるものだけでも30は超えるだろ
トップ、登録、ログイン、ログアウト
日記検索、表示、日記書き込み、コメント一覧
友たち一覧、コミュ一覧、足あと
プロフィール表示、編集、設定変更
紹介文表示、書き込み、写真編集
掲示板一覧、編集、閲覧
コミュ検索、参加、退会、誘う、管理人まわり
レビュー検索、編集、閲覧
メッセージ表示、送信
フォトアルバム検索、編集、閲覧
ヘルプ、mikly、リリース情報
>>270 に加えて
mixiの中の人が使う管理ツールとか、バッチ処理を行うcronとか
広告まわりの管理機能も必要だな。ニュースの取り込みもある。
数えればきりがないし、今後どんどん増えていくだろう。。
最初は少なくても、あれをやりたい、これをやりたいって言ってるうちに
だんだん膨れ上がっていくことはWEBでもよくある話だ。
なのでフレームワークを導入しておくメリットはあると思う。
>>261 なんかTODOふえてるなー。てんこもり状態だ。
JSONやAjaxもいいけど、DBまわりの改善を強く望みます!!
>>268 なるほど意味わかった。
>>269 のやり方が正解。
ただし
>>269 はActionのメソッドとして実装しているけれど
ここは「ユーザー一覧を取得するメソッド」を持つ
AppManager(ProjectId_UserManagerとか?)を作って
それをActionから呼び出す。
AppManagerにすればどのActionからでも使えるし。
基本的に画面の遷移、フォーム制御以外のロジックは
AppManagerに全部かいてしまうのが良い。
>>270 あっ、そっか!! ちょっと数え方を勘違いしてた。
そうだよね、それくらいあるよね。
で、数は多いけど一つ一つはけっこう単純で簡単なスクリプトって感じだよね。
>>271 とりあえず基本機能だけに絞れば、2〜3日あれば一人で作れそうだよね??
>>273 ロールやセッション、DB周り、一つ一つにエラー処理といろいろと
考え出すときりがないし、無いと問題になるから。
むしろその辺をFWに任せたり、無視できれば楽w。
>>273 見込みが甘すぎないか。。
単純な基本機能だけなら、すぐにできるかもかもしれないが、
細かな機能を揃えてアプリが大きくなるにつれ、
メンテコストはどんどん上がり、開発速度はどんどん落ちるぞ。
mixiの規模なら動作検証テストを行うだけでも大変だ。
>>274 俺はむしろエラー関係やセキュリティ関係などをFWに任せてしまったときに、
万が一FWの不具合または自分の理解不足や使い方のまずさのせいで
何か問題が起こると手が付けられないので、自力でやったほうが安心できるw
>>275 機能にしぼるっていってるんだから、規模は別でしょ
とりあえず、スレ違い。
っていうか大規模サイトの動作検証テストってどうやるんだろ? たとえば、数万人が同時にアクセスしたときの状況なんて どうやって事前にテストするの??
>>279 個人サイトだけど、
アパッチベンチで付加テストでやったよ。
281 :
nobodyさん :2006/05/02(火) 07:06:11 ID:9MMBFPNj
Ethna使ってるGREEは 複数のDBを使ってると思うんだけど Ethnaは分散DBとかクラスタリングに対するアプローチを提供しているの? Ethna使ったらそのへん少しは楽になる?
>281 mysql のレプリケーションには対応してるよ。 複数DBが設定できて、それぞれにRead(slave)とWrite(master)の属性をつける感じ?
>>282 ・テーブルごと、read/writeごとに
適切なDBサーバに接続してクエリ発行
・上層では、どこに接続しているかを知る必要はない
って形にしたいんだ。
レプリケーション対応ってことはそのあたりも
考慮されてるってことかな。
ちょっと触ってみる(`・ω・´)
ファイルをアップロードするフォームを付けたいと思っています。 デフォルトの状態で、確認画面を出しつつファイルをアップする事って可能でしょうか? サンプルのサインアップのように確認画面を出すと、一応ファイル情報は渡っているのですがプロセス終わっているので一時ファイル消えてしまうのです。 GREEだと、確認時点で既に目的のディレクトリにUPしてファイルのIDを渡しているようなのですが、これと同じようにすればいいのでしょうか…。
>>285 あはは。同じく。
>>284 GREEのサイトの動作で良いなら同じようにすれば良いし、
不満があるなら分かるように書いてくれ。
287 :
nobodyさん :2006/05/04(木) 09:38:15 ID:rkFCz1JB
Ethna_SessionのisValidメソッドでは IPを元に妥当性チェックをしています。 IPが変わる環境を想定して 「同一ネットワーク範囲」になっていると思うのですが このメソッドはIPがコロコロ変わる携帯の環境でも適用OKなのでしょうか?
Ethna_DB_PEAR::queryに プレースホルダ用のパラメータ渡したら 渡ってなかった(´・ω・`) 自前でSQL全部組み立てて渡さないといけないのね AppObject使わない場合 エスケープはどうするのがEthna流?
290 :
288 :2006/05/06(土) 10:19:17 ID:???
こんな感じで解決しました。ぽえーん。 ○Ethna_Backendを拡張 コンストラクタの最後で、 自分自身をEthna_Sessionの拡張クラスに渡す。 またshutdownDBでコネクションを廃棄してしまわないよう、 何もしないメソッドでオーバーライドする。 ○Ethna_Sessionを拡張 DbSessionHandlerオブジェクトを生成、ハンドラとしてセット。 Backend受け取り用のメソッドも追加。 Backendを受け取ったらDbSessionHandlerにdbオブジェクトをセット。 ○DbSessionHandler 読み込み、保存等
291 :
nobodyさん :2006/05/06(土) 16:18:47 ID:10gQsHXE
なんで公式サンプルみれんのん?(´・ω・`)
うん、俺も思ってたw
デモ「サインアップ」が見えなくなったのは、Sample_SmartyPlugin.phpと中に定義されている 関数と、Ethna/class/SmartyPlugin.phpの中に同じ名前の関数が入ったから。 だから重複しているぞとエラーが出る。preview2.1.0にはなかったんだけど beta2.0.2-20060502あたりから入ってる。
294 :
nobodyさん :2006/05/06(土) 19:29:09 ID:10gQsHXE
postgresでAppObject使ってみてるんだけど、 primaryつけたら、なぜかgroup byしてエラーになるんですよね。。。 Ethna_AppObjectの_getSQL_SearchPropを書き換えればいいのかな? それだとバージョンアップ時に面倒なので、何か他に良い回避策無いでしょうか。
295 :
nobodyさん :2006/05/06(土) 20:40:31 ID:06TlKyoI
Mojaviで言うforwardみたいな、 「Actionを実行して、その結果画面を変数に得る」機能ってないの? ないとすれば、いくつかの小さな画面から構成される画面は どうやって構築するのがEthna流?
296 :
nobodyさん :2006/05/06(土) 22:41:29 ID:10gQsHXE
アプリ共通のカスタムチェックメソッドはどうやって定義するの?
>>76 みたく一個一個のactionFormに書くしかない?
Ethna_ActionForm.phpに直接書くのは避けたい。
あああ。慣れるのに時間がかかる〜。
297 :
nobodyさん :2006/05/06(土) 23:09:53 ID:??? BE:25416522-
Ethna_ActionFormを継承したクラスを作成して、それの中に書いているよ。 個々のActionFormは、先に作ったクラスを継承させている。 Ethna_ActionClassでの処理も同様に。
継承を前提としたクラスは 基底クラスからinitializeメソッドとかを呼び出す形にした方が いいんじゃないかな?(Template Method) 現状だと初期化処理するために コンストラクタをオーバーライドしないといけないから。
299 :
nobodyさん :2006/05/07(日) 11:18:24 ID:ql08TCab
>>297 なるほど!ありがd!!
>>298 とりあえず今は
parent::Ethna_ActionForm($controller);
って逃げとくしかないのがベター?
300 :
nobodyさん :2006/05/12(金) 23:01:13 ID:rwERuLLO
作った再利用可能なオブジェクトは どこに入れてる?
>>300 曖昧な質問かも。
再利用可能って、そのアプリ内で?別のアプリでもって意味で?
前者なら/app後者なら/lib
さらに、オブジェクトってインスタンスの意味?
インスタンスはAppManager使えばsingletonとして問題無し。
ごめんシングルトンのインスタンスのつもりだった シングルトンは基本AppManagerにしていけばいいんだね
303 :
nobodyさん :2006/05/13(土) 17:20:23 ID:+4PvLPs5
AppManagerって登録した数だけDBに接続してるね。 それって何か不安。 接続する処理消したけど。
手元にないし詳しく見てないけどそれは違うのでは? 多分すばやくアクセスできるように DBのインスタンスを持たせてるだけだと思うけど
305 :
nobodyさん :2006/05/13(土) 17:37:51 ID:+4PvLPs5
ああ本当だ。isSetでセットされてればそれ返してる処理があった。
306 :
nobodyさん :2006/05/13(土) 17:56:51 ID:+4PvLPs5
登録してあると、DB必要ないページでもいちいち接続しちゃうのはやっぱり嫌だね。 使わないマネージャーまで含めて全部初期化処理実行されるのも負荷が気になる。
>>306 本当に接続してる?
神の設計でそんなダサイことはしないと思う。
backend->getDB()がなされるまでDB接続はしないんで、
AppManagerをnewする段階ではDB接続はしないんじゃまいか?
で、getDBするところって、AppObject::searchProp()してるところ
以外では無くって、少なくともAppManagerのコンストラクタでは
getDBしてないんで、DB接続は行わない。
よくあるパターンでいえば、
AppManager::getObjectPropList
AppManager::getObjectList
もしくは、new AppObjectの時点で初めてDB接続を行う。
余談だけど、Ethnaの設計の上手いところは、newしたAppManagerを
各AppManagerで使うときに、ちゃんと参照渡しにしてるんで(フツーそうだけどPHPが(ry))
シングルトンとして成立してる。つまり軽い。
308 :
nobodyさん :2006/05/13(土) 23:00:13 ID:+4PvLPs5
接続はしてるみたいだよ。DB停止させてみたら DB使ってないところで接続エラー出たし。 さっき登録してるって書いたのはコントローラの $managerに書いて使う時の話ね。(チュートリアルのように) 見てみたら AppManagerをextendsして そのコンストラクタ内で $backend->getDBList(); となって、getDBListの中でgetDBしてると。 だからAppManager継承してコンストラクタ変更したクラス作ればまぁ解決なんだけど。 ちょっと・・・・ダサいよね。 便利さと引き換えか。
まあDBは使うケースの方が多いからそうなってるんだろう 俺はセッションを必ず発行するようなやり方じゃないのに 感心したけどな。 って感心するほどでもないのかもしれんが Mojaviは必ずセッション張ってたから。
310 :
nobodyさん :2006/05/14(日) 15:46:31 ID:rwAYtESF
Appマネージャーはセッション作ってるけどな。 Mojaviは設定ファイルでセッション使うか選択できるっしょ。
携帯でセッション使う場合ってEthnaの場合はどうすればいいの? tplで<?=SID?>って書いても表示されないし・・・
これの公式はなんでアプリケーションが作れるなんて表現使ってるんですかね? アプリケーションって言うかこれで作る物って単なる記事ですよね? アプリケーションというからには一体どのようなメリットがある物を作れるのでしょうか? エスナ自体がアプリケーションというのは分かりますが…
312はスルーで
あ、ごめんなさい。 PEARや.NEET Frameworkみたいな物なんですね? 勘違いしてました。 私は規模の小さい物しか作らないので使いそうにありませんね。 2度と来ません。 さようなら。
316 :
nobodyさん :2006/05/14(日) 23:15:02 ID:KFG0Cy87
未定義Action名が呼ばれた時用の Actionてどこで定義したらいいん?
318 :
nobodyさん :2006/05/16(火) 12:03:40 ID:YezSXlp+
こんなネ申な設計ってどうやったらできるようになるん? 漏れがやると、設計しても、後で終わってみたら ぐちゃぐちゃになってるんだけど。。。
>>318 そうでもないと思うが、やりたければ、何かのフレームワークを参考にしたらよろしい
これもstruts参考とかだったはずだし
フレームワーク全般で見れば神設計はちょっと言い過ぎ ソース見たら結構雑草精神入ってるよ 分かりやすくて好きだけど
ソースが見やすいですよね。
あと日本語コメントがかなり助かる
323 :
nobodyさん :2006/05/17(水) 11:33:31 ID:HV8AbfRa
>>219 久しぶりに覗いたら質問したいレスがあったので便乗しますが、
私もDBアクセスのエラー検出で困っています。
例えば下記の様にクエリを実行します。
$db =& $this->backend->getDB();
$res =& $db->query($sql);
$sqlにでたらめなクエリ(存在しないテーブルへのアクセスなど)を記述しても、
DB_ErrorではなくDB_Resultが得られます。
ですので、DB::isError($res)はfalseを返します。
当たり前ですが、Ethna::isError($res)でも結果は同じでした。
さらに$res->fetchRow()するとDB_Errorが取得できます。
最悪、フェッチしてその結果を判定することはできるのですが、
やっぱり変ですよね?
>>323 MLに投げるときはPEAR::DB最新バージョンでの動作確認してからでよろしく。
2.1期待アゲ
O/Rマッピング使ってたり確認画面なんか出すと、余計なスラッシュ取り除くのがとても面倒そうなんだけど みんなmagic_quotes_gpcはhtaccessとかの設定でOFFにして使ってるの?
magic_quotes_gpcはoffが普通だお
そっかありがとう、バカな事聞いたみたいだね。
まだ落ちてるね。メーリングリストのログを見たいのに。
うーん 今日日、鯖落ちって何があったら起こるんだろ? へっぽこサイトでも滅多に落ちないのに フレームワークのサイトで落としちゃ駄目でしょという気が しないでもない
>>332 鯖管理とフレームワークは別担当だしあまり関係ないかと。
鯖移転でもしてるのかもね
> 2006/05/25 12時頃〜2006/06/26 22時頃に渡り、サーバの電源障害によりアクセスが出来ない状態が続いておりました。 復旧したみたいね。
電源障害は冗長性もったハード構成とってないとどうにもならないですね。
また長い間落ちてるね。 どうしたの一体。
337 :
nobodyさん :2006/05/29(月) 00:43:18 ID:PDeUAnyO
開発環境って皆さんEclipse+Trustudioですか? 同じ人がいたら教えてください。 $this->af-> まで入力してafに対応するメソッドを出したいんですが、 Ctrl+Spaceを押してもまったく出てくれません。 $this-> ここまでだったら、いろいろ出るんですが・・・
>>337 Eclipse使ってないけど、変数を型宣言しないPHPでそれは難しいのでは?
thisは無条件に現在編集中のクラスのメソッドを持ってこりゃ良いけど、
$this->af-> ってafがどのクラスのインスタンスか判然としないし。
http://ethna.jp/ethna-tutorial-startup-practice1.html に書いてあるようにスケルトンを作成する時って
おそらくOSの文字コードに合わせて作成されると思うんですが
例えばOSの文字コードがEUCの時にスケルトンをShift_JISで作成ってのは
無理でしょうか?
下記のように実行すると全てスケルトンがEUCで出来てしまい、
ブラウザでアクセスした時にEUCでないと文字化けしてしまいます。
php /usr/local/lib/php/Ethna/bin/generate_project_skelton.php /tmp sample
何とかShift_JISで作る方法ってありませんか?
340 :
nobodyさん :2006/05/29(月) 13:46:59 ID:/XQ6rqgj
>>339 スケルトンをSJISにしたらどうでしょうか。試してないけど。
341 :
340 :2006/05/29(月) 13:50:24 ID:???
あ、ごめんアプリ全体の話か・・・ActionClassなんかの話と勘違いしてました。
Ethna 全体をSJISにコンバートしたらできるんじゃないかな。 UTF8化した人はググるとでてきますよ。
>337 Eclipseは知らんけど、 Ethna_ActionClass.php の、 @var object Ethna_ActionForm ってとこを、 @var Ethna_ActionForm にすればいいような気がしなくもない。
344 :
339 :2006/05/29(月) 17:38:18 ID:???
>>342 自分もUTF-8にコンバートして使ってますが無問題ですよ。
346 :
nobodyさん :2006/06/04(日) 20:37:44 ID:2IZPCYov
.tplは無問題?
ツールで一括変換してるみたいだけど、すべてのファイルがちゃんと変換されているか確認した? 開始タグ、終了タグの前後、テンプレートにゴミがありそう
349 :
346 :2006/06/05(月) 14:38:11 ID:???
レスありがとうございます。
>>347 Ethnaをインストールしたときに入ってるindex.tplでも
この現象が起きてるので、tplファイル個別の問題ではなさそうです。
もちろんUTF-8にコンバートはしてあります。
>>348 一応、ツール上で最後に変換結果が出て、全部変換されているようです。
いくつかファイルを開いて実際に確認しましたが、ちゃんと変換されてました。
ちなみにさっき、会社の環境でUTF-8化をやってみたところ、この現象は発生しませんでした。
phpやapacheの設定やらバージョンやらコンパイルの設定のせいかな?
今日、OSのインストールからもう一度やってみます。
350 :
nobodyさん :2006/06/06(火) 16:35:59 ID:ZicQqZjn
>>349 ?>
^^^^^
ここの空行とか...
2.1.1キタ━━━━━━(゚∀゚)━━━━━━ !!
なんかさぁ〜、Pearからインストールしたら、 /bin以下の 何とか.sh ファイルが無いんだけど。 致命的な勘違いしてる?
なんとかshってなに?
Ethna作ってる藤本さんって、GREEに勤めてるの?
355 :
352 :2006/06/07(水) 14:21:29 ID:???
>>353 /Ethna/bin/ethna.shです。
>>352 それらは全て無くなって、pearコマンドよろしくethnaコマンドになりました。
ただし、pear形式でインスコしたときだけね。
2.x系の事で教えて欲しいんですが、 1.xで書いたスクリプトは2.x系へ 移行できるの? ひょっとして全部書き直さなきゃいけない? 今リリース前でこれからも開発を継続する サイトがあるんだけど、書き直しが必要なら 思い切ってZendにするか迷い中。 みんな2.x系に移行してる?
360 :
358 :2006/06/10(土) 21:11:04 ID:???
>>359 ほんとですか。
俄然やる気が出てきたw
実験環境つくって試してみます。
361 :
nobodyさん :2006/06/11(日) 12:18:38 ID:fVpO3bXE
action_cli ってどうやって使うんですか? $ php action_cli/Hoge.php Fatal error: Class 'Ethna_ActionForm' not found in xxx のようにエラーになります。何か根本的にまちがってる?
362 :
nobodyさん :2006/06/12(月) 10:27:05 ID:m+/HRqpy
>>361 CLI用のエントリポイントが必要。
cp appid/www/index.php appid/bin/hoge.php
してその中のmainをmain_CLIにする。
第二引数に実行するアクションを指定して、
php appid/bin/hoge.php
って感じ。
この辺はドキュメントないから最悪だね。
xmlrpc関係もだね。どこで何かいてどうやって値を返すのか・・・。
>362 書いてよ! てきとーに書いとけば、ふじもとさんが直してくれるはず!
すいません。 Ethnaって言うかフレームワーク自体使うの初めてで、チュートリアルの2つ目までいったんですが、表示されるのって遅くないですか? フレームワークってこんな表示に時間掛かるものなんでしょうか。
>>365 そんなことはないと思うけど
同じものをフレームワーク使わずに書いたら早くでる?
環境とか実行時間とか具体的なこと一切書かずに遅いとかいわれても エスパーじゃないんだから分かるわけないだろうが。
どのフレームワークもコストはあるけど ethnaは軽い方だと思うよ
>>365 まぁ、必要ないものでも色々読み込んでるから多少は仕方ない。
極端に小規模なものには使うメリットはそれほど無いんじゃない?
中規模〜からがフレームワークの本領発揮だと思う。
370 :
nobodyさん :2006/06/17(土) 23:51:24 ID:+PRU9TY8
サンプルコードをたくさん見たいなぁ。 コードアップする場所とかつくったらいいのに。
371 :
nobodyさん :2006/06/18(日) 14:15:09 ID:yWQcwCGW
Ethna で作られていて ソース公開されているのって何があるの?
公式に2,3個サンプルがあったけどDL出来なくなってるっぽいね。 あとはMLにいくつか転がっているよ。 でも、全然少ないからUPとか紹介とか出来るような場所がほしいね。
haltさんのコードはマニアックな使い方してるからなぁ。 ごく普通の、フォーム入力→DBから読み出し→ページ出力→フォーム入力→DB書き出し→ページ出力みたいなのが見たい。
スキーマはなし?
380 :
376 :2006/06/21(水) 01:27:43 ID:???
gjgj
>>376 $ lha -x ez_siteadmin.lzh
LHa: Fatal error: Unknown level header
ってエラーで解凍できないけどなんでかな?
リファラが2chばかりではないか
皆さんEthnaを2系にバージョンアップするときはどうしてます? 1.既存サイトでpearコマンドを利用してアップデート 2.新規サイトを用意してクリーンインストール+同名でプロジェクト作成+古いスクリプトを展開 今のところ2で行く予定なんですが、1でも大丈夫ですかね? 経験者の方いらっしゃいませんか。
symphonyつかえばいいのに
シンポニーってw
よそのFWスレまで来て布教ご苦労様です
symfonyはあるけど symphonyはないから 別の何かだろう
390 :
nobodyさん :2006/06/24(土) 03:49:03 ID:XSR1obdz
名前がアウト
>>386 、
>>388 お前らは名前の由来の一般英単語も知らんのか。。。
これだから中卒ドキュソは・・・
>391 良かったな辞書を持ってて。
395 :
sage :2006/07/01(土) 03:09:03 ID:YtTgigq9
appObjectって使ってます?
使ってます。
使ってないです。
使ったり使ってなかったり。
Ethnaの2.1.2入れてみた。 cli用のディレクトリがあったけど、どこかにサンプル無いかな。
手取り足取り、どこでどうやれば良いか ご教授頂きたいです。
すごい内容だなぁ。 こういう人がどうやってEthna使ってみようと思うのだろうか?
404 :
nobodyさん :2006/07/16(日) 08:55:24 ID:qmXQomWm
appObject使ってない人はO/R何使ってんの?
>>404 AppObject使う利点は、すでにActionFormとの連携ができてるところだけだから、
自前のActionForm extends Ethna_ActionFormを作って、その部分を解決すれば
なんでも使えると思う。
Ethnaはその辺の自前拡張性が楽でいいね。
>>405 >Ethnaはその辺の自前拡張性が楽でいいね。
別にethnaに限った話でもない
AppManagerのクラス内から $db =& $this->backend->getDB(); のようにDBを呼び出そうとすると Fatal error: Call to a member function getDB() on a non-object って怒られちゃうんだけど。 どうやったDBを呼び出せるの? 使い方間違ってる?
408 :
nobodyさん :2006/07/22(土) 17:33:53 ID:GB10SsDy
たしか $this->db でいきなり使える。
ありがッツゥーゾ でけたす
actionやviewから $smarty->is_cached とか使いたいんだけど、どげんすればよいとですか?
Ethna_ControllerのgetTemplateEngine()呼び出せば? 2.3.0からobsoleteだけど。
>>411 挙動は変わったけどobsoluteではなくね?
changesに「Ethna_Controller::getTemplateEngine()はobsoleteとなりますので今後はEthna_Controller::getRenderer()をご利用ください」ってかいてあるよ
414 :
410 :2006/07/25(火) 19:41:00 ID:???
>>411 obsolete
obsolete
obsolete
obsolete
416 :
nobodyさん :2006/07/26(水) 18:31:39 ID:fkuJrgoL
すいません、かなり下らない事かも知れないんですが、セッション時に$form.hogeで値は取り出せないんでしょうか。。
417 :
416 :2006/07/26(水) 20:00:48 ID:???
すいません。 初歩的なミスが原因でした。。
EthnaでRailsみたいなスマートURLは使えますか?
つかえる
テンプレートにObject型を渡して表示させるには、 どのような手続きをとれば良いのでしょうか? ActionFormを利用してstringsやarrayは渡せるみたいなのですが、 オブジェクトが分かりません。
setAppNEでできなかったっけ。
ちなみに、*NEつけるとエスケープなしね。
>>422 なるほど、ありがとうございます。
自前でエスケープすればいいんですね。
420です、たびたび申し訳ありません。 試してみました。 object(test)#12 (2) { ["name"]=> string(6) "なまえ" ["value"]=> string(6) "あたい" } という内容のオブジェクト$testを $this->setAppNE('test',$test); として tpl側で {$app.test->name} {$app.test->value} としても何もでてこないのですが、設定の仕方がわるいでしょうか・・
afを書き忘れてしまいました。 $this->af->setAppNE('test',$test);が正しいです。 これでもやはり何も表示されません。
>>425 tpl側で
{$app_ne.test->name}
{$app_ne.test->value}
あと自前でエスケープ処理を書くより
Ethna_Util::escapeHtml の方がよくね
>>426 ありがとうございます。できました・・!
Ethna_Util::escapeHtmlというのが用意されているんですね。
勉強になります。
Ethna は携帯サイト用の機能を用意しないの?
そのうちじゃないの
431 :
nobodyさん :2006/08/11(金) 18:27:52 ID:M/sj5kXS
Ethna2.1.2 + ADOdb + PostgreSQL でやってる人いたらおしえて この組み合わせで AppObject使うの危険ですか?
MySQLしか使えないよ。
というわけで、Ethnaは使いづらいです。
他のO/R使えばいいやん
O/Rマッパなんていらん
たしかに0/Rマッパなんてなくてもかまわないよね。 それにフレームワーク自体もなくてもかまわいない。
>>436 そうだな。それからおまえもいなくてもかまわない。
喧嘩はやめて! セックスしなよセックス!セックス!
次バージョン マダー
如何上手くいかないのかぐらいかけ
じぁあ、エスパー呼んでこい
actionじゃなくてviewの方でsessionの値を得るにはどうしたらいいんでしょうか?
sessionオブジェクトを取得しろ
>>446 えと、それはどうすればいいんでしょうか?
基底クラスのコンストラクタくらい見ようよ
449 :
447 :2006/08/18(金) 18:04:51 ID:???
/app/view/hoge1/hoge2/hoge.phpで extends Ethna_ViewClass したクラスの中で $Serial= $this->session->get('hogeSerial'); として、セッションからユーザシリアルを取得しようとしてるんですけど Fatal error: Using $this when not in object context in hoge.php line ... とエラーがでるんです。 環境はwin2k、apache2.x、php5.x でやってますけど、何が悪いのかわかりません。 ヒントだけでも教えてください
sessionオブジェクト取ってこいや
$_SESSION使えや
452 :
447 :2006/08/18(金) 20:04:50 ID:???
var_dump($this->session)してみろや
454 :
447 :2006/08/18(金) 21:25:07 ID:???
>>453 Fatal error: Using $this when not in object context in hoge.php line ...
と同じエラーがでます。
本当にPHP5か?4じゃねぇの?
winXP、apache2.x、php5.x だけどそんなエラーでませんな。 backendからセッションオブジェクトとってきて使ったらどうですか。
あー、staticなメソッドから$this呼んでねぇか?
オブジェクト指向を勉強するには丁度いいかも。
コントローラーから呼びだすコンポーネント(Ethna_AppManagerを継承していない素のクラス)にDBのコネクションを持たせたいのだがEthnaの持っているコネクションを渡す方法って引数しかない? Singletonとかの形でコネクションを持っているところがあるといいんだけど
DBget!!!ズサ━━━━⊂(゚Д゚⊂⌒`つ≡≡≡━━━━!! ってやりゃいいじゃん
Smartyのプリフィルタプラグインで出来るんじゃない?
463 :
nobodyさん :2006/08/28(月) 16:19:13 ID:WBoTQIam
質問ですが・・・。 tplファイルで配列を表示させる方法を教えてくれませんか。 setAppだと通常の変数しか定義出来ない・・・ ↓こんな感じに書いて、array data にテーブルhogeの一覧を格納したいのです。これだと動かないですけど。 function preforward() { $db =& $this->backend->getDB(); $result =& $db->query("select * from hoge"); $i = 0; while ($data[$i] = $result->fetchRow()) { $this->af->setApp("data[]", $data[$i] ); $i++; } }
>>463 >setAppだと通常の変数しか定義出来ない・・・
そんなことはなくて、普通に配列が格納された変数を渡せばいいだけ。
465 :
nobodyさん :2006/08/28(月) 16:55:38 ID:WBoTQIam
>>464 これで動きました。ありがとうございます。
while ($data[$i] = $result->fetchRow()) {
$i++;
}
if ( $i > 0 ) {
$this->af->setApp("data", $data );
}
466 :
461 :2006/08/28(月) 21:08:49 ID:???
>>462 プリフィルタ書いてやってみる事にします。ありがとうございました
俺ならskelのテンプレに{include}書いちゃって、 ethna add-template hoge するかな。
俺の場合まずレイアウト用テンプレートを用意して Ethna_ViewClassをextendsして forward()でforward_pathをレイアウト用テンプレートのパスに置き換えて 元のforward_pathをsetAppしてレイアウト用テンプレートで {include file=$app.forward_path} とか出来るようにする感じかな んでレイアウト管理マネージャ作って $Layout->disable();とか$Layout->set('admin');とか出来るようにしてる
469 :
nobodyさん :2006/08/29(火) 08:11:57 ID:yZ1+igoY
Ethnaを使い始めたんですが、サイトを構築しているうちに 静的なコンテンツが半分以上だということが分かりました。 1つのビューに対しては、1つ以上のアクションが必要なので たとえば、サイトの説明ページを1ページ増やすたびに 何もしないアクションを追加していかなければいけないと 思うのです。これは、そういうものだと諦めるしかないので しょうか? これまではフレームワークを使っていなかったので、Web デザイナーさんに会員認証などの処理を含んだPHPテンプ レートを渡して、ある程度自由に書いてもらっていたのですが、 アクションを追加しないとページの追加などができないのは 結構厳しいです。
CMSを作れば
>>469 自分も今似たような状況にある。
なんとか効率よくテンプレートだけを使用できないかなと思ったけど
結局、静的(半静的)用のテンプレート周りだけEthnaと切り離してやることにした。
ちなみに、↑の半静的ページっていうのは、認証結果なんかも全部必要ないページね。
認証結果や他のEthnaと結構かかわってくるようなページは全部Ethna通してる。
いやだからCMSを作れば
っつーか、静的コンテンツ表示用の共通アクションを1つ作ればよいだけでは。 他のパラメータでビュー指定して。
マネージャーとか必要ないのは読み込ませたくないんじゃない?
EthnaはデフォルトでXSS可能なのがどうもね。 サンプルでXSS可能なものが多いし。
Ethna_Plugin_Logwriter_File.php に手を入れたいのですが、 例えばEthna_Plugin_Logwriter_Fileを継承して 自分で書いたコードでオーバーライドしたとして そのclassをどういう手続きを踏めば、 使えるようになるのか、だれか教えてちょうだい。
そのクラスのオブジェクトを生成すれば使えるようになるわけだが。
479 :
477 :2006/09/06(水) 14:57:37 ID:???
おっしゃる通りなのですが、、、 元のLoggerって生成することなど意識せずとも使えます。 自作のものも生成することなく元のLoggerと置き換わるような 形で使いたいのです。 Controllerの $class_default['logger']を自作のものに書き換えればよいのでしょうか?
Controllerの$class
481 :
477 :2006/09/06(水) 16:38:38 ID:???
Controllerの$class コメントのTODOにずばり書いてあった。。。OTL
PHP5.0のEthnaの2.1.2ですけど、AppObjectでgetしたあとremoveすると $conditionがNULLでWHERE IS NULLとかいうSQLになっちゃう...。 $key, $key_type付きでwhere付きのgetはできるのに、getせずにインスタンスしたそのままでremoveしてもかわらず... 皆さんはちゃんとうごいてます?
>>482 なんかよくわからないけど、いままで変な挙動したこと無いから何か間違ってると思う。
AppObjectでgetしたっていうのがよくわからない。
AppManagerでgetObjectPropとかgetObjectListとかじゃなくて?
AppObjectでgetするのは、AppObjectのpropだけだよね。
新しく作りたいならnewだし。
484 :
482 :2006/09/07(木) 16:25:20 ID:???
わかりづらかったですね、ご迷惑おかけしまいた... $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] のエラーで返されます
485 :
483 :2006/09/07(木) 19:29:19 ID:???
これだと、オブジェクトを2個作らないで$config1->update();の方がいいと思うけど、 まぁそれはおいといて。 $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をチェックするのが吉と、
$config1 = new してるのに何故 $config->get() typo?
トランザクションや複数テーブルを使用するときなどに どうしても生SQLを発行する場面があると思うのですが、 AppObjectを使ったりSQLを書いたりするコードが混ざっていると 気持ち悪い(というか不適切なコード?)な気がします。 実際にEthnaを使っている方はどうされているんでしょうか?
>>487 俺の場合、どうしても生SQLのときは、ManagerにSQL発行メソッドを作るかな
controllerにsmartyのプラグインを登録できるのはわかってるけど、 どこに記述したいいのか、どこにファイルを置けばいいんでしょう? どこに書いても、libやappにおいてもだめだし 携帯向けにsjisのページが作りたいとおもったけど開発ページにはoutputをどこにおいたらいいの書いてない...
まことにすいませんが、事故解決しました、お手数おかけしました。 原因はIncludeパスがずれてたみたいです。 そこはみたんですけど、そのfunctionはどこに書いてどこにおいたらいいのかわからなくて。
そろそろ2.3.0 preview3出てほしいなぁ。 ロードマップでは未到達かもしれないけど、コンスタントに リリースしてくれたほうが嬉しい。というか、はやく2.1.2から 乗り換えたいので頼んます。。。
mixi の雑談でpreview3は、9月末でるかも、らしい
494 :
nobody :2006/09/19(火) 15:05:49 ID:l653wI+U
Ethnaで出力結果を(html形式のファイルに)書き出す為の 専用のmethodはないのでしょうか? Ethna_RendarerのgetEngineとかいうのを使ってfetchするしかないのでしょうか?
497 :
nobodyさん :2006/09/19(火) 22:37:17 ID:R6sen3Jl
>>495 そのメソッドは無いね。
フィルタ使ってob_で拾うとか、いろいろ手段はあるけど。
>>496 mod_rewrite使えば可能。
>>496 Ethna_Controller.php の ChangeLog にこんなのがある。
> Ethna_UrlHandlerクラスを追加(ステキurl対応)
これに期待する。
499 :
nobodyさん :2006/09/19(火) 23:27:54 ID:gBF89jCS
エラーのハンドリングについて、指定したテンプレートが見つからない 場合と、データベースに接続できなかった場合のエラー処理って どこで行えばいいのでしょうか? どちらもフレームワークに任せてしまっている部分の処理なので いまいち解りません…orz 環境はPHP 5.1.6 + Ethna 2.3.0-dev(CVS)です。
>>494 試してないので恐縮ですが、json.tplを出力しようとしている
ということは、Flare_View_Jsonクラスのforward()をオーバー
ライドしていないのではないでしょうか?
501 :
496 :2006/09/20(水) 00:53:00 ID:???
502 :
nobodyさん :2006/09/20(水) 14:30:41 ID:Ni5iDH7a
デフォルトのテンプレートディレクトリをja以外にするにはどこに書くのが正しいですか?
>>502 App_Controller::getTemplatedir
>>494 間違えて、preforwardにコードを書いていません?
>>505 あんたopenPNEの人?
その語尾がキモイ。
510 :
nobodyさん :2006/09/21(木) 04:53:57 ID:uR4E3gkh
ありがとうございまつw
511 :
sage :2006/09/21(木) 19:25:16 ID:amkCKdmG
>>500 >>504 ご指摘ありがとうございます! ご指摘どおりpreforward()をオーバライドしていました。
ですが、forward()に書き直して見ましたが、駄目でした。
メールアドレスにタイプしても、なにもエラーが表示されません。
onkeyup='alert("key Up");'なら動作するのでjavascript自体は問題なさそうです。
ためしに、Flare_View_Jsonのforward()でprint_r($json_object)と記述して、
送信ボタンをクリックすると意図したエラーが表示されるのですが、
上記を記述しないと、Web画面上は真っ白が表示されます。
※/etc/flare-ini.php で 'debug' => 'true'としてます。
う〜〜ん、ヘルプ プリーズ。
cli以外でスケルトン作成できんとですか? phpeditor使いたいとです
cliでのスケルトン作成に何か不満が? まぁスケルトン参考にして、必要な物を自分で用意すればいいじゃないか
フォーム画面->確認画面->処理 という流れのアクションが30個ほどあります。 確認処理が地味にうざいのですが、 確認画面の部分を30個分テンプレ用意する方法と、 確認画面の部分を変数に入れて1つのテンプレから動的に確認画面を表示 させる方法を思いつきました。 できれば後者で行こうと思いますが、 もっと良い方法やスマートな記述法があれば教えてください。 また、今回のような場合に使えるメソッドはないでしょうか?
なんでEthnaのテンプレートディレクトリはtemplate/ja なの? ja
ja がなければないで動くから、ja ディレクトリ消してる。
どうしてjaってディレクトリを用意してあるのかが気になるんですが
全世界言語対応をにらんでる
CVSリポジトリに久々にコミットがあったぽいね。 preview3を待ち望んでる身としては嬉しい限りだけど 9月末に出てくれるかな。。。
画面からフォーム値を取得するのに、わざわざActionFormの中に記述するのが面倒なんですが なんとかならないんでしょうか?
>>520 記述するのが面倒ならASP.NET+Visual Studio使ってみてはいかがでしょうか?
一考の価値はあるかと。
EthnaEditorってのもあるけど。
ASPはちょっと・・・・ コピペでがんばります。ありがとう
>>520 setFormVars()をオーバーライドするとか。
mod_rewriteでCoolURIにしてるんだけど、POSTだと$_POSTの内容しか
取得しないので、自分で追加してる。
$_REQUESTから全部取らないのってメモリ節約のため?
それとも指定以外のフォーム値は受け取らないというセキュリティへの配慮?
意図しないフォーム値は使わないだけだから、とりあえず全部格納しても
問題なさそうだけど、理由があるなら教えて偉い人。
session値をDBに格納したいんですが
>>290 よりスマートな方法ないでしょうか?
preview3では是非、?action_(アクション名)=trueを/(アクション名)という形式でアクセスしたいもんだ
>> 525 なんでそんなのを標準にしたいのかはわからんが、今でも _getActionName_Form()の上書きでできるし、 CVSではUrlHandlerも追加されてるぞ?
>>525 その方法が標準になった場合って、サブミットボタンでアクションを振り分けるのって
できなくなるよね?あったら教えてください。
perform()
{
if ($this->af->get('submit_action_a'){
.........
} else if ($this->af->get('submit_action_b'){
.........
}
}
とかは無しね。もしかして、それでアクションチェーンがどうたらとか
言ってる奴らがいるのかな?
まあスマートルータは流行りだから そのうちEthnaにも取り入れられると思うよ
Ethnaのサンプルみたんですが、DBにアクセスするクラスは複数のActionから参照されるような つくりをしていましたが、Action別にそれぞれ用意したほうが分かりやすくないですかね? みなさんはどうやってますか?
Action別に作った場合に、単純に変更作業の時に コードがばらけていて面倒とかはあると思いますよ。 オブジェクト指向の勉強とかするといいと思いますよ。 (語れる程詳しくは無いので、語らないですけどw)
Ethnaはオブジェクト指向を勉強するきっかけとしてはなかなかいいかもしれないね。
逆に、複数のActionで同じ処理が使われている場合、変更があったときに すべての使用されているActionを見直さないといけないっていう問題がでると思うんですよね。 こういうのって画面単位で分担作業するものだから、お互いに変更時に支障がないように 作るものなんじゃないかなぁ。
「想定していなかった新機能を追加」とかでもやらない限りそんな大きな仕様変更はやらんでしょ それがどんな作りなのかは分からんけど、どうしても回避出来ないよっぽどの理由がない限り共用にしとくのが無難
>>536 そうなのかぁ
ということはいろんな処理に使えるようにSQLはなるべくシンプルな処理にしておくのが無難なのかな
複数Joinとかして、1つの画面に必要なデータをいっぺんにとってくることもできるけど、
ほかの画面では不要なものが多すぎて使えないってこともあると思うし。
なんか微妙だけど、共通化(オブジェクト指向ではない)しようと思います。
ありがとうございました。
>>537 1年前の俺みたいだ。w
あと半年ほど使いまくってEthnaで10個くらい同じことやれば
「あー、この辺共有か」とか分かると思う。
自分はもうEthna使わないでPHPって書いてないからな。
他は満足してるんだけども Ethna_AppObjectの検索部分が使いづらくてたまらない $db->getall();//テーブル全レコード取得 $db->search($column_name,$value);//$column_nameが$valueのレコードを取得 俺の使い方だと、これだけで8割方、用が足りるんだが・・
>>539 全部レコード取得
$this->appmanager->getObjectPropList('AppObjectClassName');
$valueのレコード
$this->appmanager->getObjectPropList('AppObjectClassName', null, array($column_name) => new Ethna_SearchAppObject($value, OBJECT_CONDITION_EQ));
後者をラップするメソッドをAppObjectの基底クラスに作ってやれば、そんな面倒じゃないと思うけど。
ORMを作ろうとしたときinsert/update/delete は簡単にできるけど、 selectは様々なバリエーションがあってむずいな。 joinとかhavingとか、そのへんまでスマートにこなしてるORMってある? RORのActive Record が一番ですか?
542 :
539 :2006/10/02(月) 14:09:24 ID:???
複数DBの使用法がよく分かりません、
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',
でしょうか?
試してから聞け
>>544 上は試して動作したからハイOKという類の内容ではない気が。
なんで? 全く違うDSN書けば違いがわかると思うんだけど。
>>543 概ねあってるけど、Controllerの$dbにも書いておくべし
DBでsessionしたいわけなんですが、 普通に自分で関数カキカキしてactionディレクトリあたりに 入れればつかえる??
549 :
nobodyさん :2006/10/06(金) 10:09:32 ID:O2kp1NLj
ethnaの公式サイト見ると、 app/action 階層の下に system1_hoge.php system2_hoge.php と設置する場合の手順が書いてありますが、 system1/hoge.php system2/hoge.php という風にアクションファイル自体を system1 とsystem2 で設置ディレクトリを分けたいと考えています。 この場合のアクション定義などが非常にこんがらがってしまったのですが、 どなたか助言おながいします。
Call to undefined function: getrow() のエラーが出るんだけど、 PEARのDBクラス継承してるんですよね? ほわい?
>>551 サンクス
てか継承してないのかよ、表記修正してくれよ、
とおもいますた
アクションクラスで $this->af->setApp('hairetu', $hairetu); して tplで下のようにしてみたんですが、機能しません。 {section name=cnt loop=$app.hairetu} ほわい?
554 :
nobodyさん :2006/10/06(金) 15:35:21 ID:Ky3gzt1x
存在しないファイルをrequireしようとしたら fatal Errorになったんですけど、こういう場合のエラー処理は ethna上でのエラー処理に組み込むことはできないんでしょうか?
E_ERROR(FATAL)はエラーハンドラでも上書きできない
今更ながらEthna 2.3.0 Preview2リリースを入れてみたんだけど、
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
>>556 なんかねー、そのへん俺もよくわからんのだけど、とりあえず
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
>>557 それは面倒ですなw
Ethna_Controllerの$classメンバに追加するのが標準的なやり方
見たいなのでもうちょっと簡易な方法があるといいのだけれど。
ウェブサイトには「(不評なら戻します@preview2)」って書いてあるけど
MLでは話題にすらなってないし、このまま定着するのかな?
とにかくサンプルかもうちょっと詳細なヘルプが欲しいです。
繰り返し部分を別ファイル(hoge.inc.php)にして require() して使いたいのですが、 どうすればいいでしょうか? require("絶対パス/hoge.inc.php"); しか思いつきませんでした。
ClassFactoryからgetManager()するならContollerでのincludeも $classへの追加も不要でしょ。 多少面倒な気もしてるけど、俺はActionClassで毎回 $hoge_manager =& $this->backend->class_factory->getManager('Hoge'); $hoge_manager->getHogeList(); とかやってる。もしかして間違ってる?
562 :
557 :2006/10/08(日) 00:31:43 ID:???
>>561 いや、君が正解だと思う。
おいら、$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();
と同等と思える。
App_ActionClassのコンストラクタで parent::Ethna_ActionClass($backend); $c =& $backend->getController(); $manager_list = $c->getManagerList(); foreach ($manager_list as $k => $v) { $this->$k =& $backend->getManager($v); } こうしてやれば、従来どおりなわけだが
564 :
563 :2006/10/08(日) 13:34:23 ID:???
フォーム値の検証とフィルタについてなんですが、 フィルタをフォーム値検証の前に実施する方法は無いでしょうか? ある変数を半角英数字しか受け付けないように設定、 かつ全角で受け付けたときには自動的に半角にするようフィルタを設定 しているのですが、 全角で入力してしまうと、validate()が0にならないためです。
実際のところ、クラスのメンバ変数として何が定義されているかわからないのに Controllerの$managerに追加された名前で$this->hogeとアクセスできてしまうのは 問題ありまくりだし、気持ち悪かった。 AppManagerの呼び出し方にワンクッション追加されただけだから、個人的にはそこまで 面倒は感じてないし、記述が長いならメソッドひとつ仲介させれば済む話だと思う。 562氏の言うとおり、ActionFormやAppManagerがAction/Viewを問わずリクエスト内で 自由に使えるのは他のフレームワーク(symfonyとかZend Frameworkとか)には無い考え方で 自分がEthnaを気に入った理由のひとつだけど、そのメリットは無くなってないんじゃないかな?
567 :
nobodyさん :2006/10/09(月) 18:37:23 ID:NhVn4oaT
毎回全てのAppManagerを読み込む従来どおりより新方式のほうがいいなー。
568 :
562 :2006/10/09(月) 19:52:52 ID:???
>>566 >問題ありまくりだし、気持ち悪かった。
実際に問題と言うと
・DB接続しなけりゃ使えない
・Manager全てnewしてるから(シングルトン使ってるとはいえ)重い
くらいかな?他に何かある?Managerって作ってもせいぜい20くらいだったから
重いとは思わなかったけど。
キモイのは確かに気持ち悪かったけど、「PHPだしいいじゃん」という気にもさせてくれる。
その辺が「絶妙に妥協」なのかなと。
で、気持ち悪さを払拭しようとすると、Action/View/AppManager/AppObjectそれぞれを
ラップしたクラスでoverloadを使って、プロパティへのアクセス方法を定義してやれば
ちょっとは気持ち悪くなくなると思う・・・。
http://jp2.php.net/overload 自分的には「前のが便利、だけど(きっとメリット色々ありそうだから)新方式に従います」
って感じ。
569 :
566 :2006/10/09(月) 20:38:58 ID:???
んーと、ActionClassのコンストラクタとかでチェックもせずに 上書きしてるから、メンバ変数が破壊されるってことです。 既存のもので言うと、試しにControllerの$managerに $manager = array( 'af' = > 'AirFrance' ); とか入れてみるとActionFormが使えなくなるのが解ると思う。 ($this->af はActionForm じゃなくて AirFrance になったからね) $managerに設定する値についての注意事項も書いていないし、使う側が 注意していればいい、というには危険な仕様じゃないかな。
570 :
562 :2006/10/09(月) 21:02:06 ID:???
>>569 >んーと、ActionClassのコンストラクタとかでチェックもせずに
>上書きしてるから、メンバ変数が破壊されるってことです。
あぁ、なるほど。すっごい盲点でした。
managerが増えすぎていった場合、ハマりポイントになりそうですね。
PHPだし。 厳格なのがよければにしとけば。
抜けた。 Javaにしとけば。
本体を自分でいじりたくないなら、2.3.0pr1以降か、CVS版をつっこむくらいしか。 あとは、継承してそこにパッチを当てておけば、後ほどバージョンアップしても気にならずに済むかも。 stableの保守も考えてほしいよね。
関数ぱっと作ってperform()内で使いたい場合、 function kansuu()をperform()内に書いて $this->kansuu で呼び出すだけでOK?
>>575 素で言ってるならPHPのマニュアル100回読み直してこい
PHPっつーか、オブジェクト指向の本読んだほうがいいね。
ethna から pear 使用するためにはどうすればよかとでしょうか。
>>578 作ったプロジェクトにあるlibフォルダに解凍する。
580 :
578 :2006/10/20(金) 11:47:43 ID:???
>>579 サンクスです、申し訳ないついでに
呼び出しの方法もきぼんぬ
>>580 579じゃないけど
Controllerでincludeするのが一般的だと思う。
使うときは普通に使いたいところで使えばいい
smartyフィルタってsmartyのプラグインディレクトリに置くんですよね? フィルタが見つからないって言われる…
583 :
582 :2006/10/21(土) 11:27:38 ID:???
自己レスです。 コントローラーで、requireしなきゃいけなかったんですね。 なんかめんどくさいような。
>>584 >>582 は間違いだと思うが、他は何がおかしいの?
俺も同じようにしてるんだけど、何か違う方法でもあるの?
586 :
nobodyさん :2006/10/22(日) 21:38:10 ID:bEm1HQtN
とあるページにGETとかで送られてきた値を、ActionFormのチェック機能で、 customで関数を作って値をチェックしたいとします。 で、それは送られてきた値がDBに該当のレコードがあるかどうかっていう感じ のことをしたいのですが、チェックするメソッド自体はManagerに実装してます。 それでActionFormクラス内にcheck_valueというメソッドを作り、そっからManager クラスを呼びたかったんですが、呼べませんでした。 公式サイトには、「上の3以外のクラスで使いたい場合は*2、Ethna_BackendのgetManager([manager_name])で取得できます。」 って記述があったんですが、ActionFormはbackendも持ってないみたいで取得できず…。 こういう使い方は想定してないんでしょうか? それとも俺のやり方がクソなんでしょうか。 まぁprepare関数内でやればいい話なんでしょうけど…。 せっかくなんでActionForm内でチェックしたいです。 何かいい方法あれば教えてください。
>>585 _smartyプラグインは登録もしないとダメだよね。
_PEARってControllerで全部includeしないでしょ。使うところでincludeしてるだけで。
>>586 backendじゃなくてcontrollerとれ
smartyのプラグインは、コントローラの$directory['plugins']に任意のディレクトリを指定しておけば そこをsmartyの$plugins_dirに登録してくれるからそれでいいんでない?
590 :
nobodyさん :2006/10/23(月) 12:53:41 ID:iU9TDYVm
>>588 すみません。どうやってとればいいんでしょうか?
ActionFormクラスのコンストラクタは確かにcontroller持ってるみたいですが、
メンバ変数には入ってないぽいのでEthnaのソースいぢるしか方法思いつきません…。
>>590 試してないけど、
$ccc =& Ethna_Controller::getInstance();
ではだめかな?
593 :
582 :2006/10/23(月) 15:53:14 ID:???
>>589 pluginディレクトリを指定するところがあったんですね。
見落としていました。勉強になります。
個人的には解決です。ありがとうございました。
VIEWのpreforward内で、 アクションクラスで使った変数を取得するには どうすればいいんでしょうか? 作成中のソフトで データベースの status というフィールドを 1〜5 に割り当ててるんですが、 表示させるときには 1->普通 2->駄目 3->最悪 という感じで数字ではなく日本語で表示させたいと思ってます。 よくわからんのですが、 この1を普通と表示させるようなことは ビューでするというのが一般的なポリシーになるんでしょうか。
どこまで汎用的にするかによると思うけど、viewかtemplateでいいんじゃね?
>>594 基底のViewクラス作ってstatusを全部のViewで有効にするか(その場合Viewは省略しないこと)
全てのstatusを継ぎたいViewClassでextends ViewWhatStatusDefined して
そのpreforwardメソッドでド頭に
parent::preforwardを全部させておけ。
597 :
nobodyさん :2006/10/25(水) 04:26:17 ID:QhoBwbI3
>>469 おれは、
/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');
}
ってやってるよ。
# かなり古い記事に反応していまった自分が痛い(汗)
痛いね 473でほぼ同じの出てるし
ウェブサイトの左側部分を動的なプルタウンメニューを置いてます。 右側がメニューで選択した内容を表示させる部分としてます。 この場合、左側部分はどのアクションでも常に同じ内容を表示しているわけで、 できれば include とかすると楽なんですが、 ethnaでincludeのが適切なのか良く分かりません。 (actionクラスでincludeかつtplでinclude??) またincludeする場合も相対パスでどうやって記述すればいいのか、 が分かりません。 (よく本体は設置場所を動かすので、影響を受けないように相対パスで 指定したいと考えています。) 助言おながいします
601 :
599 :2006/10/27(金) 13:23:57 ID:???
>>600 レスサンクスです
「SmartyPluginに下記の関数を用意」のところなんですが、
直接smarty自体を弄る必要が出ますよね?
ここなんとかならんでしょうか?
602 :
599 :2006/10/27(金) 13:38:43 ID:???
×直接smarty自体 ○直接ethna自体 でした 極力ethna本体は弄りたくないと考えています
>>599 俺はapp以下にAPPID_SmartyPlugins.phpを作って、Controllerでincludeしてるけど。
604 :
599 :2006/10/28(土) 12:37:29 ID:???
>>600 >>603 おかげさまで上手くひとまずは上手く行ったのですが
なぜかメインアクションのテンプレから
別のアクションをincludeすると、ループが発生します。
別のアクションというのは単にテンプレを表示させるだけの
非常に簡単なものです。
またそのアクション単体での動作も確認できました。
メインアクションもインクルードをしない場合の動作は確認できました。
しかしなぜかメインアクションのテンプレから include すると
ループが発生してしまいます。
どなたかヘルプみー
605 :
nobodyさん :2006/10/28(土) 17:56:31 ID:FIh0kQ4t
ちょっと行き詰ったので、お知恵を拝借させてください。 複数のAppManagerでの処理にまたがるトランザクションの方法について 悩んでいます。 たとえばポイント制の物販(?)のようなものがあるとして、顧客情報と 購入情報のAppManagerを用意しました。購入処理を行った場合、顧客 情報からはポイント減算処理、購入情報には履歴を書き込みます。 単位の処理だと、 $user_m->userPoint( 30 ); // 30ptを消費 $sales_m->addHistory( ... ); // 購入履歴を追加 のように実装できますが、これらは同じトランザクション内で処理される 必要があります。 一方のManagerから他方のManagerを呼び出して処理をまとめてしまうことも 可能ですが、Managerの独立性が保たれないのでそれは気持ち悪いです。 これらのManagerを管理する別のManagerを作成して、そこでトランザクションを 制御するというのも考えましたが、機能ごとに分離すると数ばかり多くなって 収拾がつかなくなってしまいました。(かといって統合すると用途がごちゃごちゃの Managerができてしまう罠…) 続きます↓
606 :
605 :2006/10/28(土) 17:57:43 ID:???
(続きです↓) 呼び出しているのはActionClass/ViewClassなので、そちら側でトランザクションを 制御することも考えましたが、はたして考え方が正しいのか自信がありません。 Ethna_ActionClassを継承したHoge_ActionClassに function beginTransaction() { $db =& $this->backend->getDB(); $db->begin(); } とか書いて、実際の処理の中で function perform() { ... // 購入処理 $this->beginTransaction(); $result = true; $result |= $user_m->userPoint( 30 ); $result |= $sales_m->addHistory( ... ); if ($result) { $this->commitTransaction(); } else { $this->rollbackTransaction(); } ... } のように実装したらどうだろうかということです。ActionClassからbackendのデータベース オブジェクトを直接弄ることに若干抵抗があるので、いまいち踏み切れません。 こんな場合、皆さんならどのように実装しますでしょうか。あるいは既に実装している例など ありましたら大変参考になります。宜しくお願いします。
Action で指定したビュー名と同じ名前のテンプレートがなければ 実行できないんでしょうか? ビュー名と違うテンプレートを動かそうとしてみたんですが、よくわかりません。 どなたかやったことありませんか?
>>607 ビューを省略したら同じ名前のテンプレートが使われる。
省略しなければ、違うテンプレートを指定できる。
>>607 Movajiなんかの考え方だとそうしたくなるけど、Ethnaでは
原則としてビューとテンプレートは一対一。
どうしてもやりたいなら、ViewClassのpreforward()あたりで
$this->forward_pathを書き換えるとかで対応できるだろうけど
お勧めはしない。
610 :
607 :2006/10/29(日) 00:07:17 ID:???
ビューとテンプレートは1対1だったんですか。 ちょっと不便ですが、テンプレートの中でテンプレートを呼んで対応しようと思います。 ありがとうございました。
611 :
599 :2006/10/29(日) 09:02:16 ID:???
>>611 メインの処理実行中に同じControllerでtrigger()なんてやったら、Controllerで
管理している諸々のオブジェクトが上書き(破壊といってもいい)されるから、動作が
おかしくなっても不思議じゃないと思うけど…。
表示のときに呼ばれるから他の処理は終わっているので大丈夫という考えは
強引というか激しく危険。まあ、いずれにしてもグローバル変数にController
オブジェクトが置かれている以上、1リクエスト内で複数のControllerを走らせる
ことも正しく動く保証がないので、こういったアプローチはEthnaでは難しいと思われ。
# 間違ってたら、ツッコミよろ
おとなしく親のVewClassにメソッドでも用意して、必要に応じて子から呼び出すような
感じで実装するのが吉かと。
ControllerをgetInstanceじゃなくてnewすれば何とかなるかもしれない。 あとはiframeとか。
>>605 別にManagerからManagerを呼び出しても良いのではないですか?
トランザクションを意識するのはManagerのサービスとしての
窓口(Actionから呼ばれる部分)だけで、その内部では必要に応じて
各Managerが呼び合う。
窓口の最後でそれらの結果を見てCommit/Rollbackする、みたいな。
逆に、Actionからトランザクション制御はしない方が良い気が・・。
615 :
599 :2006/10/30(月) 16:51:11 ID:???
>>612 ガガーーン!!
言われてみれば納得です。
これを想定して全て作っていたので、激しく鬱です。
レスありがとうございました。
読み込んだ現在のアクション値を得るにはどうすればいいでしょうか? 「?act=アクション名」をトリガーにしているので、 これを使うのもいいカナと思ったんですが、 actionformで毎度指定する必要があるのがしんどいです
$this->session->set('hoge', 'ほげ'); で設定するのと $_SESSION['hoge'] = 'ほげ'; で設定するのってどう違うのでしょうか? $this->session->set('hoge', 'ほげ');したやつを echo $_SESSION['hoge']したら読めてしまうのですが・・・。
getCurrentActionName()
>>618 そこだけ見るなら同じ。
startとかが少しお得。
>>622 Ethna_Util::getDirectLinkList()内で、10と決め打ちされてるので、smarty側でcountしてやるか、Ethna本体に手を入れるか、getDirectLinkListをオーバーライドするしかないかな
Ethna_Util::getDirectLinkList()の中で直値でかかれてるっぽい。 Ethna_Utilを書き換えるか、同じ機能を自前で実装するか、コミッタさんに メールしていい感じに直してもらうかかなw あと、このドキュメントではActionClassでページャの処理を行っているけど、 本来こういう処理はViewClassでやるべきだね。
625 :
624 :2006/11/03(金) 16:33:50 ID:???
う、リロードしないで書いたら被った…orz
CVS版で、AppObjectを使って、 $where =& new Ethna_AppSearchObject(1, '='); $filter = array('hoge_id' => $where,); $example =& appID_Example($this->backend); $result = $example->searchProp(null, $filter, null, 0, null); こんなふうに検索したんですが、生成されるSQLの検索条件が、 'hoge_id' != '1' になってしまいます。 どこか使い方間違っているんでしょうか…
$example =& appID_Example($this->backend); は $example =& new appID_Example($this->backend); だよね。 $where =& new Ethna_AppSearchObject(1, '='); は $where =& new Ethna_AppSearchObject(1, OBJECT_CONDITION_EQ);
628 :
626 :2006/11/09(木) 00:28:07 ID:???
>> 627 きちんと動きました! 参考にしたサイトの記事が古かったようです。 ソース読んでみて、定数が使われているなぁとは思っていたんですが、食い違いに混乱していました。 ありがとうございました。
Ethna 2.3.0 Preview2がインストールできません。
環境は、FreeBSD6.1-RELEASE、PHP5.2.0、Ethna2.3.0 beta か preview1
だと思います。
# ethna -v
Ethna 2.3.0-dev
# pear list-channels で、
Registered Channels:
====================
Channel Summary
pear.ethna.jp Ethna PEAR Channel
pear.php.net PHP Extension and Application Repository
pecl.php.net PHP Extension Community Library
__uri Pseudo-channel for static packages
の状態で、
# pear upgrade
http://ethna.jp/pear/Ethna-2.3.0-preview2.tgz を実行したのですが、
downloading Ethna-2.3.0-preview2.tgz ...
Starting to download Ethna-2.3.0-preview2.tgz (120,756 bytes)
..........................done: 120,756 bytes
ERROR: pear.php.net/Ethna: conflicting files found:
Ethna/bin/ethna_handle.php (pear.ethna.jp/ethna)
:
:
というエラーでアップデートに失敗します。
手順がおかしいでしょうか?何かヒントをいただければと思います。
Ethna本体をいじっていないならuninstallしてからinstallすれば?
631 :
629 :2006/11/17(金) 20:33:17 ID:???
>>630 アンインストールしても同じエラーでした。
展開して適当なところに置けばよいはずだと思いファイルを手動で消して
展開したところ、こんどは ethna コマンドで、
# ethna -v
Could not open input file: @PEAR-DIR@/Ethna/bin/ethna_handle.php
置き換えた ethna コマンドをみると確かに、
ETHNA_HOME="@PEAR-DIR@/Ethna"
となっていたので、@PEAR-DIR@ を FreeBSD の /usr/local/share/pear/ に
書き換えたところ、無事アップグレードできたみたいです。
上記の箇所は pear install したときに書き換えられるんですかね?
とにかく何とか解決しました。
お騒がせしました。
下記のページを参考にSmartyにクラスメソッドを追加しようとしています。
PHP 5.2.0/Ethna 2.3.0 preview 2
参考:いつもながら初心者には簡素すぎるマニュアル・・orz
ttp://ethna.jp/ethna-document-dev_guide-misc-smarty_register_function.html これは、
class foo {
function bar($vl) {
return number_format($vl);
}
}
というfoo.phpを用意して、 {ProjectID}_Contlor.phpの$smarty_prefilter_pluginに
array('foo', 'bar'),
を追加してやればhoge.tplにおいて{$app.hage|bar}のように使えるという理解で
あってますか?その場合、foo.phpはどこに置くのでしょうか?
appディレクトリやSmartyのpluginsディレクトリにおいても動作しませんでした。
error messageは以下のとおりです。
Fatal error: Smarty error: [in index.tpl line 22]: [plugin] modifier 'bar' is not implemented (core.load_plugins.php, line 118) in /usr/local/lib/php/Smarty/Smarty.class.php on line 1095
Fatal error: Call to undefined function smarty_modifier_bar() in ・・・
どこに置いてもいいけど、Contorollerでinclude_onceすればおけ 汎用性があるならlib/の下とかでもいいのでわ?
>>633 どうもです。
>>632 を投稿した後にすぐ気がついて、include_onceしたのですが
エラーは変わりませんでした。
あ、ひょっとしてpreview 2には含まれてなくて、cvs版のみで有効な
機能だったりしますか?
明日試してみます>cvs版
635 :
nobodyさん :2006/11/21(火) 00:44:53 ID:l75La6qC
App以下にProject_HogeClass.php というクラスファイルを置いてます。 このクラスファイルの中でActionClass内で使用している 変数などを取得するためには引数として渡す以外にどんな方法があるでしょうか? たとえば、ActionClassで $this->session->set("hoge", "ほげ") としている場合、 Project_HogeClass.php で hogeセッション値である「ほげ」を 取得するためにはどうすればいいでしょうか? $ethna->session->get('hoge') では間違ってるでしょうか? (ちなみにこれではうまく行きませんでした)
>>635 そういうことしようと思ったことないから想像だけど、
$this->session->set('hage', 'hoge');
って登録したんなら、それを取り出すのは、
$this->session->get('hage');
なんじゃないの?
どこから$ethnaは出てきたの?
>>634 preview2でも使えると思いますよ。
えと、class foo {} じゃなくて functionだけ書いておくのです。
>>635 あんまし美しくないかもだけど、こんな感じかな?
$c =& Project_Controller::getInstance();
$b =& $c->getBackend();
$b->session->get('hoge');
個人的にはHogeClassのメンバに$backendを持っておいて
コンストラクタで参照を渡すと思う。他にも使えるからね。
$this->backend->session->get('hoge');
HogeClassのメソッドでは、こういう風に呼び出すような。
>>637 上手くいきました。感謝!
/**
*@vararraysmarty prefilter定義
*/
var $smarty_prefilter_plugin = array(/*
*TODO: ここにユーザ定義のsmarty prefilter一覧を記述してください
*
*記述例:
*
*'smarty_prefilter_foo_bar',
*/
array('foo', 'bar'), (1)
'bar', (2)
);
(1)のように書きましたが、コメントどおり書いて(2)もo.k.でした。
(1)の方が後でメンテするときによさそうですね。
640 :
635 :2006/11/21(火) 10:04:22 ID:???
レスありがとうございます
>>636 $thisは自身参照の場合ですよね
>>638 前者はなんとなくは理解できましたが、
後者はあまり把握できてません、、、
ちょっと試したりしてみます、
ありがとうございました。
Ethnaのサイト見て吹いたのがこのスレのやり取りがマニュアルとして そのまま載ってたこと。中の人も見てるんだ。 開発がんばってください。 マニュアル作成ももうちょっとだけがんばってください。ノシ
>>635 マネージャにしちゃ駄目なん?
マネージャならプロパティにsession持ってるし
アクションフォームのvalidate、 javascriptでも確認するようにできませんかね? アクションフォームあたりを継承して、そうしてる人いないでしょうか。 わざわざ確認用のアクション作成するのも面倒ですが、 javascriptで確認動作してくれれば、結構省けると思うんですよね
SQLのインジェクション対策がかなり面倒なんで、 SQL文を自動的にエスケープするようにしたいんですが、 良い方法ないでしょうか? $db->DB を継承しようかと考えたんですが、 ethnaクラスを完全に理解していないもので、 どこで記述するかなど$db->DBの継承の仕方がよくわからんとです
>>646 まあ確かに楽をするためにフレームワークを導入するのに、
そのフレームワークの使い方に苦労する現状は本末転倒だわなw
でもversion 2.1.2でよければ、チュートリアルを読んで順に実行していけば
一通り作れるように書いてあるよ。
version 2.3.0の新機能については同意。まだ開発中だからしょうがないけどね。
最近ふじもと神は更新してますか?
version 2.3.0の新機能イイよ。どんどん楽に融通が効く感じ。 機能知るにはコード追っかけるしかないけどさ、たいした量があるわけじゃないし、 全然「見て分かる」範囲じゃね?
>>649 Ethna工作員乙
利用者数及び使いやすさ、習得期間等でsymfonyに負けんよう精々ガンガレヨォ〜
version 2.3.0をリリースしたらドキュメント強化に取り組んでもらえるとか。 個人的にはUnittest関係のドキュメントをお願いしたいな。 PHP5に移行してからエラーは全てthrow exceptionするようにしてるので その辺も考慮した解説になるとうれしいな。
class Test_HogeManager extends Ethna_AppManager { var $hoge = $this->config->get('hoge'); function abc() { echo $hoge; } } $this->Hoge->abc(); とすれば $this->config->get('hoge') の値が表示されるはずかと 思いますが、上手くいきません。 どこか根本的に間違ってますでしょうか?
>>653 これでどう?
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;
}
}
>>653 var $hoge = $this->config->get('hoge');
が、PHPとして間違ってない?それとも俺が知らないだけ?
いつこの$hogeメンバはconfigのgetを実行するの?
PHP 5.2.0, Ethna 2.3.0 preview 3 な環境でUnitTest(Simple Test)をやってみた。 で、なんとなく上手く動いているようなのだけど、 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 が でますでしょうか?
658 :
657 :2006/11/29(水) 13:55:00 ID:???
やはり上手く動いてないかも。
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してるのがいけないのかな?
659 :
657 :2006/11/29(水) 17:29:08 ID:???
テストで簡単なプロジェクトを作成して、throwやtry、catchを 使わないようにしたらnoticeやExceptionは出ませんね。 SimpleTestとEthnaのどちらに原因があるのか分からないけど、 これらを改造するスキルは無いのであきらめるしかなさそうです。
NoticeはSimpleTestでしょう。 Exceptionはcatchしてないだけじゃないの?
>>660 > NoticeはSimpleTestでしょう。
ですかね。
> Exceptionはcatchしてないだけじゃないの?
それは無いです(たぶん)。
テスト自体は成功するのですが余分なExceptionがでます。
今、例外をraiseErrorに書き換えようか激しく思案中・・・。
一応現象が再現する最低限のコードを・・・。 任意の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が表示されます。 こんな感じです。
665 :
663 :2006/12/02(土) 14:36:09 ID:???
サイトは見れるようになりましたね。
それだけじゃなんとも。 renderer関連を見直しましょう。
またダウンしてないか?
669 :
657 :2006/12/05(火) 19:37:00 ID:???
>>657 ですが、その後ソースを見たりして例外を利用していてもNoticeは
でなくなりました。テスト項目以外のExceptionが出るのは変わりませんが。
とにかく例外は利用できそうなのでほっとしました。
確認画面に関して、何か良いロジックないでしょうか? 作り方次第では非常に簡単にできそうなのですが。 ちなみに確認画面とは、アクションを実行する前の、 一度本当に〜〜してもいいですか?みたいな感じの画面のことです。 自分が思いついた一番楽そうな方法は ・prepare()内で確認フラグがたってたら、returnで確認画面表示、 確認フラグがたってなかったら、アクション実行。 です。もっと楽そうな方法ってあるでしょうか?
Ethnaの2.3.0に乗り換えましたが、AppManager内で etc/hoge-ini.php 内の 値を取得するには、いちいち controller のインスタンスを取得して、Backendを 読み出して、getConfig()して…とやっていかなくてはいけないんでしょうか? なんだかどんどんめんどくさくなっていきますね…。
昔から$this->configで取れるけど?
>>672 質問に対しての回答の仕方がおかしい件について
674 :
671 :2006/12/08(金) 10:00:57 ID:???
>>672 すみません。取れました。
昨日散々やったのですが、何故か取得できなくて・・・。
>>673 意味は通じたのでOK
$sessionに登録されたキー一覧を取得することってできませんか? 自分で登録したキーぐらい覚えとけよと言われたらそれまでなんですが。 セッションに関するメソッドにはそれらしいのがなさそうですね。 [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 )
array_keys
>>673 >質問に対しての回答の仕方がおかしい件について
全然おかしくないぞ。
http://ethna.jp/ethna-document-dev_guide-form-type.html ココを参考に
ファイルのアップロードプログラムを作っています。
単体ファイルなら上手く成功したのですが、
複数ファイル(配列)をアップロードしようとすると、
どうもform値としてわたっていないようです。
フォーム側では
<INPUT type="file" name="up_file[]">
ActionFormクラスで 'up_file'に
'type' => array(VAR_TYPE_FILE),
という指定を行ってます。
どこか誤りはあるでしょうか?
>>678 私もそれ知りたいですね、
今は$_FILEを直接使って逃げようかと思案中・・・
ethnaのメリットが下がりますが。
>>678 間違ってないと思う。
とりあえず、ActionClassで、
var_dump($this->af->get('up_file'));
ってしたらどうなる?
formタグにマルチパート指定は入れてるよな 当然だよな
>>681 単数の場合はOKってんだから、大丈夫だと思うんだけど、678じゃないけど。
あー、requiredをtrueにしてると、array(VAR_TYPE_FILE)はどうやってもエラーになった気がするなー FILEはそもそもが配列なので、そこんとこでethnaがなんか変なことになっていた気がする オレはethnaに適当にパッチ書いて動くようにしてしまった
>>683 >オレはethnaに適当にパッチ書いて動くようにしてしまった
それをぜひ公開して・・・
>>684 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の時はこけるね。確かに。
2.3.0でやってみたけど、複数ファイルもrequiredも特に問題ないよ?
>>685 もその前にis_arrayしてるから問題ないし。
Ethnaではフォーム値に対してActionForm内に関数を定義してフィルタを かけることが可能ですが、この関数をひとつのファイルに収めて各フォーム で共有することは可能でしょうか? function _filter_str2upper($value) { return strtoupper($value); } こういう細かい関数をいっぱい定義しているのですが、各ページに書くのも 手間なので・・・
そのために継承がある。
689 :
nobodyさん :2006/12/12(火) 18:00:26 ID:ymrP8Ip7
683だけど、確かに2.3.0で確認したら、その問題は解消されていたわ 俺が問題に対処してたバージョンは2以前だったけど、 さすがに678さんがそんな古いバージョンを使っているとは思えんし、 なんか別原因と考えたほうがよさそーね
690 :
687 :2006/12/12(火) 19:35:37 ID:???
>>688 なるほど。
{Project_ID}_ActionForm.php に書いておけば良いのですね。
ありがとうございました。
Ethna-usersにRoRの大物キタ━━━━(゚∀゚)━━━━ッ
でかいひとキター
データベーステーブルをいじくる画面作る際に ・新規(new new_do) ・更新(update update_do) ・削除(delete delete_do) の6画面が1テーブル毎に毎回必要になります。 importform() exportform()があるので コーディング自体はそれほど苦ではないのですが テンプレートの枚数が多くなって鬱になってきます。 上手くまとめる方法ないのでしょうか・・
PHP on Ethnaとか… ねーなw
ポエ…名前はかわいいな
696 :
nobodyさん :2006/12/15(金) 14:25:35 ID:dxQfzRie
共有レンタルサーバーで ethnaを使おうと思うのですが、 CGIでPHPを動作させたい場合、 プロジェクト名/www 内を.cgiにするだけでいけます?
>>697 やってみりゃいいじゃん。
まだ借りてないから出来ないとか言うなよ。w
>>698 実際どうなるか、より理論上、どうなるかを聞いておきたいです、
「理論上」なら何だってできるだろ。
EthnaでCLI での使用を想定したスクリプト作っている人いますか? Actionだけ作成して、みたいな感じですかね。 ethnaでやるメリットが少なそうですが。
>>701 バッチ処理とかに使ってる人もいるんじゃないかな。
>>699 揚げ足取ってないで、自分は理論上どうなると思ってるのか書きなよ。
700の言うとおり、理論上ならどうにでもなる。
>>701 Webの方でAppManager類が充実してきてて、CLIでもDB処理したいなーと
思う時は使います。あと、メールの送信とか楽だし。もちろん、Viewレスの
ActionClass::perform()のみね。
>>699 理論上でできないと思ったらそのワケを。
実践してできなかったら、どこで詰まったかを書けばいいんじゃないの?
非常によく悩むんですが、 似たような種類のデータを扱うとき、 そのデータ名の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) としておけばほぼテンプレの変更は必要なくなるわけで。 一方で、分けておくと、ミスなどに気づきやすくなります。 普通の人はどうしてますでしょうか? 自分は完全独学なのでこういうコードデザインなどにひどく悩みます。
普通は分けると思う。 内容にまとまりがある部分は 配列でまとめて渡すのが良いんだろうけど。
>>706 テンプレート内で呼び出されるテンプレートにしちゃって
$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でも使う時に名前変えないですむ意味のある名前つけたいところ
今、サイト落ちてる?
710 :
nobodyさん :2006/12/23(土) 23:49:18 ID:gjDqizfh
落ちてるようですね。困ったーAPIDocsが見たいのに
サイト(というかサーバ)もふじもと神の頭脳のように強くあってほしいもんだな
同じくAPI見たい
自分でphpdocumentator使って生成せよ。
ちと相談というか勘所をお聞きしたいのですが、Ethnaのサイトでは ActionClassのperformメソッドにはあまり処理内容を書かず、AppManagerに ロジックを書くことを推奨していたと思います。 しかし、ビジネスロジックの中にはサイトの中で一度しか呼ばれない 処理が多く、AppManagerがどんどん膨らんでいきます。 こういう場合もperformにビジネスロジックを書くのってやはり推奨されないんでしょうか? 一度しか呼ばれない処理なのにいちいちAppManagerクラスを見に行かねば ならないのは、返って可読性を落とすような気がするのですが・・・。
>>714 程度問題かな。ActionForm値に依存しすぎる場合はAppManagerじゃなくて、
基本のActionClassに記述してそれを継承。
それでも自分はAppManagerに書くことのほうが多いです。
後で別どころで使う可能性もあるので。
または、「とりあえず」performに記述しておいて、後で「あ、前のを使う」と思えば、
その時にAppManagerに移植とかも結構やる。
ただ、一人ならいいけど複数人開発の場合は基本設計をちゃんとしないと混乱するよね。
>>715 どうもです。
現在一人で開発してまして、引き継ぐ人があらわれたとしても複数人での開発には
ならない規模の社内アプリです。
現在は極力AppManagerに書いてますが、ツール的なものはいいとして、ビジネス
ロジックは共通化できそうなのが少ないので迷ってきました。
「とりあえず」performに書いて汎用的に使えそうなのは抽出していくって言うのも
よさそうですね。
ちょっとこの路線でやってみます。
アクション内で別のアクションに飛ばしたいときはどうしたらいいんでしょ... 結局、 header(Location: /?action_hoge=true); とかしてるけど。 UrlHandlerの使い方がまだよくわからん。
前の方に書いてあったけど、アクション内で、別のアクションが 呼びたくなっちゃう事自体が設計ミスらしいですよ。 処理を別クラスに作成して、それを共通で呼び出すようにした 方が良いかと。
>>717 >アクション内で別のアクションに飛ばしたいときはどうしたらいいんでしょ...
すません。これ、私はこういうことを思ったことは無いんですが、
具体的にどうゆう場合にこういうことをしたい!!と思うんでしょうか?
なるだけ具体的に書いてくださると、
「その場合は、***をViewに集めれば良いじゃん」
とかレスしますんで、よろしく。
722 :
721 :2006/12/28(木) 01:09:30 ID:???
ちなみに、>
>>215 のようなバリデートエラーの場合は=ActionFormが一緒
ということなんで、ActionClassも自動的に似通ったものになり、やっぱり
ActionClassの継承を使って
parent::perform();
をくし島t食っています。
723 :
717 :2006/12/28(木) 12:14:25 ID:???
やっぱりManagerあたりで処理まとめて呼び出すのが一番きれいなやりかたですかね... ありがとうございます。
windows環境なのですが、RAMドライブを使う以外でethnaのsessionをメモリーに 持たす方法は無いでしょうか。
725 :
nobodyさん :2006/12/28(木) 16:24:21 ID:2NQtv/LQ
ethnaでブラウザ経由での実行じゃなくて、バッチ作ってコマプロで 実行するようなものも作れます? フレームワークのイメージ自体がちょっとできてないんですが…
ethna add-action-cli または ethna add-action -g=cli
2.3.0で APPID_ViewClass.phpの中で $this->af->setAppしてもテンプレで使用できないんですが、 これは仕様?
730 :
728 :2006/12/30(土) 17:57:25 ID:???
function _setDefault(&$renderer) 内で指定するんですよね? PHP4でもいけますか?
731 :
721 :2006/12/30(土) 22:27:30 ID:???
>>730 >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'));
}
とかかな。多分
>>728-731 _setDefaultは、
$renderer->setProp('test', array('hoge'));
でできるよ。
全てのフォームからの入力値に自動的に 特定のエスケープ関数(例えばmysql_escape_string)を賭けたい場合、 app下のAPPID_ActionClass.phpに組み込めば簡単かと思うのですが、 特定のアクション(またはフォーム値)に対しては mysql_escape_stringをかけないようにする良い方法が思いつきません。 元旦早々ですが、良いアイデアありましたらお願いします。
viewの中ではAPPID_ViewClass.phpが問題なく継承されるんだけど、 action内でうまくAPPID_ActionClass.phpが継承されない。 ためしにAPPID_ActionClass.phpのperform()内で echo "エコーされるか?"; としてみたが一切認知されてないっぽい。 同じような人いませんか?
>>733 Ethnaに限った話しでは無いのですが、クラスのオーバーライドという概念を
調べてみてください。
「PHPの薬箱」って本のクラスの説明が解りやすいので、機会があれば
見てみると良いと思います。
733が言いたいのはむしろ、そのオーバーライドをどう使えばいいか、 ってところのキガス
オーバーライドが解っていれば、共通で実行されるメソッドを、特定アクションの
中でオーバーライド(処理無しの空メソッドを作るだけ。)すれば良いので
>>733 のような質問は出ないのではなかろうか・・・。
app/actionの下に作成されている、アクション達はみんな app/APPID_ActionClass.php
を継承しているということに気づいてないかな?
738 :
734 :2007/01/03(水) 21:03:27 ID:???
どなたかヘルプミー
739 :
734 :2007/01/03(水) 22:06:08 ID:???
ちなみになぜか APPID_ActionClass.phpのauthenticate() は機能します。 APPID_ActionClass.phpのprepare(),perform()機能しないとです・・・・
エラーが再現する最低限のコードプリーズ。
741 :
734 :2007/01/04(木) 00:25:50 ID:???
ああ、、、すいません、 オーバーライドされてただけの話でした・・・ orz=3 メソッドのオーバーライド(上書き)というより, 加え書き、みたいなのってないですよね・・・ ある一定部分までは同じで、アクションによってちょっとだけ 違う処理を付加する、っていう場合は appmanager使うとかしかないですかね・・・
extend したほうで function perform() // 処理 return parent::perform(); } みたいにするか、 処理が異なる部分のみ切り出してテンプレートメソッド風にするとか。
入力→実行っていう画面遷移のページを作る場合はMojaviみたいに1つのActionクラスで入力用、実行用のメソッドを用意するんでしょうか? それともそれぞれのアクションクラスを作ってフォームのaction属性として連携させるんでしょうか。
>>743 Mojaviは知らないし「入力用」「実行用」は色んな意味に取れて
具体的にどの処理を指してるのか解らないけど
1.画面に入力
2.登録ボタン押下
3.DB更新処理
4.結果表示
という、良く行われるであろう画面を作る場合、自分的には
/app/action/アクション
function prepare()
{
入力チェック
}
function perform()
{
DB更新処理
※(処理が大きくなりそうだったり、他の処理と共通化出来そう
だったら「アプリケーションマネージャ」で別クラス化。
処理がちょっとで済みそうだったら直書き。)
}
/app/view/ビュー
function preforward()
{
画面表示に必要な値を取得する処理。
例)
・現在時刻取得
・コンボボックスの内容をDBから取得
}
こんな感じ。
データベースから取得した値によって、動的にラジオボタンのnameが変わる 画面を作りたいのですが、アクション設定する入力チェックはどうやったら 動的に変更出来ますか? アクションの function prepare() の中で $this->af->validate() する前に、DBを読んで動的に入力チェックを行う事が 出来ますでしょうか?
747 :
746 :2007/01/06(土) 08:38:07 ID:???
>>746 × アクション設定する
○ アクションで設定する
$res1 = new m9('a')->("プギャァ~"); ↑これは、もっと評価されるべきじゃないの?w
749 :
nobodyさん :2007/01/12(金) 23:14:55 ID:l7BIz4fN
ほしゅ
アプリケーションマネージャの使い方が分からんとです。 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}
751 :
750 :2007/01/12(金) 23:37:28 ID:???
こんな感じで、テンプレートの部分で「にゃ〜」を表示させたいんですが、 Call to a member function giko() on a non-object というエラーが出ます。 クラスとか初めて使うので、何かが根本的に間違ってる気がするんですが、 自分では気が付けず。 どなたかご指導お願いします。
752 :
750 :2007/01/13(土) 01:19:54 ID:???
自己解決しました。 コントローラのvarは不要、 アクションで $this->Mona = $this->backend->getManager('Mona'); $neko = $this->Toppage->giko(); $this->af->setApp('neko', $neko); で出来ました。 Ethnaのドキュメント、新旧入り乱れてて分かりづらいよ・・・
753 :
721 :2007/01/13(土) 13:48:05 ID:???
>>752 >コントローラの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')
とかしてる。
754 :
721 :2007/01/13(土) 13:58:50 ID:???
>>752 あと、アクションで$this->MonaってやってMonaメンバに
Managerを保存してるみたいなんだけど、EthnaのgetManagerは
(というよりFactory?)一度newしたManagerは使い回してくれるので
何度もgetManagerしてOK。ViewでもActionでも同じインスタンスを
使ってくれる。
なんでPHPって.演算子じゃなくて->演算子にしたんだろうな フレームワーク使ってるともう->書きまくるのたるくてしょうがない
>>755 >なんでPHPって.演算子じゃなくて->演算子にしたんだろうな
perlの影響じゃねの?
タイピングがへたくそなだけだろ
758 :
750 :2007/01/14(日) 23:00:46 ID:???
>>753 おっしゃるとおり、1段階でも出来ました。スゴス
2段階も長いけど、1段階でもまだ長いっすよね。
そのgetM()メソッドというやつ、デフォで組み込んでて欲しいとか思ってみたり。
ちなみに、MonaメンバにManagerを保存してたのは、
$thisの使い方が分かってなかっただけです。
今もあんま分かってないですが。
Ethna使いながらオブジェクト指向とかも勉強しようかなって感じです。
いま、非FWで作りかけてたものを移植してるんですが、
使えば使うほどFWの便利さが身にしみますね。
配列、連想配列、クラス これの使い方が解ったら、FWの便利さが飛躍的に上がる。
クラスはともかく連想配列はFW以前の知識だろう
>>759 オブジェクト指向がわからない人はFWを使おうとしても挫折するんとちゃうか?
>>760 > クラスはともかく連想配列はFW以前の知識だろう
いや、全部フレームワーク以前の知識だと思うぞ
>>763 >何でデフォルトで何もしないんだろう?
後方互換性
マネージャってapp直下に作られるけど、 数が多いんで、app/managerとかのディレクトリに入れることは可能? ただ入れるだけだと、Fatal errorが出るんだよね。 どこを弄れば、読み込んでくれるのでしょうか?
>>766 コントローラの上のほうで、
/** 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)));
とかしてやれば動くんじゃない?
確かめてないけど。
>>767 d!動きますた。
app直下のものも動いちゃうけど、とりあえずこれでいってみます。
770 :
764 :2007/01/21(日) 04:53:17 ID:???
>>769 俺も柔軟な方法があったら知りたいんだがw
とりあえずはUrlHandlerのgetInstanceメソッドをオーバーライドして
アクションのマッピングが見つからなかった時に
マッピング設定をするようにしたら出来るよ
当然値を自動的にセットはしないし
(ルール設けてデフォルトのマッピングをそう生成すればいいんだけど)
smartyのurl関数とかも使えないんじゃないかと思う
俺の場合は元々そこら辺をフォローするマネージャとか作ってあったから
どっちも使えるようマージするだけでよかったんだけどね
771 :
769 :2007/01/21(日) 11:31:55 ID:???
>>770 めんどくさいなぁ
例えばスケルトンを作成する際に-url等のオプションをつければ
【利用者が何も意識しなくても】 ステキURLでアクセス出来るようにして欲しいな。
つまり
>>763 の例で行くと
ethna add-action -url echo_msg
↓
特に設定を変更することなく /echo/msg でアクセス
↓
(゚д゚)ウマー
772 :
764 :2007/01/21(日) 15:51:48 ID:???
>>771 無い袖は振れんのだ
しょうがない
一応、UrlHandler自体もうちょっとどうにかしようという流れはあるみたいだし
それに期待じゃないかね
俺は足りない部分はさくっと追加しちゃって後は本家の実装待ちみたいな感じだw
上記の変更も実質数行足すだけだったし
不満はあるけどEthnaは改造しやすくていいんだよねぇ(俺でも改造の道筋がすぐ見えるという意味)
1つ前のアクション取得する簡単な方法ってないでしょうか。 validate()した後、エラーがある場合の 遷移先を自動的に指定したいのです。 フォーム値に渡す方法しか思いつきませんでした。 もっと簡単な方法があったらおながいします
774 :
nobodyさん :2007/01/22(月) 10:55:40 ID:grOsWXoX
> 1つ前のアクション取得する簡単な方法ってないでしょうか。
セッション使うことにこだわらなければ、セッション使う。
ViewClass::forward()のオーバーライドでその決定後のactionを保存。
っつーか、
>>773 の1つ前というのが、1リクエスト前のactionという意味ならだけど。
そうではなく、PHP内の内部処理内でって言うなら、PHP5限定で現在のActionClass名
__CLASS__からActionNameを解析するしかないな。
解析はViewClassのメソッドに付け加えて、validate()でエラーが出た際はerror_viewとか適当な
クラスを作ってそこでジャンプ。
んー。Backendクラスもオーバーライドしないといかんかな。
775 :
nobodyさん :2007/01/23(火) 23:33:59 ID:OL4nj+JT
viewで、 $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
776 :
721 :2007/01/23(火) 23:40:30 ID:???
>>775 最初の一文字しか出てこないのは、多分PHPにおいて文字列も配列として
認識されるのが影響してると思う。
例えば、
$str = "abcde";
echo $str[0];
とすると、aって出る。
これを$strがマルチバイトの場合でバイト欠損になってるんだと思う。
777 :
775 :2007/01/23(火) 23:50:58 ID:???
>>776 そ、そうなの??
若干Ethnaから離れて大変申し訳ないですが。。
もしそうだとすると、配列を渡すようなsmarty_functionのselectとかcheckboxとか、
全滅ってことになるよねぇ??
化けるのは、ただ単に文字コードの問題じゃなくて?
779 :
775 :2007/01/24(水) 00:52:45 ID:???
たぶん文字コードではないと思いますよ。 print_rで配列出すとブラウザ上に Array ( [1] => さいしょ [2] => つぎ [3] => さいご ) って中身が出てるので。
780 :
778 :2007/01/24(水) 00:59:51 ID:???
select は smarty のプラグインかなんかでしょ? そのプラグインの中で値がどうなってるか調べれば委員で内科医。
>>775 使い方が違うだけだろ
$tests = array (
"1" => array ('name' => "さいしょ"),
"2" => array ('name' => "つぎ"),
"3" => array ('name' => "さいご"),
);
782 :
775 :2007/01/24(水) 22:01:26 ID:???
>>781 大変すまんかった。
おっしゃるとおり。
ethna も sandboxほしいね。
ほしゅ
785 :
nobodyさん :2007/02/03(土) 16:20:22 ID:F0daih5C
Ethnaを勉強するのって公式サイトを見ての独学しかないんですか? 書籍を探しても見つからなかったのですが・・・ 良い勉強法をご存知でしたらご教示ください(´・ω・`)
>>785 ムック系の本の中で何度か取り扱われた事があるからそれを探してみると
とっかかりとしては良いかも
後は、Ethnaの公式とかgree lab見るとかコミッタの人のblogの記事を読むとか
多少内容は古いと思うけど独自にtips書いてる人もいる
ようするにぐぐれって事かw
後はEthnaはコードが読みやすいフレームワークだと思うから
実行順とかわからない所のコード追っかけてみたりした方がいろんな意味で
勉強になって良いと思う
>>786 なるほど、分かりました。
手始めにソースコード読んで勉強してみます!
ありがとうございましたm(_ _)m
外国産のPHPフレームワークばかりに目が向いていたが、Ethnaの使い方も勉強してみようかな
ethnaで作ったスクリプトをCGIとして動作させたい場合、 どうすればいいでしょうか? ちなみに普通のPHPであれば、 #!/usr/bin/php をつければ、CGIとして動作する共用レンタルサーバーです。
AppObjectの使いどころが良くわからない・・・ クエリ発行するには AppManager->db->query(); でいいんだよね? AppObjectって必要なの?
私は使ってません。
/etc/[APPID]-ini.php 内で セッション値やアクションフォーム値を使用するためには どうすればいいでしょうか? $this->session->get('hoge') でやってみましたが、Call to a member function on a non-object が出ました。
if( !empty( $this->af->get("hoge") ) ){ } とするとエラーが出ます。 $hoge = $this->af->get("hoge"); if( !empty( $hoge ) ){ } ならうまくいきます。へるぷみー
セッションの値をsmarty内で{$session.id}みたいな感じで 使えませんかね? setApp するのがだるいのです。
>>795 PHP4だからじゃね?
>>796 [APP_ID]_ViewClass.phpの _setDefaultメソッドでアサインすれば?
799 :
794 :2007/02/06(火) 20:22:16 ID:???
>>797 レスありがとうございます。
おっしゃるとおり PHP4です。
PHP5にせずに何とかする方法はないでしょうか。
あとみなさんPHP5でエスナってるんでしょうか?
800 :
721 :2007/02/06(火) 23:30:31 ID:???
>>794 >/etc/[APPID]-ini.php
>内で セッション値やアクションフォーム値を使用するためには
>どうすればいいでしょうか?
そんなやり方はしないヨ。
/etc/hogehoge-ini.php
には、設定値を書くから、設定値をセッションで上書きするって言う使い方はしない。
設定値はethna_configオブジェクト(のサブクラス)として存在してて、
そのロードはControllerのコンストラクタで行われてて、それってEthnaの起動のほぼ直後。
もちろん、Sessionが始まるより遥か前。
そもそも、セッションオブジェクトやアクションフォームオブジェクトは
AppManager/AppObject/ActionClass/ViewClass内のみで使われることを
想定としてるから、そんな変なところではアクセスできるわけがない。
>>793 792です。
自前のクラスを使うことにしました、ありがとう。
いろいろ調べてみて、現状ではAppObjectを他のフルスタックフレームワークのModelと同じように考えてはいけないと思いました。
何でこんな中途半端なものがくっついてるんだろう?
混乱するだけなのにな・・・。
802 :
nobodyさん :2007/02/07(水) 17:46:41 ID:hhcgJkB/
>何でこんな中途半端なものがくっついてるんだろう? 私はメチャメチャ使っています。 とにかく、ActionClassの行数を増やしたくないので、とりあえずAppManager/AppObjectにという感じで。
.tplが勝手にキャッシュされて htmlミスりまくりの自分としてはテスト中はかなり不便なんですが、 どこかでキャッシュの設定はできるんでしょうか? smartyのキャッシュ設定はoffになってました。 本家でキャッシュで調べましたが、見つかりませんでした。
アクションのフォワードってどうやるんですか?
>>804 やはりリダイレクトかアクションの継承になるんでしょうか。
>>806 継承だったらこんな感じになるのでしょうか?
Base_Action
{
function doHoge()
{
}
function doFuga()
{
}
}
class Action_A extends Base_Action
{
function perform()
{
$this->doHoge();
}
}
class Action_B extends Base_Action
{
function perform()
{
$this->doHoge();
$this->doFuga();
}
}
808 :
nobodyさん :2007/02/14(水) 23:01:46 ID:pcigeSJ1
行数のかさむコードには誰も反応しない。。w
行数がかさまないように、括弧の前後にある改行を消せばいいの?
810 :
721 :2007/02/15(木) 03:31:47 ID:???
>>808 >行数のかさむコードには誰も反応しない
というか、何したいかいまいちよくわからん・・・・。
アクションのフォワードとかリダイレクトとかそれっぽい言葉があるが、
とりあえず言葉を使ってるだけ感がいっぱいで。
プロジェクトディレクトリまでの絶対パスの取得方法教えてくださいまし。 APPID/lib 内のファイルを操作したいです。
>>811 $_SERVER["SCRIPT_FILENAME"]からwww/index.phpを抜くのじゃ駄目か?
普通に__FILE__使えばいいだけでは。
ethnaでmod_rewriteが上手く使えない。 ?や&で切れる。どうやればいいですか?
解決法。 もっと簡単なプログラムから勉強し直す。
Smartyにcache_idを渡してページごとに複数のキャッシュを持たしたいんだけど、 できなさそうですね?
>>817 ここはEthnaのスレ
よそで聞け
ちなみに余裕で出来るぞ
Ethnaでって話しだろ?
>>818 Ethnaでの話ですよ、もちろん。
>>819 その通りです
ちょいと改造して解決しました
wamp環境でEthna使ってるんだけど、ethnaコマンドが黙り込むのはなぜ? ethna add-action --basedir=dir sample とかやるとき。
822 :
nobodyさん :2007/03/01(木) 16:07:38 ID:ue5nOCQJ
AppObjectで SQLの関数使いたいとき、 たとえば update some_table set some_date = now() where some_id = 1; ↑こんなかんじのことをAppObjectでやりたいときって どうやればいいんでしょう ちなみにPostgreSQLです
>>822 今のところ確かできなかったはず。
そのうち出来るようにしたいと言ってた気がする。
そのうちじゃなくて将来的に出来るようにしたいと言ってたんだったかな。 どっちでもいいが。
そのうちと将来的の違いについて教えて貰えるスレはここですか?
そのうち→実装する確率50% 将来的に→実装する確率20% はやいうちに→実装する確率70% 気が向いたら→実装する確率0%
最近動きないね。
ちゃんと動いてるからじゃね。
$ pear channel-discover pear.ethna.jp $ pear install ethna/ethna でインストールできません・・・ アーカイブをダウンロードして展開したEthna-2.3.1の中に Ethna-2.3.1とpackage.xml が入ってるのですが、パスが通ったディレクトリに移動するべきディレクトリって中に入ってる方でしょうか?
831 :
830 :2007/03/08(木) 05:04:28 ID:???
自己解決しました。pearのバージョンが古かっただけでしたorz
PHP5でEthna使おうとしたら、E_STRICTに引っかかって使うのを中止にした。 せっかくマニュアル読んだのに。
PHP4ベースのコードがE_STRICT吐くのはしょうがないでしょ
まあそうなんだけど。 使ってる人は無視して使ってるの?書き換えてるの?
E_STRICTは無視してる php.iniで。
836 :
nobodyさん :2007/03/13(火) 05:04:38 ID:HG/GLq71
AppObjectを使ってるときに、ファイルをアップロードして、そのファイル名をDBに入れるには? ActionFormでアップロード用とファイル名ようにフォームを2つ定義?
気にせず $db =& $this->backend->getDB(); $db->db->autoExecute(.... とかかいてるけどいいんだろうか。 AppObjectでWHERE文で一括DELETEとか出来たら楽なんだけどなぁ。SELECTはできるのに。
>>836 イマイチよくわからないが、これじゃダメなのか?
$filename = $_FILE['example']['name'];
$app_object->set('filename', $filename);
Webシステム開発でEthnaを使わず、symfonyばっかり使う藤本神
>>840 愚かなやつめ。
司令官はいつだって真っ先に危険を察知して、逃げるものだ。
symfonyは保守をしっかりやると宣言してるので、Ethnaに勝ち目は薄いね
mixi中毒な藤本神
メール欄でもないのに、引っかかるお前らカワイス
テラワロス
ギザカワユス
____ / \ / ─ ─\ / (●) (●) \ 「カワユスナァ、カワユスナァ」・・・・と | (__人__) | ________ \ ` ⌒´ ,/ .| | | ノ \ | | | /´ カタ. | | | | l カタ | | | ヽ -一ー_~、⌒)^),-、 | |_________| ヽ ____,ノγ⌒ヽ)ニニ- ̄ | | | ____
$this->af->getArray() の使い方がリファレンス見ても良くわからんのですが、 $form = $this->af->get('test'); $form_array = $this->af->getArray(); で、 $form_array['test'] と $form は等しくなる、 という考えて間違ってますでしょうか? なぜかうまくいかないので間違ってる気がするのですが。
>>849 prop_defは省略できる
最初のDBアクセスでテーブル定義を取得して、
/tmp/cache/default(だったかな?)にseriarizeしたものが保存されるようになってる
でも、prop_def自動定義も欲しいところだな
藤本神もいちい氏もAppObjectを改良したいみたいなこと言ってるから、そのうち(相当先だろうけど)変わるかもしれない
>>851 >/tmp/cache/default(だったかな?)にseriarizeしたものが保存されるようになってる
PHP5以降な。
ほとんど宗教論争 不毛だ・・・
> 一時期生活がままならないほどPHPのバグハンティングにのめり込むが、 > 現在はすっかり飽きている様子。 依存症かよw
ethna使いたてです。 appManagerから別のappManager呼び出したい時って どうやってするんでしょうか?
>>856 普通に
$this->backend->getManager('hogehoge');
とかでできるんじゃないか?
858 :
856 :2007/03/21(水) 23:53:28 ID:???
>>857 あ、単純にtypoしてただけでした・・
1回やってみただけでこれじゃだめなんだと決め付けてました。
$this->backend->getManager('hogehoge');
で行けました。ありがとうございました。
ありがちな情報管理ページで、 ?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}"> と処理してしまって良いものなのでしょうか?
あ、af->setForm()ってのを探して無かったから勘違いしてたけどaf->set()で良いのか・・・
良くある情報入力→DB登録のようなページで 入力画面表示を 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書くだけでも問題は無いですけど・・・
>>861 同じ物を書くか、俺の場合はフォーム定義を外部化出来るようにしたよ。
>>861 add-view action_add
して、その中で
var $helper_action_form = array('action_add_do' => null);
する。
864 :
863 :2007/03/30(金) 19:14:21 ID:???
追加。(途中で送信しちまった) {form ethna_action="action_add_do"} {form_input name="form_a"} {/form} とか書けば、Viewの省略も可能。
865 :
861 :2007/03/30(金) 20:17:37 ID:???
>>862 取り合えず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処理関連がマニュアルから良さ気なのが見つけられ無かった・・・
866 :
863 :2007/03/30(金) 21:22:18 ID:???
>>865 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/
マネージャでコンストラクタに変数渡したい場合、 呼び出すとき、どう記述すればいいでのしょうか? 例: class Hoge_AbcManager extends Ethna_AppManager { function Hoge_AbcManager( $watasitai_var ) { 通常の方法ではコンストラクタに渡す変数を指定できませんよね? $HOGE_m =& $this->backend->getManager('Hoge');
使い方を間違ってる。
>>867 コンストラクタに渡したいって変数なら、アクションやビューに
依存しない変数だよね。managerを呼ぶ時に常に行う処理ってことだから。
で、そういうのはbackendに詰めるでしょ。
すると、そもそもmanagerはbackendを持ってるから
$this->backend->ってやればコンストラクタで変数取れるじゃん。ってことだと思う。
やるなら、backend::getManagerをオーバーライドして、ってなるんだろうけど
ただのバッドノウハウになるね。
>>861 class Sample_Form_AddDo extends Sample_Form_Add
俺はこうしてる。
>>870 それって勝手にそれぞれのDo.php等の中で
例えばAdd/Do.php内で
require_once 'Add.php';
して?
うーむ、更にModify,Modify_Doとかでも使いまわすことを考えるとそれも現実的かなぁ・・・
>>871 870じゃないが、このやり方は確か藤本氏がサンプルでやってた方法だったかと。
ひとつ上のクラスだったら
require dirname(__FILE__).'.php' でおk
別のクラス呼ぶなら、直接ファイル名記述。
873 :
nobodyさん :2007/04/16(月) 15:15:35 ID:KZll3+ph
初心者ですが、すいません
WindowsXP + IIS にEthnaをインストールしようと
「アプリケーション構築手順(1) 」に従って
インストール、スケルトン作成まで終わったのですが、
index.phpを指定してもブラウザに表示されません
何が悪いのでしょうか?
アドレスは
http://localhost/sample/www/index.php と指定しています
874 :
nobodyさん :2007/04/16(月) 23:03:05 ID:ty8BPgJH
tmpのパーミッションとかは?
>>873 そのページに従ってやったならそのアドレスはおかしいんじゃないの?
877 :
nobodyさん :2007/04/24(火) 01:57:17 ID:XNYrKVIb
通常のPHPからEthnaへsession変数渡せないでしょうか? 昔作ったプログラムからEthnaへ遷移したいんだけど、session変数が渡せなくて、挫折気味・・・
>>877 んー、「昔作ったプログラム」のセッションIDの付け方がまちまちだとダメだね。
でないなら、Ethna_Sessionを自前のクラスでOverrideさせて、
SessionIDを決めるロジックだけそのIDで上書きすればOK。
あとは、ActionClassでセッションをスタートさせれば普通に取れるはず。
>>878 ありがとうございます!
「昔作ったプログラム」では、session_start()だけでID決めてるんで、IDはまちまち・・・だと思います。(この辺よく理解していないですが)
Ethna_Sessionのロジックがよくわからない初心者なので、とりあえず
@クッキー($_COOKIE["PHPSESSID"])からセッションID取得して、
Asession_id()でセッションID設定して、
B「昔作ったプログラム」で保存されたディレクトリのセッションファイルと照合
って流れにムリクリしてるんですが、
@でクッキーが取得できず・・・なぜだろう・・・、
880 :
nobodyさん :2007/04/24(火) 19:10:42 ID:/+uAa599
881 :
878 :2007/04/25(水) 02:11:01 ID:???
>>879 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
}
}
882 :
878 :2007/04/25(水) 02:12:08 ID:???
>>880 2.3.0から$managerは使えません。
俺も知りたい
>>881 セッションキーを指定せずに、session_start()してるならそのままEthna内でも使えるはず
恐らくEthnaが内部でセッションの保存先が元アプリのと違うんじゃない?
>>883 Ethnaのデフォルトはキャッシュ無効になってないか?
デフォは有効じゃないかな?
templates_cとcacheを勘違いしてない?
adodbを使っている場合ってAppObjectとかって使えないのでしょうlか?
AppObjectで対応してないDB使いたいからadodb使うとか、 AppObject使いたくないからadodb使うんじゃないの?
>>891 ごめんなさいごめんなさい。
それたぶんあまりうまく動かないです。。
>>892 BoBppさんのブログとかがそのあたり詳しいと思います。
(僕も普段は使って無いので。。。)
こういうの使う人ってマゾなんだろうか・・
>>862 フォーム外部化ってどんな風にやってるんでしょうか。
kwsk plz
>>896 多分
>>862 って俺だったよなぁと思いつつポイントだけ
Ethna_ActionFormのコンストラクタが実行される前にフォーム定義をセットするように
Ethna_ActionFormを継承したクラスに書けばおkです
後は好きな形式からロードしてActionFormの定義配列を吐き出せるクラスなりを用意しておけば
俺の場合元々古いバージョンのEthna時代に作った物で、フォーム表示のsmarty関数とかも
作ってて、フォームの見栄えなんかも一緒に定義出来るようにしたりしてます。
ActionForm内のoption指定で
>>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;
だったら面倒がなくて良いんですが・・・
899 :
878 :2007/06/02(土) 00:00:57 ID:???
>>898 んー、あまり読んでなくてレスするけど。
ActionForm内のメソッドからAppManager呼ぼうとしてる?
それはできないヨ。Ethnaって、ActionForm→Backend→AppManagerって順にnewしてるから
だから、自分は、ActionFormのプロパティをセットするのは、prepare()内って決めてる。
で、POSTされてってChain時は、parent::prepare()でオートセット(もどき・・・自分に言い聞かす)。
違ったらソマソ
900 :
nobodyさん :2007/06/06(水) 15:40:46 ID:6likgS+I
Managerからは [Project]-ini.phpの値を普通には読み出せないようなんですが、 解決法どなたかきぼんぬ
901 :
900 :2007/06/06(水) 15:54:31 ID:???
$this->config->get('hoge')も $this->backend->getConfig->get('hoge')も 両方だめぽです。 Call to a member function on a non-object エラーがでます。
>>901 試してないけどEthna_AppManager見た感じではそれでいけそうなもんだけどなぁ
どっかで凡ミスしてない?
903 :
900 :2007/06/06(水) 16:30:44 ID:???
ミスはしていないっぽいです。 また、$this->session->get('hoge'); などもマネージャ内では機能しないようです
>>903 ちょっと嫌かもしれないけど
俺ならそういうケースはとりあえずEthna_AppManagerのコンストラクタに直接var_dumpとかで
値取れてるのか確認するかなw
これまたEthna_AppManager見ただけで未確認で申し訳ないけど
普通ならちゃんと取れてるはずだから
Ethnaの古いバージョンだから違うとかEthna_AppManagerを継承したマネージャ作ってて
Ethna_AppManagerのコンストラクタ実行されてないとかそれくらいしか思いつかない(;´Д`)
905 :
900 :2007/06/06(水) 18:40:02 ID:???
確認の前に500エラーでごわす
普通に読めますよ。 $this->backend->getConfig->get('hoge')はエラーで当たり前。 絶対凡ミス。
つーか、 var_dump(get_class($this->backend)); とかしてみないの?
908 :
878 :2007/06/07(木) 00:18:01 ID:???
>>901 >$this->backend->getConfig->get('hoge')も
getConfigはメソッド。
$hoge_config = $this->backend->getConfig()->get('hoge');
だよ。@PHP5
PHP4ならひとつかませて
$config =& $this->backend->getConfig;
$hoge_config = $config->get("hoge");
自力でnew HogeManager()とかやってそうだ。
910 :
900 :2007/06/07(木) 14:58:11 ID:???
>>908 再三チェックしましたが、誤りは無いようです。
PHP4で
$config =& $this->backend->getConfig;
$hoge_config = $config->get("hoge");
も試してみましたが、
$config =& $this->backend->getConfig; の行でエラーが発生します。
$config =& $this->backend->getConfig();
も試しましたが同じくです。
>>907 bool(false)
となりました。
backendの時点でだめっぽいです。
911 :
900 :2007/06/07(木) 15:00:58 ID:???
var_dump(get_class($this)); では string(19) "project_hogemanager" が表示されます。
Actionクラスから、$this->backend->getDB() とやると、何も表示されなくなってしまって 困っています。 echo get_class($this->backend) で画面に表示させた場合、ちゃんとethna_backendとかえってきています。 また、Ethna_Backendクラス内の、getDB()関数の最初の行に、 echo "a";と書きましたが、 $this->backend->getDB()の実行で表示されていません。 誰か助けてください。
みろ!この香ばしい書き込みの増え具合を。 Ethnaの普及具合を表しているようだ。
どうみても php-users です。 ほんとうにありがとうございました。
915 :
900 :2007/06/08(金) 03:08:18 ID:???
>>904 > Ethna_AppManagerを継承したマネージャ作ってて
> Ethna_AppManagerのコンストラクタ実行されてないとかそれくらいしか思いつかない
これっぽいんですが、
改善策が良くわかりません、あふぉの俺に救いの手を orz
916 :
900 :2007/06/08(金) 03:22:16 ID:???
あぁぁ、Ethna_AppManagerのソース見たらわかりました、、、、 HogeManagerでコンストラクタ作ってたのがだめでした、、、 あああ、はまりました、、、
>>916 そうやって成長するものだよ。
ま、とりあえずソースコード嫁。
>>916 parent::Ethna_AppManager呼べば、コンストラクタ書いてもいける
コンストラクタをオーバーライドするなら、スーパークラスのコンストラクタを呼ばなきゃ意味がないというのはオブジェクト指向の基礎だと思うぞ。
>>920 そんなことは自動的にやってくれる言語が大半だろ。
手動で呼ばなきゃいけないってのはどっちかっつーとPHPの基礎。
>>921 おまいはJavaのsuper()も知らんのかと(ry
逆にコンストラクタをオーバーライドした時に super()相当のメソッドをコールしなくても 自動的にスーパークラスのコンストラクタが コールされる言語ってある?その言語の場合、 オーバーライドしたコンストラクタだけをコールして欲しくて スーパークラスのコンストラクタを呼び出したくない時はどうやってんだろう?
コンストラクタ以前に、オーバーライドしてるのに勝手に親呼ばれたら困るでしょ。 統合環境によっては、クラス生成時のテンプレで用意くらいはしてくれるかもしれんが。
>>923 あまりいろんな言語知ってる訳じゃないが、C++とかC#とか。
Javaは呼ばれないの?
>>924 コンストラクタ以外なら勝手に親を呼ばれて困るのは当然だが、
親のコンストラクタを呼ばれちゃ困るってのはカプセル化が上手く出来てないのと違うか?
親のprivateフィールドとかどうやって初期化するんだよ。
C++は、確かに親クラスのコンストラクタが自動で呼ばれるけど、オーバーライドしてるわけじゃない。
まだ売ってなかった
同じく。
あとで買いにいくばいー
今日見てくる。絶対買わないが。
Ethnaサイトのトップはいつまで「あけましておめでとうございます」なの?
次のバージョンが出るまで。
>>933 中国では一年中サンタクロースがでてるけど、そんな感じ。
>>933 それよりもドキュメントや使用例をもっといっぱい掲載してほしい。
サイト上の説明が適当すぎる。
>>936 たとえば、どのフレームワークのサイトくらい「使用例」「ドキュメント」が
あれば満足する?
> たとえば、どのフレームワークのサイトくらい「使用例」「ドキュメント」が > あれば満足する? mixi 位の規模のサンプルコードがないとダメだろ。 常識的に考えて。
ここは大規模なインターネッツですね
中規模プロジェクトのサンプル Mixiまでは行かないが、そこら辺のBlogスクリプト規模とか ぐらいがあれば、どうにでもなりそう。
そんな規模のサンプルはむしろ読みたくないな。
>>941 じゃあオマエは読むな
サンプルや使用例なんて多いに越した事はない
しかし、symfony.jpみたいにグダグダ書かれても読む気がウセるので
ちゃんとカテゴリや用途別にしっかりと纏めて読み易くすべき
フレームワークなんて楽する為にあるのに殆ど(っていうか全部?)のフレームワークが
わからんところはソース見てあたりまえの現状になってるのは本末転倒
ドキュメントの整備が追いつかないのであればEthnaに限らず
サイトに問い合わせコーナーを設けてどんなに下らん質問でも
ソース見ろとか言わずに誠心誠意真面目に答えるべき。
なんのために?
香ばしいね。
>>942 どんなに下らん質問でも 誠心誠意真面目に答える役はお前な。
サンプル読むならフレームワークのソース嫁。
>>942 > フレームワークなんて楽する為にあるのに殆ど(っていうか全部?)のフレームワークが
> わからんところはソース見てあたりまえの現状になってるのは本末転倒
そう思うならフレームワークなんて使わなければいいだけ。
他人がボランティアでやってることに商用サービスみたいなサポートを期待するのはお門違いだ。
> 他人がボランティアでやってることに商用サービスみたいなサポートを期待するのはお門違いだ。 それ本気で言ってるの?w
>>946 そういうのを見る度に何の為のフレームワークか
わからんようになるなぁ
なんで? ソースコード=設計書だから、読むのが当たり前だと思うけど。 MFCのソースとかは読みたくないが。
サンプル無いと使えない奴らは使わなくてよいよwww FWがカスだとユーザもカスしかいないなw
>>950 ・MFCは読みにくいからソースは読まなくてよい
・Ethnaは読みやすいから読んで当然
・ソースコードは設計書である
(´ー`) ヤレヤレ
カスだろw 他にももっと便利なPHPのFWいっぱいある中で こんな旧式な設計のFW未だに使い続ける奴が不思議でしょうがない
>>951 アハハハハ・・・・・
漏れはEthnaなんて使わんけど
それを言い出したら厨から
作成者がカスだとマニュアルもカスなものしかないなぁ
とか言われるぞwwwww
956 :
953 :2007/07/03(火) 23:35:18 ID:???
>>954 >>他にももっと便利なPHPのFWいっぱいある中で
例えばどれ?
/ / ゙i, ヽ j ,ィ/ | | lィ' ,ィ/j/ | iリ | /l / '"` | j リ! /,ノ _,、-''''` /リ __________ | _.._ l/ ,.--;==ミ 、 ___,.ノ /{.○-゙‐rV / ヽ,/`ヽヽト、 ´ {,.○-`‐‐ 、,.-ト| ,ノ< ハッハッハ! 見ろ! ∧ ̄ ゙i, `ヽ,r'´ ノ. ゙、--‐''´| \ 利用者も工作員もゴミのようだ! | | ̄ ゙i ヽ、 __,,、-'" ,-、,:‐、〉 /  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ \\/. | \\\ i \_'i ___\\\| ヽ `ー─''''"´\\\ ヽ j\\\".;":;"." : ".;":;"." :".;":;". \ / \\\".;":;"." : .;".;: .;" \ ______ /´ \\\ ".;":;"." : : ゴ オ ォ ォ …… ! !".;" \\\ ;": ..;.;".;": ;" .;".;": _.;.;_".;": \\\ ド カ ァ ン ! .;".;": ..;.;".; ζ /_.;_/| .;".;", _ \\\ .;".;.;".;":. .;".;": ..;.;".;": ;:'.;| ΓΓ | |;":从へ_/| . \\\"_.;__..: 从へ从へへ从 ; ζ | Γ从 | |;:.. |从Γ | | 从へ从∠___/| : ( ⌒( ⌒ ) ζ | 从Γ | |.:;. |从Γζ.;".. .;. \ |ΓΓΓ| | | ( ⌒ ⌒ ⌒ ); | ΓΓ | |.;;::|ΓΓ | | ( 从へ ;: |从ΓΓ| | | Σ( ⌒( ⌒ ) ζ ( ( ) )⌒ ) ( 从へ从)_.;:.;
958 :
950 :2007/07/04(水) 07:43:32 ID:???
>>952 >MFCは読みにくいからソースは読まなくてよい
とは誰も言ってないけど。
読みたくないだけで、実際の開発時には読まないと進まない。
結局は、
>>946-947 に落ち着いて、気に入らなければ自分で作れ、ってことになるよね。
OSSはGive&Takeだよ。
Ethnaユーザはレベルが低いでつね( ̄ω ̄)
あのー、 Ethnaって、mixi?
961 :
nobodyさん :2007/07/06(金) 14:29:24 ID:alBDTBo6
かなり無理して言えば 「EthnaってGREE」の方が正しい。
なんか黄色いEthnaの本出てたな。 中身なさそうだったけど。
Mojaviとかの世代のフレームワークって、難しいとういか、難解だよな。
965 :
nobodyさん :2007/07/11(水) 18:07:45 ID:KXSxtuxB
動的なフォーム名の値を受け取るためには、 アクションフォームはどのように設定すればよいでしょうか? 例: $_POST['hoge1'] $_POST['hoge2'] . . . $_POST['hoge50'] ↑ hoge1〜hoge50まで場合によって受け取る量が変わります
966 :
nobodyさん :2007/07/16(月) 16:18:17 ID:A1EZIdjb
2.3.2 リリースあげ
やっと正月が明けたか
言いだしっぺの法則
>>968 このマニュアルすげーな。
もうみんなCodeIgniter使えばいいと思う。
フォームヘルパで配列って定義できますか? {form_input name="hoge"} これにhoge[huge]を定義したいのですが。
>>968-970 コミッタも現状のマニュアルはまずいと思ってる。
再編成も考えてるみたいよ。
CodeIgniterくらいドキュメントが充実してればそれだけで大きな武器だよなぁ つーか尼で注文したEthna本が発送予定日をトウに過ぎてるのに発送されんのだが・・・それで居てずっと在庫ありになってやがるし。
インストールしたはいいけどwebに公開できないです。。。 プロジェクト内のwwwディレクトリをどこにコピーしたらいいですか?
975 :
974 :2007/07/25(水) 11:40:13 ID:QgjOZ7Xo
プロジェクトはc:\の直下に作成しました
webに公開できるところにコピーすればいいです。
Ethna本ってなんつーか中身薄いね。
内容はうろ覚えやけど語訳説明とか、PHPはなぜ動くのか、等の
どうでもええ情報が多かった希ガス。
そんな説明をするぐらいなら
アプリケーションマネージャやアプリケーションオブジェクト等の
コアな使い方なんぞを説明して欲しかったなぁw
>>973 >> CodeIgniterくらいドキュメントが充実してればそれだけで大きな武器だよなぁ
禿同
>>976 Apacheのhtdocフォルダに貼り付けたのですが
ページが表示できませんとなってしまいます。
CIマニュアル翻訳コピペ厨はこんなところまで出張ってるのか・・・
980 :
nobodyさん :2007/07/28(土) 00:13:47 ID:jij/B/id
ethnaでajaxを使う時のいいサンプルってありますか?
981 :
nobodyさん :
2007/07/31(火) 15:39:01 ID:UVoxTIIu json対応希望