FuelPHP 1.7.2のブログチュートリアル③

ブログチュートリアル①ブログチュートリアル②を合わせて、よりブログっぽいものにしてみます。

【注意】このチュートリアルはアプリ作成の最短の手順を示したものであり、セキュリティ上必要な設定や機能が省略されています。実際にアプリを運用する場合は、『はじめてのフレームワークとしてのFuelPHP第2版(3) 実践編』などを参考に必要なセキュリティ上の設定や機能をすべて実装されることをお薦めします。

FuelPHP 1.7.2のインストール設定

http://fuelphp.com/の「Download v1.7.2 now!」より、fuelphp-1.7.2.zipをダウンロードし展開します。

config.phpの設定

FuelPHPの設定ファイルfuel/app/config/config.phpを変更し、FuelPHPのORMパッケージとAuthパッケージを使えるようにします。

--- a/fuel/app/config/config.php
+++ b/fuel/app/config/config.php
@@ -258,7 +258,7 @@ return array(
        /**************************************************************************/
        /* Always Load                                                            */
        /**************************************************************************/
-       // 'always_load'  => array(
+       'always_load'  => array(

                /**
                 * These packages are loaded on Fuel's startup.
@@ -271,9 +271,10 @@ return array(
                 *     array('auth'     => PKGPATH.'auth/')
                 * );
                 */
-               // 'packages'  => array(
-               //      //'orm',
-               // ),
+               'packages'  => array(
+                       'orm',
+                       'auth',
+               ),

                /**
                 * These modules are always loaded on Fuel's startup. You can specify them
@@ -309,6 +310,6 @@ return array(
                 * If you don't want the lang in a group use null as groupname.
                 */
                // 'language'  => array(),
-       // ),
+       ),

 );

配列のキーalways_loadpackagesormが有効になるように、コメント記号//を削除し、ormの下にauthを追加します。

auth.phpの設定

Authパッケージの設定ファイルfuel/packages/auth/config/auth.phpをfuel/app/config/にコピーし、driverをOrmauthに変更します。

--- fuel/packages/auth/config/auth.php  2014-07-22 18:23:20.000000000 +0900
+++ fuel/app/config/auth.php    2014-07-23 20:07:04.125328123 +0900
@@ -22,7 +22,7 @@
  */

 return array(
-   'driver' => 'Simpleauth',
+   'driver' => 'Ormauth',
    'verify_multiple_logins' => false,
    'salt' => 'put_your_salt_here',
    'iterations' => 10000,

データベースの準備

MySQL にデータベースを作成します。

> CREATE DATABASE `fuel_blog` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

fuel/app/config/development/db.phpを変更し、FuelPHPからデータベースにアクセスできるようにします。

return array(
    'default' => array(
        'connection'  => array(
            'dsn'        => 'mysql:host=localhost;dbname=fuel_blog',
            'username'   => 'root',
            'password'   => '',
        ),
    ),
);

ブログの作成

FuelPHPのoil generateコマンドによりコードを自動生成します。管理ページの方は--skipオプションを付けてすでに存在するファイルの生成をスキップします。

$ php oil generate scaffold post title:varchar[50] body:text
$ php oil generate admin post title:varchar[50] body:text --skip

【注意】生成された全てのコードに目を通し、問題がないか確認することをお薦めします。

マイグレーションを実行し、データベースにテーブルを作成します。

$ php oil refine migrate
$ php oil refine migrate --packages=auth

これで、http://localhost:8000/postに認証なしのCRUDページが、http://localhost:8000/admin/postに認証付きのCRUDページが作成されました。

ソースコードの変更

http://localhost:8000/postの方は、ブログの一覧表示と個別の記事の表示があればよいので、それ以外の機能を削除します。

Postコントローラから、create、edit、deleteのアクションを削除します。

fuel/app/classes/controller/post.php

--- a/fuel/app/classes/controller/post.php
+++ b/fuel/app/classes/controller/post.php
@@ -24,109 +24,4 @@ class Controller_Post extends Controller_Template
                $this->template->content = View::forge('post/view', $data);

        }
-
-       public function action_create()
-       {
-               if (Input::method() == 'POST')
-               {
-                       $val = Model_Post::validate('create');
-
-                       if ($val->run())
-                       {
-                               $post = Model_Post::forge(array(
-                                       'title' => Input::post('title'),
-                                       'body' => Input::post('body'),
-                               ));
-
-                               if ($post and $post->save())
-                               {
-                                       Session::set_flash('success', 'Added post #'.$post->id.'.');
-
-                                       Response::redirect('post');
-                               }
-
-                               else
-                               {
-                                       Session::set_flash('error', 'Could not save post.');
-                               }
-                       }
-                       else
-                       {
-                               Session::set_flash('error', $val->error());
-                       }
-               }
-
-               $this->template->title = "Posts";
-               $this->template->content = View::forge('post/create');
-
-       }
-
-       public function action_edit($id = null)
-       {
-               is_null($id) and Response::redirect('post');
-
-               if ( ! $post = Model_Post::find($id))
-               {
-                       Session::set_flash('error', 'Could not find post #'.$id);
-                       Response::redirect('post');
-               }
-
-               $val = Model_Post::validate('edit');
-
-               if ($val->run())
-               {
-                       $post->title = Input::post('title');
-                       $post->body = Input::post('body');
-
-                       if ($post->save())
-                       {
-                               Session::set_flash('success', 'Updated post #' . $id);
-
-                               Response::redirect('post');
-                       }
-
-                       else
-                       {
-                               Session::set_flash('error', 'Could not update post #' . $id);
-                       }
-               }
-
-               else
-               {
-                       if (Input::method() == 'POST')
-                       {
-                               $post->title = $val->validated('title');
-                               $post->body = $val->validated('body');
-
-                               Session::set_flash('error', $val->error());
-                       }
-
-                       $this->template->set_global('post', $post, false);
-               }
-
-               $this->template->title = "Posts";
-               $this->template->content = View::forge('post/edit');
-
-       }
-
-       public function action_delete($id = null)
-       {
-               is_null($id) and Response::redirect('post');
-
-               if ($post = Model_Post::find($id))
-               {
-                       $post->delete();
-
-                       Session::set_flash('success', 'Deleted post #'.$id);
-               }
-
-               else
-               {
-                       Session::set_flash('error', 'Could not delete post #'.$id);
-               }
-
-               Response::redirect('post');
-
-       }
-
 }

一覧ページのビューファイルから、Edit、DeleteそしてAdd new Postボタンを削除します。

fuel/app/views/post/index.php

--- a/fuel/app/views/post/index.php
+++ b/fuel/app/views/post/index.php
@@ -17,7 +17,8 @@
            <td>
                <div class="btn-toolbar">
                    <div class="btn-group">
-                       <?php echo Html::anchor('post/view/'.$item->id, '<i class="icon-eye-open"></i> View', array('class' => 'btn btn-small')); ?>                        <?php echo Html::anchor('post/edit/'.$item->id, '<i class="icon-wrench"></i> Edit', array('class' => 'btn btn-small')); ?>                      <?php echo Html::anchor('post/delete/'.$item->id, '<i class="icon-trash icon-white"></i> Delete', array('class' => 'btn btn-small btn-danger', 'onclick' => "return confirm('Are you sure?')")); ?>                 </div>
+                       <?php echo Html::anchor('post/view/'.$item->id, '<i class="icon-eye-open"></i> View', array('class' => 'btn btn-small')); ?>
+                   </div>
                </div>

            </td>
@@ -28,7 +29,4 @@
 <?php else: ?>
 <p>No Posts.</p>

-<?php endif; ?><p>
-   <?php echo Html::anchor('post/create', 'Add new Post', array('class' => 'btn btn-success')); ?>
-
-</p>
+<?php endif; ?>

個別の記事ページのビューファイルからEditリンクを削除します。

fuel/app/views/post/view.php

--- a/fuel/app/views/post/view.php
+++ b/fuel/app/views/post/view.php
@@ -7,5 +7,4 @@
        <strong>Body:</strong>
        <?php echo $post->body; ?></p>

-<?php echo Html::anchor('post/edit/'.$post->id, 'Edit'); ?> |
-<?php echo Html::anchor('post', 'Back'); ?>
\ No newline at end of file
+<?php echo Html::anchor('post', 'Back'); ?>

Webサーバの起動

PHP 5.4以降のビルトインWebサーバを起動します。

$ php oil server

ブラウザからhttp://localhost:8000/postにアクセスすると、記事の一覧が表示されます。

スクリーンショット

ブラウザからhttp://localhost:8000/admin/postにアクセスすると、ログインページにリダイレクトされます。

デフォルトの管理者ユーザでログインできます。

  ユーザ名:admin
パスワード:admin

http://localhost:8000/admin/postにアクセスすると、記事の一覧が表示され、記事の追加、削除、編集ができます。

スクリーンショット

Date: 2014/07/28

Tags: fuelphp, database