2011/04/26

symfonyのsfpageflow

php講習 4/26

<今日の内容>
・フォームを簡単にするためのプラグイン
・symfonyのコマンドに追加する(タスクの追加)
  sfpageflowを使って自動生成する、  今回コマンドの作り方はやらない

<説明>
・sfPageFlowとは
    * フォームのページ遷移をyml で管理し
    * 煩雑なフォーム処理をシンプルに構築できる。
・本日は、sfPageFlowを使って、入力、確認、保存の流れを
  自動生成する機能を実習
・使用するファイルはそれぞれWebテキストからダウンロード可能です。

(1)pluginの設置
/plugins/sfPageFlowPlugin

(2)自動生成タスクの設置
/bbs2/data/tasks/に設置

(3)addonファイルの設置
・設置場所確認
$ whereis pear
pear: /usr/bin/pear /etc/pear.conf /etc/pear /usr/share/pear
/usr/share/pearにsymfonyはある

・ここからは、rootになってaddonファイルを移動後、展開
# mv addon.zip /usr/share/pear/symfony/addon/prople/generator
# unzip addon.zip
Archive:  addon.zip
replace sfPropelCrudGenerator.class.php? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
 inflating: sfPropelCrudGenerator.class.php
 inflating: sfPropelEditGenerator.class.php
 inflating: sfPropelListGenerator.class.php
# ll
合計 24
-rw-r--r-- 1 usr usr 4926  4月 26 10:41 addon.zip
-rw-r--r-- 1 root root 1766  3月 11 14:39 sfPropelAdminGenerator.class.php
-rw-r--r-- 1 root root 3991  7月  2  2009 sfPropelCrudGenerator.class.php
-rw-r--r-- 1 root root 3991  7月  2  2009 sfPropelEditGenerator.class.php
-rw-r--r-- 1 root root 3991  7月  2  2009 sfPropelListGenerator.class.php
# rm addon.zip

(4)スケルトンファイルの設置(generator.zip)
# pwd
/usr/share/pear/data/symfony
# ll
合計 60
drwxr-xr-x 2 root root  4096  3月 11 14:39 bin
drwxr-xr-x 2 root root  4096  3月 11 14:39 config
drwxr-xr-x 2 root root  4096  3月 11 14:39 data
drwxr-xr-x 4 root root  4096  4月 26 11:06 generator
-rw-r--r-- 1 usr usr 13994  4月 26 11:02 generator.zip
drwxr-xr-x 2 root root 12288  3月 11 14:39 i18n
drwxr-xr-x 3 root root  4096  3月 11 14:39 modules
drwxr-xr-x 7 root root  4096  3月 11 14:39 skeleton
drwxr-xr-x 2 root root  4096  3月 11 14:39 tasks
drwxr-xr-x 4 root root  4096  3月 11 14:39 web

・今あるgeneratorは、バックアップし、generator.zipを展開
# mv generator generator_bk
# unzip generator.zip

(5)ヘルパー追加
/lib/helper/下に設置
・このファイルはメールで送付されています。

・これで準備が整いました。

(6)自動生成(symfonyのユーザコマンド)、bbsを使って説明
#CREATE
$ symfony propel-generate-create アプリケーション名  モジュール名  モデル名
$ symfony propel-generate-create front testmember_add Member

#EDIT
$ symfony propel-generate-edit アプリケーション名  モジュール名  モデル名
$ symfony propel-generate-edit front  testmember_edit  Member

#LIST
$ symfony propel-generate-list アプリケーション名  モジュール名  モデル名
$ symfony propel-generate-list front  testmember_list  Member
listはsfpageflowは使っていないとのこと

・新規登録
$ symfony propel-generate-create front testmember_add Member
実行結果にエラーが出なければOK
・確認
http://www.bbs.com/testmember_add/flow
・sfPageFlowのアクションは必ずflow(inputではない)

・一覧表
symfony propel-generate-list front testmember_list Member
実行結果にエラーが出なければOK
・listは、自動生成したものに対して、作業がある。
アクションの関数をmodelに移動
http://www.bbs.com/testmember_list/index

・フロー制御(pageflow.yml)
firstState: ProcessInitialize
lastState:  DisplayResult
state:
  DisplayForm:
    transition:
      doInput:   ProcessValidate
  DisplayConfirm:
    transition:
      doConfirm: ProcessSubmit
      doCancel:  ProcessSetup
  DisplayResult:
  ProcessInitialize:
    transition:
      onSuccess: ProcessSetup
  ProcessValidate:
    entry:
      - acceptRequests:
        params:  [nickname, mailaddress, password, admin_yn, ]
    transition:
      onSuccess: DisplayConfirm
      onError:   DisplayForm
・命名規則
display はテンプレート、process はアクション
transition: 遷移
ProcessValidate:(バリデーション)
entry: 入力値(ここの書いているパラメータがバリデーションに渡る)
逆に記述されていないものは渡らない

・入力、確認、保存をする場合はプログラムを変更しなくていい。
・pageflow.ymlは、自分で追って復習して下さい。

・入力フォームを変更して、メッセージを日本語にする。
<th><span class="required"></span>nickname</th>
 ↓
<th><span class="required"></span>ニックネーム</th>

・入力フォームのパラメータに次の作業(transition:遷移)が指定されている。
DisplayForm.php
<?php echo input_hidden_tag('pageflow_event', 'doInput') ?>
pageflow.yml
  DisplayForm:
    transition:
      doInput:   ProcessValidate

・これまでの処理では、post/sessionでデータを渡していた。
ページフローでは、セッションのフローオブジェクト(flow object)に
パラメータがある。
・このため値の参照方法が今までと変わる。フロー制御では、以下の通り。
アクションでの記述
$this->flow->
テンプレートでの参照
$flow
・これまでの$this->nameでは値は渡らないので注意。
テンプレートに渡すとき
$this->flow->setData('msg', '入力画面です。') ;
アクションで受け取るとき
$member = $this->flow->getData('member');
テンプレートで受け取るとき
$flow->getData('msg')

・アクション、executeValidateでは、パラメータ受け取りの処理がない。
フローオブジェクトが自動的にセットされている。
(あえて言うまでもないかもしれないけど、executeSubmit()でも
パラメータの受け取り処理はない)

・DBのアクセス方法も変わる。(プログラムactions.class.php参照)
confirmで$memberを作成、セッションに持たせておく
resultで$memberを受け取り、保存

・バリデーションは、受け取るアクション.yml
validate.yml
fields:
  nickname:
    required:
      msg: ニックネームを入力してください。

・一覧から編集
$ symfony propel-generate-edit front testmember_edit Member

・画面が出来たら、メッセージを日本語に修正、編集を呼び出せるようにする。
<td><?php echo link_to("編集","testmember_edit/flow?id=".$item->getId());?></td>

・編集
$ symfony propel-generate-list front  testmember_list  Member

・編集完了後、完了画面でF5を押すとエラーになる。
完了でセッションは切れるので、セッション情報はない。
編集画面に必要なidがパラメータで取得できないためエラーになる。
・対応
       $member = MemberPeer::retrieveByPk($this->getRequestParameter('id'));
       if (!$member) {
           $this->redirect('testmember_list/index') ;
       }

・削除は、list処理に含まれているので呼び出す処理を追加。
<td><?php echo link_to("編集","testmember_edit/flow?id=".$item->getId());?> |
 <a onclick="return confirm('削除しますか?');" href="testmember_list/index?delete=on&id=<?php echo $item->getId();?>">削除</a>
</td>

・削除後、F5でエラーになる。URLにIDが残るため、if文を加える。
       if ($this->getRequestParameter('delete') == 'on') {
           $member = MemberPeer::retrieveByPk($this->getRequestParameter('id'));
           if ($member) {
               $member->delete();
           }
       }

・以上の機能を使えば、F5、戻るボタンなどを自分で組まないといけない
ところが自動で組み込まれる。
今後は、sfPageFlowで組んで下さい。

・残りの時間は、自主課題にsfPageFlowを組み込んで練習する。

<環境設定> 
(プロジェクト毎に必要なのは1,2,5、アプリケーションごとに必要なのは6)
(1)pluginの設置
/plugins/sfPageFlowPlugin
(2)自動生成タスクの設置
/data/tasks/myPakePropelEditGenerator.php,他2
(3)addonファイルの設置(共通)
(4)スケルトンファイルの設置(共通)
(5)MyUtilityHelper.phpの設置
(6)templates/_pager.phpの設置(入れ替え、アプリケーションごと、メールで送付されてます)
(共通)部分は、bbsで設定している(はず)なので、既に設定済みのもの

*  sfPageFlowのスケルトンをテンプレートにしている。
何か表示を加えたいときは、スケルトンファイルに加える。
興味のある人は中を見ておいて。

・今週の残りの時間は、自主課題に組み込み練習を積んで下さい。

0 件のコメント:

コメントを投稿