【PHP】Ethna part.2【国産フレームワーク】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2007/08/03(金) 08:15:18ID:BNMV6wHxEthna -PHPウェブアプリケーションフレームワーク-
http://ethna.jp/
SourceForge.jp: Project Info - Ethna
http://sourceforge.jp/projects/ethna/
クラスドキュメント(phpDocumentor)
http://ethna.jp/doc/
前スレ
【PHPフレームワーク】Ethna【スケルトン自動作成】
http://pc11.2ch.net/test/read.cgi/php/1123070439/
0018nobodyさん
2007/08/30(木) 16:02:13ID:???つなぎに行くからな。
Ethna関係なしsage
0019nobodyさん
2007/09/09(日) 00:35:07ID:R9DBCM/b最近更新が少ないよね。
まあGREEで使用されているからGREEが潰れないうちは
開発続けていくんだろうけど。
0020nobodyさん
2007/09/09(日) 00:58:35ID:???レン鯖にPEARが入ってない場合、どうすればいいの?
0022nobodyさん
2007/09/09(日) 01:19:37ID:???0023nobodyさん
2007/09/09(日) 10:56:51ID:???0024nobodyさん
2007/09/09(日) 11:40:17ID:???これはw
Ethnaで運用してたらEthnaの穴と思われたけど
Pukiwikiで運用してるからセキュリティホールのそしりは免れたね
0025nobodyさん
2007/09/09(日) 11:45:09ID:???ロボットに釣られんなよ。
0026nobodyさん
2007/09/12(水) 07:43:28ID:???ORM初めて何でなかなかコツが掴めない
0027nobodyさん
2007/09/12(水) 10:00:03ID:???itohさんとかriafさんとかのブログでいくつか記事があるかな。
0028nobodyさん
2007/09/12(水) 23:01:07ID:???そのブログ当たってみます
ありがとう
0029nobodyさん
2007/09/13(木) 02:43:53ID:k28u4udrコードも相当きれいだし、読みやすい。
SymfonyとかcakePHPとか、確かになんでもできるんだろうけど、
フレームワーク病に掛かりやすい。RoRのレールを外れた時の
ものすごい無力感に似た感じで。
あと、軽いね。F.W自体のベンチって難しいけど。
だから、Ethnaをベースにオレ的汎用コードを少しずつ加えていって
割と資産を作りやすい。あくまでオレ的汎用なんだけど。
まぁ、自分の本業がいわゆるホームページ制作だからだけど、
2年Ethna使って「これできない!」ってことなかったし、
使い続けて良かったと思うことは多いな。
0031nobodyさん
2007/09/13(木) 07:49:48ID:???例えば、
user {
id primary
name
gid
}
group {
id primary
name
}
user_group_link {
uid
gid
}
って3つのテーブルがあるとしてMySQL、MyISAMなDBな場合に
ユーザ一覧→ユーザ個別修正
グループ一覧→グループ個別修正
の4つの画面を作るとしてその中でどんな感じでAppObject/AppManagerを使えばいいのかを
ざっくり書いて貰えると嬉しいにょー
一覧にuser.nameでのlike検索とか付ける場合どんな感じでAppManagerを
使えばいいかとか、joinするときはAppObjectを合成してほげほげとかもあると最高
0032nobodyさん
2007/09/13(木) 18:53:31ID:???0033nobodyさん
2007/09/14(金) 03:30:34ID:???join編期待してあす。
テーブルの項目名に日本語を使いたいので
ちょっとアレして↓な感じで遊んでみます。
// Ethna_AppObjectをSmartyに渡すとMemory使いすぎで怒られる
// ので怒られないようにヘルパーを入れてみる
// AppObject::getMinimal() とか作ってそこで生成した方が
// よいかも知れない
class APPID_MinimalAppObject {
var $prop;
function APPID_MinimalAppObject(&$obj) {
// AppObjectからハッシュをゲッツ
$this->prop =& $obj->prop;
}
function get($key) {
return $this->prop[$key];
}
}
if($diary->isValid()){
//あったとき
- $this->af->setApp('diary', $diary->getNameObject());// テンプレートで{$app.diary.body}とかで取得できるようになる
+ $smarty =& $this->backend->ctl->getRenderer();
+ $helper =& new APPID_MinimalAppObject(&$diary);
+ $smarty->assign_by_ref('diary', &$helper);
} else {
//無いとき
}
お目汚し失礼しました。
003430
2007/09/14(金) 03:44:54ID:???> ユーザ一覧→ユーザ個別修正
典型的なパタンだね。
俺の場合一覧と個別は、
action/Admin/User.php
action/Admin/User/Edit.php
action/Admin/User/Edit/Conf.php
action/Admin/User/Edit/Do.php
view/Admin/User.php
view/Admin/User/Edit.php
view/Admin/User/Edit/Conf.php
って作る。
actionとしては上から、
・ユーザー一覧
・ユーザー登録(編集)
・ユーザー登録編集確認
・ユーザー登録実処理
で、
view/Admin/User.php
でユーザー一覧表示させるためのリストを作るけど、一覧データを持ってくるのは
User.phpでは基本的には1行(PHP4なら2行)
preforwardで
$this->af->setApp('user', $this->backend->getManager('User')->getUserList());
って書く。
PHP4だと、これできないから
$user_m =& $this->backend->getManager('User');
$this->af->setApp('user', $user_m->getUserList());
003530
2007/09/14(金) 03:45:29ID:???AppManagerは、デフォルトで使うもんとすると
PROJECTID_UserManager.php に
PROJECTID_UserManager extends Ethna_AppManager
ってできてる。これをインスタンス化してよんでるのが
$this->backend->getManager('User')
だから、PROJECTID_UserManager.php に
PROJECTID_UserManager::getUserList()
を作成する。
で、これの中身で一番シンプルなのは
function getUserList()
{
return $this->getObjectPropList('User');
}
帰ってくるのは配列で、1つ目の要素は検索した全ユーザーのリスト。2つ目の要素は、ユーザー情報を配列で。
まぁ、素直にvar_dumpすればわかる。
003630
2007/09/14(金) 03:46:35ID:???実際はこれだけだと意味がないんで、
function getUserList($name)
{
}
とかして、$nameに部分一致なUserのリストを返すようにする。このとき使うのはEthna_AppSearchObject
具体的には
function getUserList($name)
{
$filter = array('name' => new Ethna_AppSearchObject($name, OBJECT_CONDITION_LIKE));
return $this->getObjectPropList('User', null, $filter);
}
ってする。
IDの逆順にしたい!というときもあるかと思う
ORDER BY ID DESC, NAME ASC とかしたい場合もあると思う。その場合は
function getUserList($name)
{
$filter = array('name' => new Ethna_AppSearchObject($name, OBJECT_CONDITION_LIKE));
$order = array('id' => OBJECT_SORT_DESC, 'name' => OBJECT_SORT_ASC);
return $this->getObjectPropList('User', null, $filter, $order);
}
ってやる。
003730
2007/09/14(金) 03:47:13ID:???LIMIT 10,20
ってやりたい場合は、
function getUserList($name, $offset, $limit)
{
$filter = array('name' => new Ethna_AppSearchObject($name, OBJECT_CONDITION_LIKE));
$order = array('id' => OBJECT_SORT_DESC, 'name' => OBJECT_SORT_ASC);
return $this->getObjectPropList('User', null, $filter, $order, $offset, $limit);
}
って感じ。
とりあえず、Ethna_AppManager::getObjectPropListを覚えておけば9割くらい
AppManager使えることになる。
本当は、getObjectPropListの返り値がEthna::isError()でエラー起こしてないか
チェックするんだけど。
003830
2007/09/14(金) 03:48:27ID:???action/Admin/User/Edit/Do.php
だけだな。
AppObjectは、MySQLのテーブルデータの1ラインそのものだと思ってもらってかまわない。
それがORM。
なので、新しくユーザーを追加したい場合は、データが空のAppObjectを一つ作る
PROJECTID_Action_AdminUserEditDo::perform();で
function perform()
{
$user =& $this->backend->getObject('User');
}
ってやる。これだけだとまだ追加してないので何も起こらない。
そこで$userに、データを詰め込む。これはActionFormとの連携で
function perform()
{
$user =& $this->backend->getObject('User');
$user->importForm(OBJECT_IMPORT_IGNORE_NULL);
}
これで、適切に設定してればフォーム値がそのままAppObjectに入る。
003930
2007/09/14(金) 03:49:19ID:???まだDBには追加されてない。最後に
function perform()
{
$user =& $this->backend->getObject('User');
$user->importForm(OBJECT_IMPORT_IGNORE_NULL);
$user->add();
}
で終わり。
新しくユーザーを作るんじゃなくて、既存ユーザーの編集なら
function perform()
{
$user =& $this->backend->getObject('User', 'id', $id);
$user->importForm(OBJECT_IMPORT_IGNORE_NULL);
$user->update();
}
で終わり。最初の行で、id=$idのユーザーデータを持ったAppObjectが取れる。
ただ、この場合は、確実にid=$idのレコードが存在して、取れているかを
確認するために
function perform()
{
$user =& $this->backend->getObject('User', 'id', $id);
if ($user->isValid()){
$user->importForm(OBJECT_IMPORT_IGNORE_NULL);
$user->update();
}
}
ってやって、有効性を確認する。
004030
2007/09/14(金) 03:50:25ID:???Ethna_AppManager::getObjectListを使う。getObjectPropListは配列を返したけど、
getObjectListは第二引数がAppObjectを要素に持った配列になってる。当然getObjectPropListより重いよ。
004130
2007/09/14(金) 03:52:06ID:???>getObjectListは第二引数がAppObjectを
getObjectListは返り値の2つ目の配列がAppObjectを
004226,33
2007/09/14(金) 07:57:02ID:???週末試しまくります。
ありがとうありがとう。
004326,33
2007/09/15(土) 07:04:30ID:???俺的まとめ
WebProgを極めて居酒屋を開発する - AppObjectの使い方
http://d.hatena.ne.jp/riaf/20070913/1189675267
WebProgを極めて居酒屋を開発する - AppObjectでJOINする方法
http://d.hatena.ne.jp/riaf/20070914/1189747693
AppManagerの使い方
http://pc11.2ch.net/test/read.cgi/php/1186096518/34-41
0044nobodyさん
2007/09/21(金) 02:13:40ID:???0045nobodyさん
2007/09/25(火) 15:30:02ID:???0046nobodyさん
2007/09/25(火) 18:45:28ID:???とか?
0047nobodyさん
2007/09/25(火) 19:42:56ID:???そもそもが分かりやすくないので俺にはミリでした。
が、
http://ethna.jp/ethna-document-dev_guide-urlhandler.html
に加えて、はまりどころ
・www/index.phpに$_SERVER['URL_HANDLER']を忘れない
・AppID_UrlHandler.phpに_getPath_Hogeを忘れない。
・pathが被る場合は順番に気をつける
例:
var $action_map = array(
'hoge' => array(
'archive' => array(
'path' => 'archive',
...(snip)...
),
'archive_recent' => array(
'path' => 'archive/recent',
...(snip)...
),
とすると、'path' => 'archive'が先にマッチして'path' => 'archive/recent'まで見てくれない。
$action_mapはforeachでループしてるだけなので順番がまずいとまともに動かない。
pathとpath_regexpは、複雑なマッチを配列上で優先させること。
・path_extが要らない場合でも'path_regexp'と配列の個数を合わせる。
'path_regexp' => array('|^hoge$|', '|^hogehoge$|'),なら、
'path_ext' => array(array(), array()),としておかないと動かない(っぽい)。
アクションをサイト直下(http://example.com/とか)にマップする場合は'path_ext'=>array(),で。
0048nobodyさん
2007/09/25(火) 19:49:41ID:???setcookie($this->session_name, "", 0, "/");
の行全部を
list(, $path, $domain,) = session_get_cookie_params();
setcookie($this->session_name, '', 0, $path, $domain);
に変えておくと
session_set_cookie_params(1200, '/admin/', '', true, true);
とかエントリポイントで指定できて便利とか。
0049nobodyさん
2007/09/27(木) 17:12:13ID:???アクションフォームの定義の仕方がわかりません
$_POST等を直接弄るしか無いんでしょうか・・・
0050nobodyさん
2007/09/27(木) 21:55:07ID:???この頁の解説なんかどうでっしゃろう?
http://ethna.jp/ethna-document-dev_guide-form-type.html
-- html
<input name="foo[]" value="v1" ...
<input name="foo[]" value="v2" ...
<input name="foo[]" value="v3" ...
-- /html
-- ActionForm
'foo' => array(
'type' => array(VAR_TYPE_STRING),
),
-- /ActionForm
005149
2007/09/28(金) 09:27:35ID:???アクセスさえ出来ればあとはどうにでもなりますね
もしくはマスタ数に上限を設けて、requiredがfalseなフォーム値を
上限分書いて逃げようと思います
0052nobodyさん
2007/10/01(月) 21:54:03ID:???0053nobodyさん
2007/10/05(金) 03:08:42ID:???d
規制で書けんかった(´・ω・`)
php5ならいちいさんが書いてる
Net_URL_Mapperを使ったプラグインがよさげなんだがなぁ・・・
ところで、UrlHandlerで設定した値ってもうちょっと簡単に取得できないもんなんだろうか・・・
AFに定義しないと取得できないってめんどい・・・・
0054nobodyさん
2007/10/05(金) 18:13:07ID:???アクションをPOSTして動かしていくイメージで作っていたのですが
当然ですが、アクセスログを見ても全てindex.phpになっているため
画面毎に固有のURLを割り振りたいと考えています。
イメージとしては、 入力画面 -> 確認画面 -> 完了画面
のそれぞれに固有のURLを割り振る方法を模索しています。
入力画面:index.php?code=input
確認画面:index.php?code=confirm
完了画面:index.php?code=finish
と言うレベルでも付与出来るならば問題無いのですが、アクションをPOSTしながら
URLに変化を付ける方法が分かりませんでした。
素直にGETで渡すしかないのでしょうか?
0055nobodyさん
2007/10/05(金) 18:22:49ID:???書いた直後に気が付いた…。
これなら普通に<form action="index.php?=***">で渡せば良いやと言う事で…
スレ汚し、大変失礼致しました。
0056nobodyさん
2007/10/06(土) 01:24:36ID:???<input type="hidden" name="action_*">
とか
<input type="submit" name"action_*" value="じっこ〜">
とかname属性に入れれば良い
ここらへんはEthnaのチュートリアルにあるよ
0057nobodyさん
2007/10/11(木) 16:33:35ID:???それ様の格納フォルダみたいなものってないのでしょうか?もしくは何か良い方法あれば
お願いします
0059nobodyさん
2007/10/25(木) 15:41:25ID:1vHLTuW20060nobodyさん
2007/10/25(木) 16:15:34ID:???'log_level' => 'debug',
0061nobodyさん
2007/10/25(木) 23:58:03ID:???ちなみになんだけど
Ethna_Controller の getManagerClassName と getObjectClassName 。
微妙に名前の変換ロジックが違う
CVS版だと同じになってんのかな?
0062nobodyさん
2007/10/27(土) 21:04:42ID:euGofwdi0063nobodyさん
2007/10/31(水) 13:59:03ID:G97Omn6y0064nobodyさん
2007/10/31(水) 15:51:24ID:???$this->db->db->StartTrans();
って呼べば使えたと思う
0065nobodyさん
2007/11/01(木) 14:26:56ID:???いやいや、PEAR_DB版でもADOdb版でも、トランザクションは
$this->db->begin();
$this->db->rollback();
$this->db->commit();
で統一されてるよ。
0066nobodyさん
2007/11/01(木) 15:16:48ID:???/**
Improved method of initiating a transaction. Used together with CompleteTrans().
Advantages include:
a. StartTrans/CompleteTrans is nestable, unlike BeginTrans/CommitTrans/RollbackTrans. Only the outermost block is treated as a transaction.
b. CompleteTrans auto-detects SQL errors, and will rollback on errors, commit otherwise.
c. All BeginTrans/CommitTrans/RollbackTrans inside a StartTrans/CompleteTrans block are disabled, making it backward compatible.
*/
function StartTrans($errfn = 'ADODB_TransMonitor')
{....
006765
2007/11/01(木) 18:02:36ID:???CompleteTrans()でエラーを自動判定したり、トランザクション中に
別のメソッドでcommitされても大丈夫というのは便利ですね。
ADOdbの独自拡張ぽいから、Ethna_DB_ADOdb.phpを拡張するか、>>64氏の
書いたように直接呼ぶのが良さそう。
# ドキュメントに「毎回エラーチェックする必要ないよ」て書いてあるのは
# 無駄にSQLの実行回数が増えてしまうので微妙な気もするけど…
0068nobodyさん
2007/11/01(木) 23:50:53ID:???Ethna使ってて actionに書くべきか viewに書くべきか迷うんだが、
例えばactionで
AppManager使って必要なデータ取ってきてたとして
ついでに af->set()で出力のお膳立てもしてしまった方が楽に感じるんだが、
あえて、どこかに溜めておいてview側でaf->set()すべきなのかね?
0069nobodyさん
2007/11/02(金) 00:16:52ID:???actionformのsetはactionclassのperformに入る前の段階
つまり、authenticateとprepareで行うべき。
viewでやるのはもってのほか。
AppObject/AppManagerなどのModelにも極力行かすべきではない。
というルール付けでやってMVC意識してる。
007068
2007/11/02(金) 00:42:53ID:???0072nobodyさん
2007/11/02(金) 15:32:51ID:???その辺はMVCのジレンマだと思う。
効率的には、Actionで取得した情報をViewで使えるのがいいけど
特定のActionを通過しないとView側で正しい情報を利用できない
となると、処理と表示が分離されないことになるから微妙。
自分は多少無駄だとは思いつつも、ActionとViewでそれぞれ取得
しているよ。結果をキャッシュできるものはキャッシュしたり、memcachedを
使ったりして、DBの負荷は上げないように少し考えてはいるけど。
007369
2007/11/02(金) 17:06:05ID:???それ af->setApp() するときだよね?
>>68 は、af->set()って書いてるから、フォームの値を調整したいんだろ?
そう思って>>69 の書き込みなんだが。
> 自分は多少無駄だとは思いつつも
AppObjectはキャッシュ持ってるから一回取りに行った値は保存してる。
なんでAppObject使ってやればActionで判定にとった値をViewで
使いまわしてもDBには行かない。
その辺はORMの仕事じゃないかとも思うけど。
0074nobodyさん
2007/11/02(金) 17:10:22ID:???007568
2007/11/02(金) 23:44:12ID:???MVCの切り口でいくと
やはりそうなるんですかね。>72 >73
キャッシュされているにせよ
viewでもう一回AppObject取り直して
af->setApp()を数行書くってのも、たいそう無駄な気がしてます。
結局どんなAppObjectが渡って来るか
view自体知ってなくてはならない訳だし、
俺の場合描画上の小細工はSmartyのテンプレートにやらせる事が
多いんで、
それだったら、set()とかsetApp()ひっくるめて、
ActionForm全体を渡すから、viewさんあとは描画よろしく。
って方が潔い気がしてます。
Ethnaは viewの定義省略できるんだし、
ワザワザ2,3行だけのViewのファイル作らなくても良いかなと
思ってる。
こういうのMVC的にはダメなのかな。
007669
2007/11/03(土) 00:15:59ID:???とりあえず1分でも早いことコーティング終わらせたい!
って時は、確かにViewレスにしてperformでsetAppする。こともある。
前はそうやってたけど、最近面倒でもviewつくるようにしてる。
まぁ、1分かからんでしょ。
理由は2つあって、ひとつは、結局あとから追加仕様が加わった時に
viewがあるとそこに流し込めば良いという意識でAction作ってしまえる。
viewを造ってないと、結局違うActionに同じsetAppするようになる。
ある意味、そっちの方が絶対使い回しできない。
もうひとつは、forwardをいじりたい場合。
view/Subview.php
view/Subview/Draw.php
view/Subview/Draw/Finish.php
ってする場合、APPID_View_Subview::forward()に仕掛けをしてやって
テンプレパス変えたりする場合、クラス定義だけでもしておけばそれ以下の
viewもよろしくやってくれるけど、viewを定義しないとControllerで設定した
view使っちゃうからな。まぁ、特殊な場合だけど、forwardいじれるのは強力だからな。
007769
2007/11/03(土) 00:29:22ID:???>キャッシュされているにせよ
>viewでもう一回AppObject取り直して
>af->setApp()を数行書くってのも、たいそう無駄な気がしてます。
なんで、オレの場合はできる限りAction/Viewの行数を増やさないように
Modelにほとんどのコードが移動した。
AppObject/AppManagerのキャッシュを利かせるには、
同じfilter/offset/limit/orderでDBからfetchさせる必要があるから。
すると、ActionとViewでぶれがあるといけないからな。
だから、全体の流れとして必然的に
[Action]
ActionFormの調整(デフォルト値や、セレクトタブの値生成)
↓
af->validate()
↓
落ちるView先の決定ロジック
[View]
af->setApp()
のみ
ってなる。
007868
2007/11/03(土) 01:16:56ID:???>もうひとつは、forwardをいじりたい場合。
これは分る。確かにforwardいじりたい時もある。
>viewを造ってないと、結局違うActionに同じsetAppするようになる。
>ある意味、そっちの方が絶対使い回しできない。
そうかなー。viewを作ってあったにせよ、viewに渡すものが抽象化
しきれてなければ、結局使い回せない気がする。
一番抽象的で、どんなviewでも理解できるもの、つまりはActionFormを
渡すというお約束が、ゆるくて最強の接点だと思うんだが。
007968
2007/11/03(土) 01:33:38ID:???>AppObject/AppManagerのキャッシュを利かせるには、
>同じfilter/offset/limit/orderでDBからfetchさせる必要があるから。
勉強になります。
008069
2007/11/03(土) 02:54:08ID:???>渡すというお約束が、ゆるくて最強の接点だと思うんだが。
その辺は、開発スタイルとか案件に依るんじゃない?
取りあえず「オレはこういう感じでやってる」ってだけで、別に色々な方法があると思う。
使ってるうちに変わるだろうし、ってオレがそうなんだけど。
そのへんのゆるさはEthnaのいいところだし、一人や数人でやる分には気楽。
0081nobodyさん
2007/11/03(土) 15:20:42ID:???俺はjoinのやり方が分からなくて涙目だったので、いまだにSQL書いてるよ。
ZnedFrameworkも試してみたけど、Zend_Db_Tableが全然使えないので
結局そっちもSQLというチンカスっぷりだぜ。
0082nobodyさん
2007/11/03(土) 16:01:56ID:???なんで漏れもSQL書いてるよ。AppObjectはテーブルのレコードと1対1でやり取りする場面だけ
使ってる。検索して一覧引っ張ってくるようなケースは、joinする場合が多いし、
where文SQLで書く方が慣れているんで、SQL書いた処理をAppManagerに詰め込んでるよ。
0083nobodyさん
2007/11/05(月) 13:41:20ID:???もっとも、それやった香具師がMLで「table読むときはカラム名小文字になるのに、viweを読むと大文字になる。がっでむ!」と言っていたので、あまりお勧めではないのかもしれん。
……S2EthnaでS2Dao.PHPか?w
0084nobodyさん
2007/11/07(水) 18:33:33ID:NnNW38Hz> 入力のShift_JISを内部コードに変換
> まずは、Ethnaのフィルタで入力コードを変換してしまいます。
とあるのですが
/usr/local/lib/php/Ethna/class/Ethna_Filter.php
この中に書き加える訳ではないのですか?
上記で駄目だったので、APPID_Filter.php を以下のように書いて
class APPID_Filter extends Ethna_Filter{
{
function prefilter(){・・・}
function InputEncoding($data){・・・}
}
APPID_Controller.phpでrequire onceしてみたりしたのですが
$_POSTされたデータが変換されなくて悩んでます。
どなたかご教授ください。よろしくお願いします。
0085nobodyさん
2007/11/07(水) 18:36:31ID:???0086nobodyさん
2007/11/08(木) 01:13:51ID:Wm9UgOj0これがいまいちわからないのです。フォームヘルパでセレクトボックスのoptionの値を
データベースから取得したいと考えてまして。
Ethnaの開発マニュアルみていたら、アクションフォームで
Optionの設定を'address,prefecture'に書けば見たいな事わかったんですが、、
プロパティの値ってのがよくわからないんです・・・
だれかわかる人教えてください。
0087nobodyさん
2007/11/08(木) 02:07:11ID:???同マネージャ内の別関数(fuga)を呼び出したい場合、
以下のどちらが適しているでしょうか?
$Hoge_m =& $this->backend->getManager('Hoge');
$Hoge_m->fuga();
or
$this->fuga();
0088nobodyさん
2007/11/08(木) 02:29:21ID:Wm9UgOj0$this->fuga();
008986
2007/11/08(木) 02:56:20ID:???もう一点非常に疑問点があるのですが、
$Hoge_m =& $this->backend->getManager('Hoge');
と
$Hoge_m = $this->backend->getManager('Hoge');
ってどう違うのでしょうか?
この&って参照渡しでしょうか?
参照渡しって単なる変数だけでなく、オブジェクトに対しても
利用可能なのでしょうか?
0090nobodyさん
2007/11/08(木) 16:06:31ID:???http://www.php.net/manual/ja/language.references.php
参照はスカラー型でもオブジェクトや配列でも使えるよ。
余談だけど、PHP5以降では関数の戻り値や変数への代入なんかで
同じオブジェクトを指し示している必要がないのであれば、参照渡しを
するべきではないので注意。メモリの効率化とか思っていると、むしろ
無駄に消費されることがある。
http://www.phppro.jp/news/304
PHP4/5に対応するEthna(本体)には関係ない話だけどね。
0091nobodyさん
2007/11/11(日) 12:12:44ID:???AjaxヘルパやHTMLヘルパーなんかは装備されないんでしょうか?
あと、ルーティングをもう少し改善して欲しいですな。
0092nobodyさん
2007/11/12(月) 15:41:42ID:???0093nobodyさん
2007/11/13(火) 01:26:05ID:41cf2n7r構築するタイミングがわからない
ActionForm辺りで
$this->auth =& new $this->backend->ctl->class['auth'](&$this->backend->ctl)
ってやってあげればいいんだべか。
Controllerのコンストラクタで構築するのはちょっくら早い感じだし
どうするとスマートなんでげしょ。
009593
2007/11/13(火) 23:45:08ID:41cf2n7r0096nobodyさん
2007/11/14(水) 04:30:56ID:???AppManager 内で
throwして
アクション内でcatchしたい場合、
どのように記述すればよいでしょうか?
単にAppManager内でthrowすると
PHP Fatal error: Uncaught exception 'Exception'
がおきてしまいます
0097nobodyさん
2007/11/16(金) 03:14:04ID:???エラーが発生したらトランザクション中の後続するSQLはスキップしそうだけどね
そうじゃなきゃあんまりでしょw
0099nobodyさん
2007/11/19(月) 22:11:25ID:???$obj->setParam( $param );
$obj =& $this->backend->getManager('hoge');
みたいな感じにすると
$obj->setParam( $param );が既になされている状態になる理由が
よくわからんです。
010099
2007/11/20(火) 00:55:53ID:???$this->backend->getManager()
をオブジェクト生成(new)と同じ感覚で使ってたけど、
もしそうなら大きな勘違いですよね。
newみたいに使う方法ってないでしょうか?
0101nobodyさん
2007/11/20(火) 04:03:10ID:???そもそも、ManagerはObjectと違っていくつも作らんのよ。
だから、setParam()とかしてる時点で使い方間違ってるよ。
Objectにもたせなよ。
0102nobodyさん
2007/11/20(火) 07:09:01ID:???0103nobodyさん
2007/11/20(火) 18:19:20ID:???知らんかった…
それはさておき、AppManagerにsetParamする状況なんてあるっけ?
ActionForm使って、Action/View間で$this->af->setApp()/getApp()で
取りまわしたりすることはあるけど、結構イレギュラーな場合だけかな。
010599
2007/11/20(火) 22:31:06ID:???サンクスです!!
>>101
>>103
マネージャを普通のクラスみたいに使ってます。。。
マネージャでクラス作ってnewする代わりに
getManagerして。。。。
だめだろうか
requireとかめんどいんだけど。
0106nobodyさん
2007/11/20(火) 22:39:15ID:???そういう使い方も想定されてるのかね?
0107101
2007/11/21(水) 00:34:11ID:???AppManagerの同じメソッドで取りに行きたいけど、その間隙にUpdateしちゃってて、
そのままメソッドコールするとキャッシュが帰ってくるのがうっとうしいという状況。
たまにある。あまり設計がよくないせいかもしれんけど。
0108nobodyさん
2007/11/21(水) 03:01:24ID:???ローダーとして使うなら、(AppId)_Controller.phpの$classに
$class = array(
...
'foo' => 'Foo_Bar_Buzz',
...
);
みたいに定義しておいて、
$obj = $this->backend->getObject('foo');
で取得するというのはどうだろうか。第2引数にtrueを指定しないと
キャッシュされたオブジェクトが返るので注意ということで。
0109nobodyさん
2007/12/14(金) 00:07:12ID:qsT4Ha3J'id' => array(
'form_type' => FORM_TYPE_SELECT,
'type' => array(VAR_TYPE_INT),
'option' => array(1=>'man', 2=>'woman')
)
てなときに
-- viewclass
$this->af->set('id', array(1, 1, 2, 2, 1));
-- template
{form_input name="id" emptyoption=""}
ってやっても
うまくselected="selected"が付いてくれないんだけど
FORM_TYPE_SELECTで配列を扱うのは面倒くさいのかしら
0110nobodyさん
2007/12/14(金) 01:37:02ID:???MultipuleのSelectタブ?
オレは自分でガッツリとform_inputを作ってしまって、Ethnaデフォルトは
もう使って無い。まぁ、面倒だけど意外と簡単ですよ。
Defaultのform_inputは対応してるのかな?
Ethna_ViewClass::getFormInput_Html
見てるとしてないね。
0111109
2007/12/14(金) 07:29:06ID:???いや、マルチプルじゃなくてシングルセレクトなSelectタグの配列。
<select name="id[]"></select>
<select name="id[]"></select>
<select name="id[]"></select>
ってな感じで使いたいんです。
そうか、Selectタグでarray(VAR_TYPE_〜〜)ってやると
マルチプル扱いになるんね。
んでPOSTされたデータ上でマルチセレクトなSelectタグか
Selectタグの配列かの見分けは付かないと。。。
自分でがっつり作り込むのは面倒なので
ViewClassを継承したクラスで下のような変更加えて使ってみます。
マルチセレクトかシングルセレクトな配列か見分けが付かないのなら問題はないはず。
-- Ethna_ViewClass.php (function _getFormInput_Select($name, $def, $params))
-- 702行名ぐらい
// default値の設定
if (isset($params['default'])) {
$current_value = $params['default'];
} else if (isset($def['default'])) {
$current_value = $def['default'];
} else {
$current_value = array();
}
- current_value = array_map('strval', to_array($current_value));
+ if ($def['_form_counter'] < count($current_value)) {
+ $current_value = array_map('strval', to_array($current_value[$def['_form_counter']]));
+ } else {
+ $current_value = array_map('strval', to_array($current_value));
+ }
ありがとやんす。
0112nobodyさん
2007/12/25(火) 11:41:37ID:???中野人復旧頼む。リファレンスみたいよー
0113nobodyさん
2008/01/09(水) 18:52:02ID:I5nTeu3Fログファイル名を固定ではなくて日付ごとに出すことってできないんですか?
今 log/app.log
↓
log/20080109.log
みたいに。
ご存知の方いましたらお願いします。
0114nobodyさん
2008/01/09(水) 21:49:38ID:???もしくはEthna_Plugin_Logwriter_Fileあたりを継承して独自のLogwriterを作る。
0115113
2008/01/10(木) 15:35:23ID:???ありがとうございました。
0116nobodyさん
2008/01/23(水) 21:01:59ID:vMSy4RO6一通りEthnaでアプリ書けるようになるまでどのくらいかかった?
■ このスレッドは過去ログ倉庫に格納されています