symfonyとadmin toolsを使うとフォーム値選択のリストボックスが簡単に作れる。
ポイントは、XXXX_id というフィールド
PROJECT_HOME/conf/schema.yml でrelationshipを定義するには
たとえば、エントリにカテゴリを関連付けて、フォームにselectを表示させる
propel: entry: id: DBに従う content: DBに従う category_id: !!何も書かない。 postedat: DBに従う category: id: DBに従う name: DBに従う
XXXX_id と書いた後に、DBフィールド情報を書かないところがミソらしい。XXXXが関連付けるテーブル名になるようだ。でもってadmin generatorを使う。
symfony propel-build-model category symfony propel-build-model entry symfony propel-init-admin myblog entry
これで、でき上がり。この関連づけが簡単にできるだけで、とても楽ちんになる。DB_DATAOBJECTだとリレーションが結構面倒なのでコレは嬉しい。
symfonyのGeneratorのマニュアルでは
公式マニュアルでは、こんな風な例になっている
propel: blog_article: _attributes: { phpName: Article } id: title: varchar(255) content: longvarchar created_at: blog_comment: _attributes: { phpName: Comment } id: article_id: author: varchar(255) content: longvarchar created_at:
うん。 XXX_idの箇所に何も書いてない。
でも表示するとID&passが丸見えじゃん?
で、自動生成されるFORMタグを書き換えたい。
symfonyにはテンプレート用のタグが用意されている。でもadmin ではテンプレートが自動生成なのでgenerator.ymlから書き換えてやる
パスワードをマスクするフォームInput
#パスワードフィールドを作る場合 fields: password: { name:'パスワード', param: type='password'}
input タグ内へtypeの指定を書き出すので少々わかりにくく。
Boolタイプのフィールドはチェックボックスに
#チェックボックスを作る場合 fields: disabled: { name:'利用しない', type: checkbox_tag }
YAMLの書き方に慣れていないときに、 , カンマをよく書き忘れたので注意しないとダメだなぁ・・・
ID丸見えだよ〜〜
ID見えても余り意味がないので隠しておく、ただ、ID隠すと編集へのリンクが無くなる。なのでリンクを作ってやる
まず、YAMLを書き換える
#generator.yml fields: title_linked_to_id: { name: "エントリタイトル"} list: display:[ title_linked_to_id, author_name, posted_at ]
でもって、元になるオブジェクトを書き換える
#PROJECT_HOME/lib/model/Entry.php にこのメソッドを追加 public function getTitleLinkedToId(){ return link_to( $this->getTitle(), "entries/edit?id={$this->getPrimaryKey()}" ); }
ハマリどころ、テストしているversion 1.0.0rc2 では、 link_to の第二引数が
entries/edit?id={$this->getPrimaryKey()} ↓ http://PROJECT/myblog/entries/edit/id/1
とフルパスに書き換わってた。これは便利だ。でも想定外ww
これって、オブジェクト書き換えなくても、generator.ymlの書き換えで出来きそうだなぁ。試してみたい。
試してみた。すげーーーーー楽ちん
マニュアルによると
Listing 14-21 - Moving the Hyperlink for the edit View in the list View, in modules/comment/config/generator.yml
list:
display: [article_link, =content]
ということらしい。つまり、editリンクを動かしたいときは = を書けばok?
やってみた.
list: display:[ =title, author_name, =posted_at ]
おおおおおおおお、タイトルにも、日付にも両方にEditへのリンクが追加された。これは楽ちんだ。
一覧に削除、編集ボタンをつけたいな
だんだん、欲張りになってきた。テスト用エントリを削除するのにリンクをクリックして削除ボタンを押すのが面倒になってきた。マニュアルの例はボタンがついてるんだよね。これ欲しい。
list object_actions: _edit: ~ _delete: ~
なんか、これだけ?めちゃ楽ちんなんだけど。動作原理がわからん・・・