ウェブ、ショウジン

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

2009-8-18
Category
PHP

次に、投稿記事を削除できるようにする機能を実装する。

投稿記事の削除

コントローラ(PostsController)にあらたにdelete()アクションを追加する。

    // deleteアクション(記事の削除)
    function delete($id) {
        $this->Post->del($id);
        $this->flash('ご指定の記事「'.$id.'」は削除されました。', '/posts');
    }

このロジックは$idで指定された記事を削除してから、flash()関数を使ってユーザに削除完了メッセージを表示し、/posts(記事一覧ページ)にリダイレクトする。

ロジックを実行したらリダイレクトするのでこのアクションにはそれ用のビューはない。

なので、削除を実行できるようにindexビュー(記事一覧ページ用ビュー)に削除のリンクをつけて実行可能にする。

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('投稿する');
?>

<h2>投稿記事一覧</h2>
<table>
    <tr>
        <th>Id</th>
        <th>Title</th>
        <th>Delete</th>
        <th>Created</th>
    </tr>
    <?php foreach ($posts as $post): ?>
    <tr>
        <td><?php echo $post['Post']['id']; ?></td>
        <td>
            <?php echo $html->link($post['Post']['title'], "/posts/view/".$post['Post']['id']); ?>
        </td>

        <td>
            <!-- 記事削除リンク -->
            <?php echo $html->link('Delete', "/posts/delete/{$post['Post']['id']}", null, '本当に削除してよろしいですか?') ?>
        </td>
        <td><?php echo $post['Post']['created']; ?></td>
    </tr>
    <?php endforeach; ?>
</table>

この記述では、HtmlHelperを使って削除前にJavaScriptによる確認ダイアログが出るようにしている。

投稿記事の編集

投稿記事の編集機能を実装する。

コントローラ(PostsController)にあらたにedit()アクションを追加。

app/controllers/posts_controller.php

    // editアクション(記事の編集)
    function edit($id = null) {
        $this->Post->id = $id;
        if (empty($this->data)) {
            // 何も送信されていなければ投稿記事を見つけてビューに渡す
            $this->data = $this->Post->read();
        } else {
        // データが送信されているならPostモデルを使ってデータを保存
            if ($this->Post->save($this->data['Post'])) {
                // 編集完了したら文言&記事一覧へのリンクを出す
                $this->flash('投稿内容の編集完了', '/posts');
            }
        }
    }

そして、edit()アクション用のビューを新規作成する。

app/views/posts/edit.ctp
FormHelperを利用してForm要素を出力する。

<h1>記事の編集</h1>
<?php
echo $form->create('Post', array('action' => 'edit'));
echo $form->input('title');
echo $form->input('body', array('rows' => '3'));
echo $form->input('id', array('type' => 'hidden'));
echo $form->end('保存する');

そして、indexビュー(記事一覧ページ)に編集リンクを追加する。

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('投稿する');
?>

<h2>投稿記事一覧</h2>
<table>
    <tr>
        <th>Id</th>
        <th>タイトル</th>
        <th>編集 / 削除</th>
        <th>投稿日時</th>
    </tr>
    <?php foreach ($posts as $post): ?>
    <tr>
        <td><?php echo $post['Post']['id']; ?></td>
        <td>
            <?php echo $html->link($post['Post']['title'], "/posts/view/".$post['Post']['id']); ?>
        </td>

        <td>
            <!-- 編集リンク -->
            <?php echo $html->link('編集', '/posts/edit/' . $post['Post']['id']); ?>

            <?php echo $html->link('削除', "/posts/delete/{$post['Post']['id']}", null, '本当に削除してよろしいですか>?') ?>
        </td>
        <td><?php echo $post['Post']['created']; ?></td>
    </tr>
    <?php endforeach; ?>
</table>

cakeblogのトップページである投稿記事一覧(cakeblog/posts)にアクセスすると

cakeblog_011

編集画面へのリンクが追加されている。この編集リンク部分をクリックして編集画面に進むと

cakeblog_012

編集画面、オーケー。

ルーティング(Routes)

これまでは、この作成したcakeblogのホーム(記事一覧ページ)にアクセスするにはhttp://IPアドレス/cakeblog/posts/index(indexはなくても一緒)としなければいけなかった。

これを、より短くユーザフレンドリーなURLに変更する。

記事一覧がアプリケーションのホームなので「cakeblog」だけで「cakeblog/posts/index」画面が表示されるようにしたい。

このルーティングの変更はapp/config/routes.phpを変更する。

34行目にある

Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));

の記述を以下のように変更する。

Router::connect('/', array('controller' => 'posts', 'action' => 'index', 'home'));

これでhttp://IPアドレス/cakeblog/で「記事一覧ページ」を表示出来るようになった。

cakeblog_013

以上で、The Cookbookの「開発例 > CakePHPブログチュートリアル」の実践は終了。

ちょっと前にやったWEB+DB PRESS vol.50にあったチュートリアル(これは掲示板だった)の復習のような感じだったかなぁ。

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 さくらインターネット アクセス解析 カスタム投稿