【PHP】Ethna part.2【国産フレームワーク】
国産フレームワーク、Ethnaでいい意味で手抜きなプログラミングライフを。
Ethna -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/ >>161
http://pc11.2ch.net/test/read.cgi/php/1177683436/276
276 名前:nobodyさん[sage] 投稿日:2008/04/30(水) 12:41:32 ID:???
一週間いじってみたがこんな致命的バグの潜んだFWは使う気になれん
http://pc11.2ch.net/test/read.cgi/php/1205475360/765
765 名前:nobodyさん[sage] 投稿日:2008/04/29(火) 00:30:20 ID:???
一週間いじってみたがこんな致命的バグの潜んだFWは使う気になれん
[project]-ini.php
で通常DB使う場合に設定する
"dsn"=>"mysql://mysql_user:mysql_userpass@mysql_server/mysql_db",
といった記述なんですが、
mysql_server部分 を動的に変えたい場合、何か良い方法はないでしょうか。
[project]-ini.php 内では
$this->aff->get()とか使用できないので。。。
validate について質問
1.inputフォーム
2.validate->確認画面
3.DB更新&完了画面
という遷移をしたい場合 validateって3でも必要ですか?
2でvalidateが通った後無理やり GET引数に?varname=XXXX...略、とか
したら、validateが通っていないデータで更新できてしまいますよね?
あと、formでpostを繰り返して遷移していく場合、もどると期限切れに
なりますよね?これって 302とかを使って解決すると思いますが、
Ethna的にはどのように書くのでしょうか?
1. GET なにがしかの form
2. POST confirm [validate] => 302 confirmed
3. GET confirmed
4. POST do => 302 done
5. GET done >>168
ヒント:
class DB更新&完了画面Action extends 確認画面Action
{
function perform()
{
DB更新
return 完了画面のview
}
} >>168
トランザクションチェックやら、CSRFチェックやら、
validate済みデータをセッションに保存しておくやらすればいいんじゃね? >>168
3でもvalidateは必要です。
複数の画面を遷移しながら移動する場合はセッションに保存するのがてっとりばやいでしょう。 戦後教育は文部省と日教組の不毛のイデオロギー対立により本来の教育を蔑ろにし、主役である子供達を放置してきた。最初にその犠牲となっ
たのがいわゆる「団塊チルドレン」と呼ばれる世代である。彼らは歪んだ「権利・自由・平等」を教えられ、「責任・義務」を教えられないま
まに育った。日教組は彼らに経済と言う物差ししか与える事ができず、信念・哲学・自尊心という価値からは程遠い「金と物」にしか価値を見
出せない貧しい精神を育んだのだ。この事は「失われた十年」と呼ばれる90年代に於ける彼らの生き様に大きく影響した。
子供は幼児期に於いて父性と母性の対比の中で社会性を獲得する。「亭主元気で留守が良い」と言うコピーがはやったが、父性不在の家庭はや
がて「団塊チルドレン」の社会性の無さの原因となった。当時オバタリアンと呼ばれた世代は、戦後処理もろくに済んでいないのに平気で海外
へ出かけ、金に飽かせてブランド商品を買い漁り、傲慢さを世界中にまき散らした。彼らの世代に特徴的であるこの品性・品行の悪さは、後の
世代のライフ・スタイルにまで影響を与えた。それ以上に、欧米諸国が未だに日本人を蔑視し、アジア諸国が不信感を持ち続けている事への鈍
感は不幸でさえある。団塊の世代が戦後の営みの中で経済力に見合う人生観や価値観、広義の品性・品行やモラルを獲得していれば日本社会は
ここまで歪まなかっただろう。
90年代は「失われた十年」と呼ばれている。経済と言う物差ししか持たなかった我々は、旧来の発想で経済的な豊かさを追求し続けたが故にバ
ブルの崩壊をもたらした。その時不幸だったのは「我々は何処へ行くのか?」と言う根源的な迷いに気かなかった事だ。この事が90年代を無為
に浪費した最大の原因である。団塊の世代は欧米を追う間は素晴らしい能力を発揮したが、追いついた後のビジョンを描く想像力が欠如してい
た。彼らの責任では無い。社会が彼らにその様な能力を要求しなかったのだ。村上龍の「あの金で何が買えたか」が売れたと聞くが、悲しいの
は未だにその程度の次元でしかバブルを検証できないメンタリティーの低さである。検証すべきは「何故我々が貧しい価値観しか持ち得なかっ
たのか」と言う事である筈だ。まさしく教育の問題である。冒頭で述べた様に信念・哲学・自尊心を育む努力を怠らなければ、もっと違った社
会があった筈である。 Ethnaの中の人、全然やる気無い感じが伝わってくる CakePHPに乗り換えたけど、まだちょっと期待してるよ Ethna_ActionForm::handleError()
ってオーバーライドできますか?
なんか {APPID}_ActionFormに書いても出来ないんですけど(´;ω;`) ちゃんと{APPID}_ActionFormを継承してるか? >>179
どうもです。
$use_validator_plugin に falseを設定したら動きました。
が、pluginが使えないと色々面倒ですね。
エラーメッセージを全体的に変更したくて、Ethna本体を変更しないように
ってなると、やはり Pluginを自分で書くなりするしかないですか?
たとえば未入力のエラーは標準が
{form}を入力してください
ですが
{form}を入力してくださいね♪
にしたい場合など、みなさんはどうしているんでしょうか?
$form_template とか使うんでしょうか? $form => array(
'required_error' => '{form}を入力してくださいね♪ ' ethnaのサイトウィルスはってあったから注意
iframeのやつね
誰か連絡してやってくれ・・・ >>183
ethena.jpが乗っ取られてたらしい。
現在は閉鎖中。
さくらインターネットのルータがウイルスに感染してたってこと?
その方が怖いんだが さくらスレ見たらやっぱりさくらが問題みたいね
こえーな ってか大問題なのに騒がれなさすぎだろw
上流でクラックされてたらどうしようもない
サーバ単位の感染の比じゃねーぞ そんなに簡単に乗っ取れるインターネットっていったい 簡単に言うけど、ssl化すればいいんじゃね?
ところで、Ethnaで アクションからアクションを呼びたい場合って同かけばいいのでしょうか?
今作っているのがバッチ処理の関係なんですけど、バッチ処理をコントロールする
アクションがいて、条件によってサブの処理アクションを呼び出したいんですけど...
/batch.php <= 一定時間ごとに起動
/batch/proc1 <= サブアクション
/batch/proc2 〃
/batch/proc3 〃
あと、2.3.5がリリースされましたが、2.3.2からはそのままアップデート
して何か問題ありますか? >>192
確か公式にアクションチェインの方法かいてあったはず
>>193
どうもです。
マニュアル見ててわかりました。
$this->backend->perform($action_name);
を perform()に書いてあげればいいみたいですね。
>>192
そのままアップデートして問題ないよ。大きくは変わってないので。 $this->session->start() のあとに
$this->session->isStart() してもtrueが返らないのは仕様ですか?
$this->session->isStart(true)とすれば返るんですが...
Ethna_Session::start()のなかで $this->anonymousに代入していないのは
わざとですか?
$_SESSION['__anonymous__'] と Ethna_Session::anonymouse には何か使い
分けている理由があるのですか?
$this->session->start()じゃなくてsession_start()してんじゃないの?
auto_startとか。
あと匿名と通常のセッションを同時に使い分けることはできない。
気にくわないならEthna_Sessionを継承しる。
>>197
ソース見て見れ!
Ethna_Session::start()
で $anonymousに代入していないから
restoreが呼ばれてからじゃないと
isAnonymous() で取得できないから、isStart()が正常な値を返せない
これは仕様なのか?
ログイン処理で匿名から、通常のセッションに切り替える処理を入れたんだが
ログインチェック処理が何故かうまく通らないから調べたら、そうなっていた
start()
ttp://ethna.jp/doc/__filesource/fsource_Ethna__classEthna_Session.php.html#a142
isStart()
ttp://ethna.jp/doc/__filesource/fsource_Ethna__classEthna_Session.php.html#a276
isAnonymous()
ttp://ethna.jp/doc/__filesource/fsource_Ethna__classEthna_Session.php.html#a295 >>198
だから「同時に使い分けることはできない」んだってば。
これが仕様なのかバグなのかは知らないけど。
>>200
だから、切り替えたいんだってば。
というより。
Anonymous関係なく、 session->start()した直後 isStart()よんでみ?
start前はbool(false)、
start後はbool(true)になるけど?
「切り替え」も「同時に使い分ける」と同義。
匿名セッションをdestroy()してから、そのまま通常セッションをstart()してもだめってこと。
>>203
なるほど、そういう説明なら納得。
ログイン前の情報を匿名セッションで保存していて、ログイン後にそれらの
情報を扱いたい場合ってどうしているんですか?
Ethna_Sessionを new して $this->session に渡しちゃうとかですか? わざわざ匿名セッションを使う意味がわからんのだけど。
「匿名セッション」=「Ethnaアプリではないアプリが開始したセッションを使うため」かと。
>>205
実はよくわかってないのです。
匿名=アプリには非ログインだけど、セッションを使いたい
非匿名=アプリにログイン状態
かな〜と、勝手に思っていました。
たとえばログインのアクションを起こす直前の情報を匿名状態で持っていて
ログインが必要なアクションを起こした場合にログイン画面へジャンプ。
ログイン処理が正常に済んだら、保存していた情報でページにジャンプしたり
フォームに入力したりする。
一応ロールっぽい概念は持っているんだけど、一番簡単なログインチェックは
isStart() を呼ぶだけで出来るから便利だなぁなどと思っていたけど、
ちょっと違うのかな? それならログインしていようといまいと普通にセッションを使うべし。
ログインしたらセッションの中にフラグを立てる。
あとはisStart()じゃなくてそのフラグを確認するだけ。 なるほど、ありがとうございます。
えーと、こうなったいきさつを少しだけ、ethnaのサイトに isStart()で
ログインをチェックしているサンプルがあってセッションスタート=ログイン
状態というような感じのサンプルでした。
それでそれを元に開発を進めていったんですが、非ログイン状態でもセッション
を使って何かしたいなぁ。となったときにセッションを明示的に開始していないと
セッションが使えないという罠にはまり、しばらく悩む。
で、ソースを眺めていたら、匿名というのを見つけて、匿名時はisStart()が
falseを返すという性質があるなぁそれなら。
となったわけです。
普通に考えたら、セッションにフラグを持つのが正解ですね。
事実FWを使わないときはそうやって書いていたし...
逆切れすみませんでした。
PHP全般とおしていえることですが、無駄にセッションを開始したくない場合
ってどうやるのが正解ですか?
sessionのauto_startを無効にして
if (!empty($_COOKIE['SESSID'])){
session_id($_COOKIE['SESSID']);
session_start();
}
というような感じでしょうか? >>208
たぶんそれで問題なあいと思うよ。
まぁそんなに神経質にならなくてもGCがうまいことやってくれます。
ところで、過疎化しているから回答がつかないかもしれないけど質問。
HiddenVarsを使うという記事を見つけたのですが、これって
1.input 2.check 3.do という 3phaseで処理する場合 2で validate
しても 2と3の間でデータを書き換えできますよね?
3の直前に validateを入れたとしても書き換えたデータがそれなりの
ものであれば、2でチェックした内容と違うもので更新できますね?
さらにいうろ 3のアクションのみでデータを登録できちゃうから、
不正登録とか連投ができますよね?
これを防ぐにはセッションやチェックファイル、DBなどを使わないと
だめですよね?
何かいいアイディアありますか? すんません、たとえば複数のテーブルを扱うと時って アクションクラスには
どのように書けばいいのでしょうか?
例えば会員情報に会員状態を表す status(仮登録、本登録、退会、削除)があり、
付随するデータにそのデータの状態をあらわす status(下書き、公開、閲覧停止、削除)
があったりします。
>>212
おまいの自作自演だったりして、このレスもw 過疎化しているようなので、レスがつくか不安ですが質問です。
$this->backend->perform() でサブアクションを実行したいのですが、
$form要素は呼び出し側のものしか反映されていないようです。
サブアクションのアクションクラスで$form要素を定義したいのですが
どのように書けばいいのでしょうか? 間違えた
>サブアクションのアクションクラスで$form要素を定義したいのですが
>どのように書けばいいのでしょうか?
サブアクションのアクションフォームクラスで$form要素を定義したいのですが
どのように書けばいいのでしょうか?
です。
よろしくお願いいたします。 >>215
そもそもチミは$formの定義をなんだと思ってるのかね・・・。
ActionClassと一対一なんだよ。
サブアクションとか勝手に言っても、それは勝手に言ってるだけだから
自分でちゃんとActionformもnewして_setFormDefしたまえ。 >>219
なにつかってる?
最近乗り換えけんとうちう RSSパーサーってみなさんはpear使ってますか? GREEの腐ったCMのおかげで
Ethnaも腐ったフレームワークと見られるようになりました
http://labs.gree.jp/Top/Document/20060707.html#d1ddfba7
手始めに↑を動かしてみたんですが、
エラーメッセージが2重に出てしまっています。
例えば、全ての項目を空にして送信ボタンを押した場合に
以下のようなエラーメッセージが表示されてしまいます。
* メールアドレス が入力されていません
* パスワード が入力されていません
* パスワード(確認) が入力されていません
* メールアドレス が入力されていません
* パスワード が入力されていません
* パスワード(確認) が入力されていません
2重のエラーメッセージが表示されないようにするには、
$errorsを自前で処理にしないといけないのでしょうか?
環境:
Ethna 2.5.0-preview3 すみません、こちらのミスでした。
prepare()メソッドにvar_dump($this->af->validate());を書いていた為に
エラーが2重で出力されていたようです。
function prepare()
{
if ($this->af->validate() > 0) {
var_dump($this->af->validate());
return 'index';
}
return null;
}
var_dump($this->af->validate());を削除したら2重で表示することはなくなりました。 ethnaでサイト作ってあるんですけど、メンテのときだけ
どのページにアクセスしてもメンテ中画面に飛ばす方法ないですか? あげ!
・・・って前の書き込み5ヶ月前かよ・・・。 >>226
決まったActionしかしないってことにさせればいい。
エントリポイントを1つにルーティングしてるなら、そのエントリポイントの
main()の第2引数をarray('undermaintainance')にしちゃえば。
たくさんエントリポイントがあるなら、Controllerの
getActionFormNameをoverrideして、つねに'undermaintainace'の
Stringを返すようにすれば良いんじゃない?
Webサーバの方でリダイレクト設定するとかでもいいんでない?
Apacheなら.htaccess一個書けば済む 誰かまだ使ってるの?
これ使って作られたオープンソースものがあれば教えて欲しいと思ったんだけど 誰か見てますか…此処。
質問とかしていいのかな?
<select name="aaa" id="aaa" size="7" multiple class="bbb">
{foreach from=$app.hoge item=item}
<option value="{$item.hoge}">{$item.fuga}</option>
{/foreach}
</select>
と、tplで書いています。
ここに出されたデータをアクションの方で
$this->af->get('????');
って風に取り出したいんです。
やってみた事↓
[action側]
'aaa'=>array(
'type'=>array(VAR_TYPE_INT),
'name'=>'ほげ',
),
[tpl側]
上のname="aaa"をname="aaa[]"に
[action側]
$this->af->get('aaa');
結果はNULLでした…。
<input type=~.....
のつもりでやってたんですけど…どうにかしてselectに入ったデータって取り出せないですかね。 とれるが、ちゃんと調べて説明する暇がないのでがんばってくれ
そもそもとれないとプログラムとしておかしいだろ? actionフォームの方からテンプレートのラジオボタンとか…弄れないかなあ…。
検索前の画面でラジオボタン1、2とテキストボックスがあって
2を選んだ場合はテキストボックスが使えなくなる(disables)
検索する前に、2のラジオボタンが選択されてたら、検索後の画面で2のラジオボタンが選択されたままになってて、
テキストボックスは使えないまま表示される。
って事がしたいんですけどね。
現在は最初の読み込みでラジオボタンどっちも選択されてないし、検索後もどっちからも外れ、
テキストボックスの使用不可もはずれちゃう状態…。
1のラジオボタンに<input.......checked = true />って入れてみたら
最初の読み込みではラジオボタン1にチェック入るようになったのは良いんだけど、
2を選んで検索した後も1が選択されてるんですよね…。
誰か解決策知ってる方いらっしゃったらよろしくお願いします。 すみません。ラジオボタンの問題は自己解決しました。 すみません。ラジオボタンの問題は自己解決しました。 書き込めない…?
ラジオボタンの問題は自己解決しました。 >>235
うーん、ActionFormからHTMLにdisabledを入れるのって
今時のやり方じゃない感じがする。
disabledってあくまで補助だから、補助は補助らしくjavascriptで後付け設定かなぁ。
しかも、radioとtextの連動だからなおさらその感じがする。
自分だったら、適当にradioとtextにid振って
$(function(){});
か
Event.observe(window, 'load', function(){});
するかなぁ。
これ面白そうだな。
いまやってるDrupalが落ち着いたら手を出してみたい。
CMSはページ管理には便利だけど、ハマると結構てこずるや。
ZFWとどっちがMVCの分け方判りやすいかな Fatal error: Call to a member function getAll() on a non-object in
…というエラーが出ます。
getAllを用意した__DB_PEAR.phpもlibに入れてControllerからincludeしてるのに…。
Ethnaは最新バージョンです。
何故飛べないのか原因がさっぱりです。 MySQLの設定で何か問題があったようです。
詳しくは分かりません。 ethnaにPEAR::PAGERのようなページング用のメソッドは
用意してありますでしょうか?
ご存知の方が居られましたらご教授よろしくお願いいたします。
つttp://ethna.jp/
Ethna > ドキュメント > 開発マニュアル > デモ > ページャを作成する http://hoge.com/ethna/?hoge=1&peko=1
というURLがあったとして、hogeとpekoが入れ替わることもあるとするとき、
1つ目の引数がhogeであるかpekoであるかを知る方法ってありますか?
$this->af->get(name[0])
とかで、hogeって入ってるとか。
今のところpathinfoあたりから自分で分解するしか思いつかないです・・・
>>246
$_SERVER['QUERY_STRING']からとるしかねーじゃん。 >247
やっぱそうなりますか。
ありがとうございますた アクションloginのフォーム表示画面でsubmitするとURLがindex.phpになってしまうんですけど
これを同じloginにするにはどうしたらよいでしょうか?エントリはindex.phpです。 >>249
hogehoge.tpl
<form action="login.php" method="post">
<input type=hidden value=1 name=action_login_do>
<input name=id>
<input name=pass>
<input type=submit>
</form>
login.php
<?php
include_once Hoge_Controller.php
Hoge_Controller::main('Hoge_Controller', array('login', 'login_*'), 'login'); クエリエラーが発生したとき、画面上に
***[508](ERR): Ethna_DB_PEAR._query(\class\DB\Ethna_DB_PEAR.php:306): Query Error SQL[〜〜]
みたいな感じで表示されるんだが、これを止める方法ってない?
一応、ロジックで
$res = $db->query($sql);
if (Ethna::isError($res)) {
return Ethna::raiseNotice('登録エラー',E_DATA_REGIST);
}
みたいな感じにはしてるんだけど・・・・。 EthnaってもうちゃんとO/Rマッピング対応してんの?
joinとかサブクエリーとか、Postgresとか使える? アダルトサイトなんてXOOPSか下手するとブログ程度かと思ってたのに。
進んでんな。 {form_input name="hoge"}
の形でcheckedフラグ入れれる方法知りませんか?
最初からchecked=trueにしておきたいのですけど…。
型はチェックボックスでoptionに連想配列入れてるので<input...の形にはしたくないのです。
actionで$formに何か指定できるとか、{form_input...に何か付け足すとか
ご存知の方いらっしゃいましたらお願いします。 >>252
if (Ethna::isError($res))を何処に書いてるのか分からんが
Managerに書いてるんだったら処理全体をtryで囲って、
エラーの場合はcatchにthrowしてfalseを返す仕様にしたらどうだろう
呼び出し元の方で$this->ae->addObject();を使う 自己解決しました。
$this->af->set('hoge', "valueの値");
とすることによって、指定の箇所へチェックを入れれました。 そもそも何でCakePHPとかsymfony使わずにEthnaをなのか
そこから教えて欲しい。 グリイが使ってるという安直な理由だけだろう。サポートも無いのにね。
そのグリイもエスナ導入のために、メンテナを技術部長待遇で飼うほど維持コスト描けてる現実。年間1000万以上?