* symfonyの簡単なまとめ [#i6b39216]

** インストール [#jddf979f]
 pear channel-discover pear.symfony-project.com
 pear install symfony/symfony-1.2.10

** プロジェクト(アプリケーション・モジュール)の作成 [#ic582aef]
*** プロジェクトの作成 [#t288842f]
myprojectプロジェクトを作成する。
 mkdir myproject
 cd myproject/
 symfony generate:project myproject
 chmod 777 cache/ log/
以後、すべてのコマンドはmyprojectディレクトリ直下で行う。

*** アプリケーションの作成 [#re3390c4]
myprojectにfrontendアプリケーションを作成する。
 symfony generate:app frontend

*** モジュールの作成 [#e241f351]
myprojectのfrontendにcontentモジュールを作成する。
 symfony generate:module frontend content

** アクションの作成 [#b9370f0f]
showアクションを作成。URLは http://localhost/frontend_dev.php/content/show になる。

- actions/actions.class.php
 <?php
 class contentActions extends sfActions
 {
   public function executeShow()
   {
      $this->mesg = 'SHOW!';
   }
 }
- content/templates/showSuccess.php
 <html>
 <body>
 <?php if ($mesg): ?>
 [<?php echo $mesg ?>]
 <?php endif; ?>
 </body>
 </html>

*** アクションからテンプレートに値を渡す [#o5502374]
- アクション
 public function executeIndex()
 {
   $this->setVar('foo', 'bar');
   $this->foo = 'bar';
 }
- テンプレート
 <html><body>
 <?php echo $foo ?> <?php echo $bar ?>
 </body></html>

*** アクションでテンプレートを指定する [#e7169d8b]
 public function executeIndex()
 {
   $this->setTemplate('foo');
 }
apps/frontend/modules/XXX/templates/fooSuccess.php が呼ばれる。

** ページのレイアウト [#vffd1fbc]
sampleモジュールのindexアクションのページを考えると、デフォルトの構成では、以下のように2つのファイルを使い、レイアウトに<html>タグや<head>タグを記述し、テンプレートには<body>内を記述する。
:レイアウトファイル|apps/frontend/templates/layout.php
:テンプレートファイル|apps/frontend/modules/sample/templates/indexSuccess.php

*** 任意のレイアウトを指定する [#je43e40e]
- apps/frontend/templates/my_layout.php
- /apps/frontend/modules/sample/config/view.yml:
 all:
   has_layout: on
 indexSuccess:
   layout:     my_layout

** テンプレートからテンプレートを呼び出す [#hfdd63e8]
*** 部分テンプレート [#e8e09f07]
以下のようにテンプレートに記述する。
 <?php include_partial('mypartial1') ?>        # frontend/modules/mymodule/templates/_mypartial1.phpが呼び出される
 <?php include_partial('foobar/mypartial2') ?> # frontend/modules/foobar/templates/_mypartial2.phpが呼び出される
部分テンプレート内で変数を参照するには、呼び出す際に以下のようにすると、mytotal変数に参照出来る。
 <?php include_partial('mypartial', array('mytotal' => $total)) ?>
*** コンポーネント [#y27476cb]
TODO

** データベース接続情報ファイルを作成 [#c4670972]
 symfony configure:database "mysql:host=localhost;dbname=mydb" db_user db_passwd
以下のファイルが出来る。
- config/databases.yml
- config/propel.ini

** データベースからスキーマファイルを作成 [#w3c54a82]
propel.iniを使ってデータベースにアクセスし、全テーブルの情報をYAMLファイルに落とし込む。
 symfony propel:build-schema
config/schema.yml が出来る。

** スキーマファイルからデータモデルクラスを作成 [#h21024e7]
データベースのテーブルを基にしたデータモデルクラス(テーブルクラス)を作成する。
 symfony propel:build-model

*** データモデルクラス [#kd76815d]
- lib/model/XXX.php
- ロジックを記述し、実際に編集する。

*** 基底データモデルクラス [#nd5c27a4]
- lib/model/om/XXX.php
- symfonyシステムファイルで通常編集しない。

*** オブジェクトクラス [#s1c6ed9e]
- lib/model/TableA.php
- lib/model/om/BaseTableA.php
- テーブルのレコードそのものを表すクラス。
 $tblA = new TableA();
 $myname = $tblA->getMyName();

*** ピアクラス [#xcdb5ac4]
- lib/model/TableAPeer.php
- lib/model/om/BaseTableAPeer.php
- テーブルのレコードを操作(取得)するクラス。
 $tblA_list = TableAPeer::retrieveByPks(array(1,2,3));

** データベースを変更したら(テーブル追加など) [#u45a7dac]
以下の通りにコマンドを再実行する。
 symfony propel:build-schema
 symfony propel:build-model
 symfony propel:build-sql

** CRUD [#y7363eab]
TODO

** URL・ルーティング [#z36da454]
 // 内部のURI構文
 <module>/<action>[?param1=value1][&param2=value2][&param3=value3]...
 // 内部URIの例で、エンドユーザーに決して表示されない
 article/permalink?year=2006&subject=finance&title=activity-breakdown
 // 外部URLの例で、エンドユーザーに表示される
 http://www.example.com/articles/finance/2006/activity-breakdown.html

- routing.yml
 article_by_title:
   url:    articles/:subject/:year/:title.html
   param:  { module: article, action: permalink }

- url_for()ヘルパーは内部URIを外部URLに変換する
 <a href="<?php echo url_for('article/permalink?subject=finance&year=2006&title=activity-breakdown') ?>">
   ここをクリック</a>
 // ヘルパーはURIがarticle_by_titleルールにマッチすることを見る
 // ルーティングシステムはそれから外部URLを作成する
 => <a href="http://www.example.com/articles/finance/2006/activity-breakdown.html">ここをクリック</a>
- link_to()ヘルパーは直接ハイパーリンクを出力し、PHPとHTMLを混在させることを回避する
 <?php echo link_to(
   'ここをクリック',
   'article/permalink?subject=finance&year=2006&title=activity-breakdown') ?>
 ) ?>
- 内部では、link_to()はurl_for()を呼び出すので結果はつぎのものと同じ
 => <a href="http://www.example.com/articles/finance/2006/activity-breakdown.html">ここをクリック</a>

*** FORMタグ例 [#gad40b34]
 <html><body>
 <form action="<?php echo url_for('author/edit'.(!$author->isNew() ? '?id='.$author->getId() : '')) ?>" 
   method="post" <?php $form->isMultipart() and print 'enctype="multipart/form-data" ' ?>>
 <input type="submit" value="Save" />
 </form>
 </body></html>

*** Aタグ例 [#o1a6695c]
 <html><body>
 <?php echo link_to('Delete', 'author/delete?id='.$author->getId(), 
   array('post' => true, 'confirm' => 'Are you sure?')) ?>
 </body></html>

** フォームヘルパー [#pfd3d088]
*** フォームタグ [#e3141512]
 <?php echo form_tag('test/save') ?>
   => <form method="post" action="/path/to/save">
 <?php echo form_tag('test/save', 'method=get multipart=true class=simpleForm') ?>
   => <form method="get" enctype="multipart/form-data" class="simpleForm"action="/path/to/save">
閉じタグは</form>自分で。

** propelフォーム [#p4c9e5de]
 symfony propel:build-forms

** デバッグ [#j8a22615]
*** ログ [#qd78083e]
 public function executeIndex(sfWebRequest $request)
 {
    $this->logMessage('ログです');
    $this->logMessage('エラーです','err');
 }

 <html><?php use_helper('Debug') ?>
 <?php log_message('エラーです', 'err') ?></html>


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS