3.アプリケーションの実装

ここから、掲示板アプリの実装を始めます。

このページでの目標

  1. 投稿を処理するモジュール・アクションを追加し、投稿フォームを作成する
  2. フォームから入力された値を検証する
  3. エラーの場合はエラーメッセージを表示する

モジュール・アクションを追加

早速モジュールアクションを追加しましょう。 bbs.yml を変更していない状態では、デフォルトの module/actionindex/index となるので、それを作成してみましょう。

envi init-module bbs index
envi init-action bbs index index success
envi init-view bbs index index default

このアクションは、

  • 投稿の内容を検証
  • 投稿をデータベースに保存
  • 入力ページ兼投稿内容一覧へリダイレクト
  • エラーが起こった場合は入力ページ兼投稿内容一覧にエラーを出力する

といった処理を行うため、テンプレートは一つでよく、viewもview_success一つで十分です。

フォームの作成

投稿にあたって、どのようなフォームが必要となるかを考えましょう。

  • 名前
  • メールアドレス
  • 内容

この3つを入力することにしましょう。

apps/bbs/modules/index/templates/index.tpl を開き、次のようにHTMLを記述してみます。

<!DOCTYPE html>
<html lang="Ja">
    <head>
        <meta charset="utf-8" />
        <title>BBS</title>
    </head>

<body>

<form action="/bbs.php" method="post">

名前:<input type="text" name="name" /><br />
Email:<input type="text" name="email" /><br />
<textarea name="comment_text"></textarea><br />
<br />
<input type="submit" name="commit" value="送信" />


</form>

</body>
</html>

また、

apps/bbs/modules/index/actions/indexAction.class.php を開き、 validate() に次のように記述してみます。


<?php

/**
 some else
*/
    
public function validate()
    {
        if (
$_SERVER['REQUEST_METHOD'] === 'GET') {
            return 
Envi::DEFAULT_ACCESS;
        }
        
$validator validator();
        
$validator->autoPrepare(array('name' => '名前'), 'noblank'falsefalsevalidator::METHOD_POST);
        
$validator->chain('name''maxwidth'false255);


        
$validator->autoPrepare(array('email' => 'Email'), 'mailsimple'falsefalsevalidator::METHOD_POST);
        
$validator->chain('email''maxwidth'false255);

        
$validator->autoPrepare(array('comment_text' => 'コメント'), 'noblank'falsefalsevalidator::METHOD_POST);
        
$validator->chain('comment_text''maxwidth'false1000);
        
$validate_result $validator->executeAll();
        if (
$validator->isError($validate_result)) {
            return 
false;
        }

        
// AttributerにValidate済みのデータをいれる
        
Request::setAttribute('name'$validate_result['name']);
        
Request::setAttribute('email'$validate_result['email']);
        
Request::setAttribute('comment_text'$validate_result['comment_text']);
    }
  • GETでリクエストされたら、defaultAccessを実行

  • 「名前」という名前のフォーム

    • formのnameは「name」
    • 必須項目
    • 半角255文字以内
  • 「Email」という名前のフォーム

    • formのnameは「email」
    • Emailフォーマットの文字列
    • 半角255文字以内
  • 「コメント」という名前のフォーム

    • formのnameは「comment」
    • 必須項目
    • 半角1000文字以内

という、入力フォームを定義しています。

この状態で、http://bbs.example.jp/bbs.phpにアクセスすると、簡単なフォームが表示されているはずです。

エラー時の処理

入力エラーが起こった場合、エラーの配列を、テンプレートに渡し、 使用するviewをEnvi::ERRORからEnvi::DEFAULT_ACCESSに変更する必要があります。

apps/bbs/modules/index/actions/indexAction.class.php を開き、 handleError() に次のように記述してみます。


<?php

/**
 some else
*/
    
public function handleError()
    {
        
Request::setAttribute('error'Request::getErrors());
        return 
Envi::DEFAULT_ACCESS;
    }

これで、フォームでエラーが起こった場合も、index.tplが使用されるようになりました。
エラーメッセージを画面に表示するために、下記のようにHTMLを修正してみましょう。

<!DOCTYPE html>
<html lang="Ja">
    <head>
        <meta charset="utf-8" />
        <title>BBS</title>
    </head>

<body>
<?php
if (isset($error)) {
    foreach ($error['message'] as $val) {
        echo htmlspecialchars($val, ENT_QUOTES , mb_internal_encoding());
    }
}
?>
<br />

<form action="/bbs.php" method="post">

名前:<input type="text" name="name" /><br />
Email:<input type="text" name="email" /><br />
<textarea name="comment"></textarea><br />
<br />
<input type="submit" name="commit" value="送信" />


</form>

</body>
</html>

例えば 、こうすると、何も入力せずに POST したとき、エラーが表示されます。

また、コメントを半角1000文字より多く入力して送信した場合「コメントは半角1000文字以下で入力してください。」と出力されます。

フォームの定義から検証・出力の流れがつかめましたか?

続いて、データベースに接続し、この投稿内容を保存できるようにしてみましょう。

4.データベースの接続