2010年8月30日月曜日

Zend Frameworkで掲示板を作ってみる

今回はZend FrameworkとSmartyを活用し掲示板のサンプルを作成してみます。
ただし、細かい部分までは解説しきれないので要点を絞って説明します。
また、デザインやエラーチェックは考慮しないものとします。


使用する環境は以下となります。
Windows XP
WAMP Server 2.0(PHP 5.3, MySQL 5.1)
ZendFramework 1.10.6
Smarty 2.6.26

作成したソースコードはこちらからダウンロードできます。

***フレームワークの設定***

まず、ZendFrameworkとSmartyをダウンロードし展開します。
コマンドプロンプトを開き、ZendFrameworkのbinフォルダにパスを通します。

>set path=C:\wamp\bin\php\php5.3.0;c:\ZendFramework-1.10.6-minimal\bin;%path%

ZendFrameworkのzf.cmdを実行しプロジェクトを作成します。
ここではプロジェクト名をzbbsとします。

>zf create project zbbs

zbbsフォルダの中にapplicationやpublicといったフォルダが作成されれば成功です。

ライブラリのパスを設定します。
php.iniを修正する方法もありますが、手っ取り早くpublic\index.phpを修正することにします。

set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
realpath(APPLICATION_PATH . '/../../library'), //<<この行を追加します。
get_include_path(),
)));

あとはzbbsと同じ階層にlibraryのフォルダを作成し、ZendFrameworkとSmartyのライブラリをコピーします。
フォルダ構成は以下のようになります。

www/
 zbbs/
  application/
  library/
  public/
   index.php
 library/
  Zend/
  Smarty/

application\configs\application.iniに文字エンコードの設定を追加します。
phpSettings.mbstring.http_output = "UTF-8"

zbbsフォルダ直下にindex.phpと.htaccessファイルを作成します。

index.phpファイルではpublicフォルダのindex.phpを読み込むようにします。
require_once dirname(__FILE__) . "/public/index.php";

.htaccessファイルでは以下の設定を行います。

ZendFrameworkの開発用の設定を有効にします。(本番環境ではこの設定を削除します。)
SetEnv APPLICATION_ENV "development"

サーバの基準となるURLを設定します。
今回はhttp://localhost/zbbs/でアクセスできる位置に配置するため、RewriteBaseを/zbbsに設定します。
他の場所に置く場合はそのURLに合わせてRewriteBaseを変更します。
RewriteEngine on
RewriteBase /zbbs

全てのリクエストをindex.phpに受け渡すように設定します。
RewriteRule .* index.php


ログの保存やSmartyのため、tempフォルダを作成します。
(Linuxの場合は書き込み権限を与えます)

ここまで設定が終わったらWAMPの設定でApacheのエイリアスを追加し、ブラウザでアクセスします。
http://localhost/zbbs/

青い背景のZendFrameworkの画面が表示されれば成功です。


***コントローラーと画面の作成***

再びコマンドラインを開き、zbbsフォルダの中に移動します。
zf.cmdで、今度はコントローラ・アクション・ビューを作成します。
(ざっくり説明するとコントローラは画面の制御処理、アクションはコントローラ中の画面ごとの処理、ビューが画面に当たります)

まずはコントローラを作成します。
>zf create controller edit

application\controllers\EditController.phpが作成されれば成功です。
コントローラを作成すると、デフォルトのアクションとビューが作成されます。
アクションはEditController.phpの中にあるindexAction関数です。
ビューはapplication\views\scripts\edit\index.phtmlファイルです。

application\views\scripts\edit\index.phtmlファイルを以下のように修正します。
<form method="post" action="{$SMARTY_BASE_URL}/edit/confirm">
<table>
<tr>
<th>タイトル</th>
<td><input type="text" name="topic_title" style="width: 20em" value="{$topic_title}"/></td>
</tr>
<tr>
<th>内容</th>
<td><textarea cols="40" rows="10" name="topic_note"/>{$topic_note}</textarea></td>
</tr>
<tr>
<td align="right" colspan="2"><input type="submit" name="post" value="確認"/></td>
</tr>
</table>
</form>

以下のURLにアクセスして画面が表示されるか確認してください。index.phtmlを修正してリロードすれば表示が変わるはずです。
http://localhost/zbbs/edit


このままでも開発は可能ですが、画面のテンプレート機能がないと開発効率が悪いのでSmartyを組み込みます。
Smartyの組み込みの詳細は前回説明したので省略します。
libraryフォルダにZbbs/ViewSmarty.phpファイルを保存します。
また、Bootstrap.phpを修正します。

$view = new Zbbs_ViewSmarty(APPLICATION_PATH . '/views/scripts',
array('compile_dir' => $smartyTempPath)
);


$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
$viewRenderer->setView($view);

再度以下のURLにアクセスして画面が表示されるか確認してください。
http://localhost/zbbs/edit


続けてアクションを作成します。
コマンドプロンプトで以下のコマンドを実行します。
>zf create action confirm edit

最後の引数(edit)がコントローラの名前で、その前の引数(confirm)がアクションの名前です。
アクションを作成するとそれに対応したビューも作成されます。
EditController.phpにconfirmAction関数が追加されていること、
また、application\views\scripts\edit\confirm.phtmlファイルが作成されていることを確認してください。

同様に、regist、resultの2つのアクションを作成します。
アクションには以下のようなURLでアクセスできます。
http://localhost/zbbs/edit/confirm
http://localhost/zbbs/edit/result

URLは/zbbs/(コントローラー名)/(アクション名)のようになります。
省略するとindexがデフォルトとなるため、/zbbsは/zbbs/index/indexと同じ画面が表示されます。


***データベースへの保存、検索***

あらかじめ掲示板用のデータベースを構築します。
WAMPのphpMyAdminでzbbsデータベースとユーザーを作成してください。

topic_itemテーブルを作成します。
CREATE TABLE IF NOT EXISTS `topic_item` (
`topic_id` int(11) NOT NULL,
`topic_title` varchar(100) NOT NULL,
`topic_note` varchar(1000) DEFAULT NULL,
PRIMARY KEY (`topic_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;



データベースにアクセスするためapplication.iniに以下の設定を追加します。

database.adapter="PDO_MYSQL"
database.params.host="localhost"
database.params.dbname="zbbs"
database.params.username="zbbs"
database.params.password="zbbs"

Bootstrap.phpに以下の処理を追加します。
設定ファイルからデータベースへの接続クラスを作成し、Zend_Registryに格納します。
(Zend_RegistryはZendFramework用のグローバル変数といったもので、どのスクリプトからも格納してあるオブジェクトを取得できます。)

$config = new Zend_Config($this->getOptions());
Zend_Registry::set("config", $config);


$database = Zend_Db::factory($config->database);
Zend_Registry::set("database", $database);

データベースへ保存する処理をregistAction関数に記述します。
今回はエラー処理を無視して必要最低限のコードを記述します。

//データベースへの接続を取得します。
$database = Zend_Registry::get("database");

//次のIDを取得します。
$rows = $database->query('SELECT MAX(topic_id) + 1 next_id FROM topic_item')->fetchAll();
$topic_id = $rows[0]['next_id'];
if($topic_id === null)
{
$topic_id = 1;
}

//データベースに保存する値を設定します。
$dataset = array(
'topic_id' => $topic_id,
'topic_title' => $this->_getParam("topic_title"),
'topic_note' => $this->_getParam("topic_note"),
);

//Insertを実行します。SQL文はZendFrameworkが自動生成します。
$database->insert('topic_item', $dataset);

//最後にtopic_idを設定してからresult画面を表示します。
$this->_setParam('topic_id', $topic_id);
$this->_forward('result');


保存した内容をデータベースから取得する処理をresultAction関数に記述します。

//topic_idを取得します。
$topic_id = (int)$this->_getParam("topic_id");
//データを検索します。
$rows = $database->query('SELECT * FROM topic_item WHERE topic_id = ' . $topic_id)->fetchAll();
//ビューにデータを設定します。
$this->view->assign($rows[0]);


http://localhost/zbbs/editから入力を行い、topic_itemテーブルへ保存ができれば成功です。



最後に、データベースに保存した内容をトップ画面に表示するようにします。

//データを全件取得し、ビューに渡します。
$rows = $database->query('SELECT * FROM topic_item ORDER BY topic_id DESC')->fetchAll();
$this->view->assign("rows", $rows);


application\views\scripts\index\index.phtmlを以下のように修正します。
{foreach}タグについてはSmartyのドキュメントを参考にしてください。
<form>
<table border="0" cellspacing="0" width="400">
{foreach from=$rows|smarty:nodefaults item=item name=loop}
<tr>
<th align="left" width="400">
{$item.topic_title}
</th>
</tr>
<tr>
<td>
<textarea cols="40" style="border-style: dotted; border-color: silver;" readonly="1" rows="3" name="topic_note"/>{$item.topic_note}</textarea>
</td>
</tr>
{/foreach}
</table>
</form>

以上で、簡単ではありますが投稿と一覧表示を行う簡易掲示板が完成です。


作成したソースコードはこちらからダウンロードできます。

1 件のコメント:

  1. 色々エラーが出て解消しながら動かそうとしてるんですが、
    「Unable to load template file 'error/error.phtml'」
    と言うエラーが解決できません。

    Smartyを/var/libにインストールしているのが
    影響していると睨んでいるのですが・・・

    あとこの掲示板プログラムのライセンスって
    どうなってるんでしょう?
    自由に商用利用とかも可能なんでしょうか?

    返信削除