BLOG ENTRY

symfony1.1で掲示板のようなものを作るレシピ[PHP][symfony]

symfonysymfony1.1で掲示板のようなものを作るレシピ

状態

プロジェクト名:sampleproject
アプリケーション名:bbs
DocumentRoot:/var/www/sampleproject/web/

この状態までインストール&準備していることが前提。

Windows+XAMPPへのsymfonyインストールはこちら
Linux(CentOS5.2)へのsymfonyインストールはこちら

1.データべース作成

データベース名:sample
[shell]
# mysqladmin -u root –default-character-set=utf8 create sample
[/shell]

このDBのテーブルはsymfonyコマンドで作成するので作らない。

2.設定ファイル作成

以下の設定3ファイルを作成する。
databases.yml
propel.ini
schema.yml
[php]
# vi /var/www/sampleproject/config/databases.yml
all:
propel:
class: sfPropelDatabase
param:
dsn: mysql://root@localhost/sample
encoding: utf8
[/php]
[php]
# vi /var/www/sampleproject/config/propel.ini
propel.project = sampleproject
propel.database = mysql
propel.database.createUrl = mysql://root@localhost/
propel.database.url = mysql://root@localhost/sample
[/php]

[php]
# vi /var/www/sampleproject/config/schema.yml
propel:
bbs_sample:
_attributes: { phpName: bbsData}
id:
title: varchar(100)
username: varchar(50)
email: varchar(100)
comment: longvarchar
created_at:
updated_at:
[/php]

3.DBのテーブル作成

プロジェクトディレクトリ(/var/www/sampleproject)で以下を実行。
[shell]
# symfony propel:build-all
[/shell]
bbs_sampleテーブルが自動生成された。

※ちなみに上記コマンドは以下4コマンドを叩くのと同義。
[shell]
# symfony propel:build-model
# symfony propel:build-sql
# symfony propel:insert-sql
# symfony propel:build-forms
[/shell]

その他のsymfonyコマンドはこちら

4.CRUDコマンドの実行

プロジェクトディレクトリで以下を実行
[shell]
# symfony propel:generate-crud bbs bbsdata bbsData
[/shell]

以下の自動生成をやってくれる。

・モジュールbbsdataディレクトリの生成
・BBSに必要な基本的なファイルの生成

http://example.com/bbstdata
にアクセスすると、動く掲示板ができている・・・はず。

ここまででとりあえず完成。

※まだ入力フォームにバリデーションがないのと、
テンプレートにCSSを絡ませにくいので以下の編集を加える。

5.入力フォームにバリデーションを実装

・バリデーションについて
symfony1.0ではバリデーションはyamlで管理できたけど、symfony1.1ではsfFormクラスで行うようです。
(※compat_10をonにすれば使用可能)

記事一覧テンプレート(TOP) indexSuccess.php

※テンプレートの命名規則は【ページURL】+ Success.php
[php]
# vi /var/www/sampleproject/apps/bbs/modules/bbsdata/templates/indexSuccess.php
<h1>bbsdata Index</h1>
<table>
<thead>
<tr>
<th>Id</th>
<th>Title</th>
<th>Username</th>
<th>Email</th>
<th>Comment</th>
<th>Created at</th>
<th>Updated at</th>
</tr>
</thead>
<tbody>
<?php foreach ($bbs_dataList as $bbs_data): ?>
<tr>
<td><?php echo link_to($bbs_data->getId(), ‘bbsdata/show?id=’.$bbs_data->getId()) ?></td>
<td><?php echo link_to($bbs_data->getTitle(), ‘bbsdata/show?id=’.$bbs_data->getId()) ?></td>
<td><?php echo $bbs_data->getUsername() ?></td>
<td><?php echo $bbs_data->getEmail() ?></td>
<td><?php echo $bbs_data->getComment() ?></td>
<td><?php echo $bbs_data->getCreatedAt() ?></td>
<td><?php echo $bbs_data->getUpdatedAt() ?></td>
<td><?php echo link_to(‘Edit’, ‘bbsdata/edit?id=’.$bbs_data->getId()) ?></td>
<td><?php echo link_to(‘Delete’, ‘bbsdata/delete?id=’.$bbs_data->getId(),
array(‘class’ => ‘special_link’,
‘confirm’ => ‘本当に削除しますか?’,
‘absolute’ => true
)) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<a href="<?php echo url_for(‘bbsdata/create’) ?>">Create</a>

[/php]

新規登録、編集画面テンプレート editSuccess.php

[php]
# vi /var/www/sampleproject/apps/bbs/modules/bbsdata/templates/editSuccess.php
<h1><?php echo $bbs_data->isNew() ? ‘New’ : ‘Edit’ ?> bbsdata</h1>
<form action="<?php echo url_for(‘bbsdata/update’.(!$bbs_data->isNew() ? ‘?id=’.$bbs_data->getId() : ”)) ?>" method="post" <?php $form->isMultipart() and print ‘enctype="multipart/form-data" ‘ ?>>
<table>
<tfoot>
<tr>
<td colspan="2">
<a href="<?php echo url_for(‘bbsdata/index’) ?>">Cancel</a>
<?php if (!$bbs_data->isNew()): ?>
<?php echo link_to(‘Delete’, ‘bbsdata/delete?id=’.$bbs_data->getId(), array(‘post’ => true, ‘confirm’ => ‘Are you sure?’)) ?>
<?php endif; ?>
<input type="submit" value="Save" />
</td>
</tr>
<tr>
<td>
<?php echo link_to(‘Indexページへ’, ‘bbsdata/index’); ?>
</td>
</tr>
</tfoot>
<tbody>
<?php echo $form->renderGlobalErrors() ?>
<tr>
<th><label for="bbs_data_title">Title</label></th>
<td>
<?php echo $form[‘title’]->renderError() ?>
<?php echo $form[‘title’] ?>
</td>
</tr>
<tr>
<th><label for="bbs_data_username">Username</label></th>
<td>
<?php echo $form[‘username’]->renderError() ?>
<?php echo $form[‘username’] ?>
</td>
</tr>
<tr>
<th><label for="bbs_data_email">Email</label></th>
<td>
<?php echo $form[‘email’]->renderError() ?>
<?php echo $form[‘email’] ?>
</td>
</tr>
<tr>
<th><label for="bbs_data_comment">Comment</label></th>
<td>
<?php echo $form[‘comment’]->renderError() ?>
<?php echo $form[‘comment’] ?>
</td>
</tr>
<tr>
<th><label for="bbs_data_created_at">Created at</label></th>
<td>
<?php echo $form[‘created_at’]->renderError() ?>
<?php echo $form[‘created_at’] ?>
</td>
</tr>
<tr>
<th><label for="bbs_data_updated_at">Updated at</label></th>
<td>
<?php echo $form[‘updated_at’]->renderError() ?>
<?php echo $form[‘updated_at’] ?>

<?php echo $form[‘id’] ?>
</td>
</tr>
</tbody>
</table>
</form>

[/php]

記事詳細テンプレート showSuccess.php

[php]
#vi /var/www/sampleproject/apps/bbs/modules/bbsdata/templates/showSuccess.php
<h1>detail Content</h1>
<table>
<tbody>
<tr>
<th>Id:</th>
<td><?php echo $bbs_data->getId() ?></td>
</tr>
<tr>
<th>Title:</th>
<td><?php echo $bbs_data->getTitle() ?></td>
</tr>
<tr>
<th>name:</th>
<td><?php echo $bbs_data->getUsername() ?></td>
</tr>
<tr>
<th>Email:</th>
<td><?php echo $bbs_data->getEmail() ?></td>
</tr>
<tr>
<th>Content:</th>
<td><?php echo $bbs_data->getComment() ?></td>
</tr>
<tr>
<th>Date:</th>
<td><?php echo $bbs_data->getCreatedAt() ?></td>
</tr>
<tr>
<th>Update Date:</th>
<td><?php echo $bbs_data->getUpdatedAt() ?></td>
</tr>
</tbody>
</table>
<p><?php echo link_to(‘Edit’, ‘bbsdata/edit?id=’.$bbs_data->getId()) ?></p>
<p><?php echo link_to(‘Indexページへ’, ‘bbsdata/index’) ?></p>

[/php]

Actionクラス actions.class.php

[php]
# vi /var/www/sampleproject/apps/bbs/modules/bbsdata/actions/actions.class.php
<?php
class bbsdataActions extends sfActions
{
public function executeIndex()
{
$this->bbs_dataList = bbsDataPeer::doSelect(new Criteria());
}

public function executeShow($request)
{
$this->bbs_data = bbsDataPeer::retrieveByPk($request->getParameter(‘id’));
}

public function executeCreate()
{
$this->form = new bbsDataForm();
$this->setTemplate(‘edit’);
}

public function executeEdit($request)
{
$this->form = new bbsDataForm(bbsDataPeer::retrieveByPk($request->getParameter(‘id’)));
}

public function executeUpdate($request)
{
$this->forward404Unless($request->isMethod(‘post’));
$this->form = new bbsDataForm(bbsDataPeer::retrieveByPk($request->getParameter(‘id’)));
$this->form->bind($request->getParameter(‘bbs_data’));
if ($this->form->isValid()) {
$bbs_data = $this->form->save();
$this->redirect(‘bbsdata/edit?id=’.$bbs_data->getId());
}
$this->setTemplate(‘edit’);
}

public function executeDelete($request)
{
$this->forward404Unless($bbs_data = bbsDataPeer::retrieveByPk($request->getParameter(‘id’)));
$bbs_data->delete();
$this->redirect(‘bbsdata/index’);
}

public function handleErrorUpdate()
{
if (!$this->getRequestParameter(‘id’)) {
return $this->forward(‘bbsdata’, ‘create’);
} else {
return $this->forward(‘bbsdata’, ‘edit’);
}
}
}
[/php]
※ちなみにActionクラスのそれぞれのfunctionは、例えば以下のような形でページ別にファイルを分けることができる。
[php]
<?php
class indexAction extends sfActions //単数系 + Action
{
public function executeIndex()
{
}
}
[/php]

Validationクラス bbsDataForm.class.php

[php]
# vi /var/www/sampleproject/lib/form/bbsDataForm.class.php
<?php
class bbsDataForm extends BasebbsDataForm
{
public function configure()
{
$this->setValidators(array(
‘username’ => new sfValidatorString(array(), array(‘required’ => ‘名前を入力してください’)),
‘email’ => new sfValidatorEmail(array(), array(‘invalid’ => ‘Eメールアドレスは無効です。’)),
‘title’ => new sfValidatorString(array(), array(‘required’ => ‘タイトルを入力してください。’)),
‘comment’ => new sfValidatorString(array(‘min_length’ => 4), array(
‘required’ => ‘コメントを入力してください。’,
‘min_length’ => ‘"%value%" のメッセージは短すぎます。少なくとも %min_length% の文字でなければなりません。’,
)),
));
$this->validatorSchema->setOption(‘allow_extra_fields’, true);
$this->validatorSchema->setOption(‘filter_extra_fields’, false);
}
}

[/php]

Validation設定ファイル(1.0用)

※symfony1.1で使用する際は
apps/bbs/config/settings.yml
のcompat_10のコメントをはずしてonにする。
[shell]
# vi /var/www/sampleproject/apps/bbs/modules/bbsdata/validate/update.yml
fields:
title:
required:
msg: "タイトルを入力してください。"
sfStringValidator:
min: 2
min_error: "タイトルが短すぎます。22文字以上で入力してください。"
max: 50
max_error: "タイトルが長すぎます。50文字以上で入力してください。"
email:
sfStringValidator:
max: 100:
max_error: "メールアドレスが長すぎます。100文字以内にしてください。"
sfEmailValidator:
email_error: "正しいメールアドレスを入力してください"
username:
required:
msg: "名前を入力してください"
sfStringValidator:
min: 3
min_error: "名前が短すぎます。3文字以上で入力してください。"
max: 30
maxerror: "名前が長すぎます。30文字以内で入力してください"
comment:
required:
msg: "本文を入力してください。"
sfStirongValidator:
max: 500
max_errror: "本文は500文字以内で入力してください"

[/shell]
で、ここまで気になった点をいくつかメモしておく。

命名規則まとめ

テンプレ名⇒
★★★ + Success.php

ページURL⇒
URL/モジュール名/★★★

アクションメソッド名⇒
function execute★★★

※上記の★★★はすべて共通名

さらにexecuteの部分がhandleErrorなど、
処理内容によって変わる。
executeIndex
handleErrorIndex
など。

アクションクラスはページ(テンプレ)別に分けられる
⇒その場合はクラス名を★★★(単数形) + Action

O/Rマッパちょこっとまとめ

DBからのselectは⇒
bbsDataPeerクラスを静的に利用。

複数取得する場合は⇒
doSelect(条件)

一件取得する場合は⇒
retrieveByPk(‘プライマリーキー’)
でプロパティに代入する。

updateとinsertは⇒
->save()という風にsaveメソッドを使う。

deleteは⇒
$bbs_data->delete()という風にdeleteメソッドを使う。

データの受け取り

DBからselectして$bbs_dataにいれた値を
$bbs_data->get★★★();
で受け取れる。(★★★はテーブル名)

テンプレ利用

$this->setTemplate(‘edit’);
これでeditSuccess.phpのテンプレが利用できる。

その他関連記事orリンク

  • name:symfony1.1.1をLinux(CentOS5.2)にインストールする[PHP][symfony] | Web&MUSICブログ QUALL
  • date:2008/09/27
  • […] BLOG ENTRY previous […]

  • type:ピンバック [ ]

  • name:symfonyのO/RマッパでDBからSELECTするときの検索条件[PHP][SYMFONY] | Web&MUSICブログ QUALL
  • date:2008/09/27
  • […] symfony1.1で掲示板のようなものを作るレシピ[PHP][symfony] […]

  • type:ピンバック [ ]

  • name:symfonyとxamppでhelloworldを表示する[PHP] | Web&MUSICブログ QUALL
  • date:2008/10/13
  • […] symfony1.1で掲示板のようなものを作るレシピ[PHP][symfony] […]

  • type:ピンバック [ ]

  • name:symfony1.1.1をwindowsのxamppにインストールする[PHP][symfony] | Web&MUSICブログ QUALL
  • date:2008/10/13
  • […] symfony1.1で掲示板のようなものを作るレシピ[PHP][symfony] […]

  • type:ピンバック [ ]

  • name:hwang
  • date:2008/11/10
  • お疲れ様です。
    黄と申します。

    早速ですが、データを入力し、セーブしようとしたら
    500エラーが出てきます。
    どうしたらいいでしょうか。ご返事お願いいたします。

    以上です。

  • type:コメント [ ]

  • name:Vince Delmonte
  • date:2009/04/15
  • I read your posts for a long time and must tell you that your posts are always valuable to readers.

  • type:コメント [ ]

  • name:Antadiact
  • date:2009/05/08
  • downloads mp3 musics mp3 music downloads free tima reece mp3 eros ramazzotti free download album greatest hits el mar no cesa mp3 download download the best of jamiroquai download reichsmusikkammer free

  • type:コメント [ ]

  • name:symfony1.1.1をwindowsのxamppにインストールする[PHP][symfony] | Web&MUSICブログ QUALL
  • date:2009/09/01
  • […] symfony1.1で掲示板のようなものを作るレシピ[PHP][symfony] […]

  • type:ピンバック [ ]

  • name:symfonyのO/RマッパでDBからSELECTするときの検索条件[PHP][SYMFONY] | Web&MUSICブログ QUALL
  • date:2009/09/01
  • […] name:symfony1.1で掲示板のようなものを作るレシピ[PHP][symfony] | Web&MUSICブログ QUALL […]

  • type:ピンバック [ ]

    WRITE COMMENT


    (required)


    (required)


    (required)

    MENU

    veltica creative of twitter