ウェブ、ショウジン

CakePHP 1.2でブログチュートリアル その4

2009-8-18
Category
PHP

データベースからデータを取り出して記事一覧、記事本文を表示できるようになった。つづいて、新規投稿が出来るようにしてみる。

記事の追加 – add()アクションを追加

コントローラ(PostsControllerメソッド)の中に新規投稿の機能を定義するadd()アクションを追加する。

app/controllers/posts_controller.php

<pre lang="PHP">
    // addアクション(新規投稿)
    function add() {
        // データがあれば
        if (!empty($this->data)) {
            // Postモデルを使ってデータを保存
            if ($this->Post->save($this->data)) {
                // 投稿したら「投稿完了!!」と表示し、この文字列に記事一覧ページへのリンクを張る
                $this->flash('投稿完了!!', '/posts');
            }
        }
    }

$this->flash()関数について

$this->flash()関数は、(flashレイアウトを使用して)ユーザに1秒間メッセージを表示(flash)してから、他のURL(この場合には/posts)にユーザを移動させる、コントローラのメソッドです。もし、DEBUGが0に設定されている場合、$this->flash()は自動的にリダイレクトします。しかし、DEBUG > 0の場合には、flashレイアウトが表示され、そのメッセージをクリックすることで、リダイレクトされる動作になります。

記事の追加 – ビューファイルの作成

まず、add()アクション用のビューファイルを作成する。

app/views/posts/add.ctp
FormHelperを使ってForm要素を出力している。

<h1>記事を投稿する</h1>
<?php
// 投稿フォーム
echo $form->create('Post');
echo $form->input('title');
echo $form->input('body', array('rows'=>'3', 'cols'=>'10'));
echo $form->end('投稿する');

これだけだとhttp://IPアドレス/cakeblog/posts/addに直接ブラウザでアクセスしないと記事が投稿できないので、cakeblogのトップページ(記事一覧表示ページ)の丈夫にも、同じ記述で新規記事投稿のフォームを表示させることにする。

app/views/posts/index.ctp
既存の記述の前に以下の記述を追加する。

<h1>記事を投稿する</h1>
<?php
// 投稿フォーム
echo $form->create('Post');
echo $form->input('title');
echo $form->input('body', array('rows'=>'3', 'cols'=>'10'));
echo $form->end('投稿する');?>

$form->input()メソッドは、同名のフォーム要素を作成するのに使われています。最初のパラメータは、どのフィールドに対応しているのかをCakePHPに教えます。2番目のパラメータは、様々なオプションの配列を指定することができます。— この例では、textareaの列の数を指定しています。ここには少しばかりの内観的な手法とオートマジックが使われています。input()は、指定されたモデルのフィールドに基づいて、異なるフォーム要素を出力します。

$form->end()の呼び出しで、submitボタンとフォームの最後が出力されます。 end()の最初のパラメータとして文字列が指定してある場合、FormHelperは、それに合わせてsubmitボタンに名前をつけ、終了フォームタグも出力します。ヘルパーの詳細に関しては、 “組み込みヘルパー“の章 を参照してください。

望むなら、 /app/views/posts/index.ctpのビューが、www.example.com/posts/addを指す、新しい “Add Post”というリンクを表示するように編集できます。

記事一覧ページをブラウザで開いてみる。

http://IPアドレス/cakeblog/posts

cakeblog_010

投稿された記事一覧の上に投稿フォームが追加された。これで、ここからも記事は投稿できるし、http://IPアドレス/cakeblog/posts/addからも投稿できる。

投稿データのバリデーションについて

バリデーション要件について、どうやってCakePHPに指示するのだろう、と思ったかもしれません。バリデーションのルールは、モデルの中で定義することができます。Postモデルを見直して、幾つか修正してみましょう。

Postモデルを開き、幾つか修正することで「どうデータをバリデートするのか?」を確認してみる。

app/models/post.php

<?php
class Post extends AppModel {
    var $name = 'Post';

    /* $validate配列を使ってsave()メソッドが呼ばれた時にどうバリデートするかを
    CakePHPに指示している。この場合、タイトルと本文の内容が空ではいけないと設定している。 */
    var $validate = array('title' => array('rule' => array('minLength', 1)),
                          'body' => array('rule' => array('minLength', 1)));
}
?>

この状態で、内容を空のまま「投稿する」をクリックすると、バリデーションに引っかかって、その旨エラーが表示される。

cakeblog_009

現状だとバリデーションによってユーザ側に示されるメッセージが英語なので、実際に国内向けサービスを作る場合にはこのへんの日本語化も必要となってくるんじゃないかな。(まだ調べてないけど)

Categories

Tag Cloud

AdMob Android Apache centos CodeIgniter EC-CUBE facebookアプリ facebookページ feed Firefox Flash google googleanalytics htaccess iPad iPhone JavaScript lamp mobile nginx ogp pear php plugin rollover rss sendmail setting smarty ssh Titanium Mobile Titanium Studio tutorial ubuntu vim VirtualBox vmware vps Windows WordPress xampp youtube さくらインターネット アクセス解析 カスタム投稿