それマグで!

知識はカップより、マグでゆっくり頂きます。 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:      ~

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

symfonyで秒殺

symfonyのアプリケーションは project --> app --> module の階層構造になっていて、
http ://PROJECT_WEB/APP_NAME/MODULE/[引数]
でアクセスできる。

とりあえず、Projectを作る

cd WEB_HOME
mkdir sandbox
cd sandbox
symfony init-project sandbox

DBを使うので、DBの設定を書き足す

vim ./conf/propel.ini
############
propel.database.url        = mysql://localhost/sandbox <<PEARのDSN形式

symfonyにはAccessのようなフォームビルダーがオマケでついてくる。


秒殺でフォームを作る

DBにテーブルがない場合。

phpMyAdminでDBにテーブルを作るのは、いつものことだけど、それsymfonyがやってくれる。

vim ./config/schema.yml
###################YAML形式
--
  propel:
    $テーブル名:
      _attributes: { phpName: $クラス名 }
      id:
      $カラムA:   varchar(255)
      $カラムA:   longvarchar

#################
symfony propel-build-sql
symfony propel-insert-sql

DBにテーブルが出来たら

symfony propel-build-model

これでPROPELのORマッピングを作ってくれる。

フォームの自動生成

symfonyには prople admin ツールがついてくるので楽だった

symfony init-app backend
symfony propel-init-admin backend $テーブル名 $テーブル名に対応するCLASS
cp -R PEAR_HOME/data/symfony/web/sf   PROJECT_HOME/web/

これで ./backend_dev.php/$テーブル にアクセスすればOKだった。

初回起動は、symfonyがappをコンパイル(実行形式)するので時間がかかる。2回目以降はキャッシュへのアクセスになるので早くなる。データがおかしいときは、キャッシュが悪さしているかもしれないのでキャッシュを削除

symfony cc

HOGE_dev.php は開発用

デバッグ情報や、エラー情報が閲覧できるし、実行時間を自動計測してくれる。この辺がメッチャ便利。
symfonyがどの順にクラスを実行したかなどはsymfonyの動作原理を知るためにも目を通しておくと便利だった。

たまらなく嬉しいのがSQLのこと。実行したSQLデバッグで表示され、SQL実行時間がSQL文単位で計測されているのが嬉しい。

実行時間が、スクリプト毎に計測されるのも嬉しい。