それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

symfonyで簡単なリレーションシップ

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:      ~

なんか、これだけ?めちゃ楽ちんなんだけど。動作原理がわからん・・・