symfonyチュートリアル実践【第5日目】

Nov 04 2006

5日目

フォームとページャ。ログインの処理の解説がメインっぽい。
最初の段落で、昨日(4日目)は長くて大変だったよね、でもこの5日目をやれば元気になるよ!と励まされました。読者の気持ちがよくわかっているチュートリアルのようです。

$ symfony init-module frontend user

でログインに必要なクラスの雛形(skeleton)が作られる。

“Create the user/login action”のところでapps/frontend/modules/user/actions/action.class.phpを開くとexecuteIndexというメソッドがすでに書かれているので、最初そこに書き足してしまいましたがexecute*Login*を追記しないとダメです。ブラウザで/user/loginにアクセスするとOops! We couldn’t find this page for you.と怒られます。

executeIndexの方は、apps/frontend/modules/user/templates/indexSuccess.phpと紐づいていて、

http://askeet/frontend_dev.php/user

にアクセスすると表示される。executeTestを定義して、testSuccess.phpを作ると/user/testでアクセスできる。おぉ。少しわかった気がする。

この段階で/user/loginでフォームのボタンを押しても何も起きない。”Handle the login form submission”の箇所でexecuteLoginを再び書き換える。

ここでちょっと脱線。
puttyでvimを使っていると、ブラウザからのコピペはInsertモードにして右クリック、で先ほどまでやっていたのだがautoindentが効いたりその他諸々vimrcの設定が悪さして滅茶苦茶になる。ちょっと調べたら簡単な方法があった!
#1 いまさらながら vim の基本小技

クリップボードにコピーした状態で、

:a
ペーストする(puttyなので右クリック)
Control-C, or ESC

ペーストした後改行で終わらないとその行がペーストされないので注意。しかし今までnano起動したりvimrc読み込まないモードで起動していた自分はいったい。。

さて、無事executeLoginをコピペできると動くようになるのですがすでに登録されているnicknameがわからないので、、

$ mysql askeet
mysql> select * from ask_user;

で出てきたnicknameを入力すると無事ログイン&リファラーで前にいたページを取得してあるのでそのページにリダイレクト。パスワードは何でもOKです。

“Grant privileges”のところで言うのは、すべての動作を認証下に置く方法はチュートリアルの6日目でやるようです。

“Add the user/logout action”でexecuteLogoutを記述している中で、executeLoginのところで

$this->getUser()->setAttribute('subscriber_id', $user->getId(), 'subscriber');

などと3番目の引数でsubscriberと名前をつけている変数を

$this->getUser()->getAttributeHolder()->removeNamespace('subscriber');

で一括削除。

“Update the layout”で書き換えるとログイン&ログアウトができるようになりそれらしくなってきました。

“Question pager”からページャ。次へ、とか前へ、です。
まずはapps/frontend/modules/question/actions/actions.class.phpのexecuteListを書き換え。
$c->addDescendingOrderByColumn(QuestionPeer::INTERESTED_USERS);このコードにはSQLを完全に隠蔽しているなぁ、と感じました。関数名を全部覚えるのは非効率なのでctagsを工夫して使う必要がありそう。

“Use a custom parameter”で、先ほどexecuteListで2とハードコーディングした部分を

$pager = new sfPropelPager('Question', sfConfig::get('app_pager_homepage_max'));

と書き換える。apps/frontend/config/app.ymlで定義。

“Modify the listSuccess.php template”ではapps/frontend/modules/question/templates/listSuccess.phpを編集。$questionsをforeachで回していたのをexecuteListで$question_pagerに変えたので変更。

ブラウザでアクセスするとchmodのOperation permittedエラーがcacheのファイルで出ましたが、、2回目のアクセスでは消えた。

Notice: Array to string conversion in /usr/share/pear/symfony/controller/sfRouting.class.php on line 208
Notice: Array to string conversion in /usr/share/pear/symfony/controller/sfRouting.class.php on line 229
Notice: Undefined offset: 4 in /usr/share/pear/symfony/controller/sfRouting.class.php on line 229
Warning: chmod() [function.chmod]: Operation not permitted in /usr/share/pear/symfony/cache/sfFileCache.class.php on line 465

原因不明。

最後に”Refactoring”。あれこれ書き換える。
そして最後の”Templates”でaskeet SVN repositoryの中に_list.phpが見つからない。。
http://svn.askeet.com/tags/release_day_5/frontend/modules/question/templates/
ここには_question_list.phpがあるが、、これをinclude_partialするとたくさんエラーが。

追記:
チュートリアルページの下部のコメント#12に対策が書いてあった。

うーん、まぁ、よしとしよう。5日目終了。

No responses yet

Leave a Reply