FuelPHPサイド
FuelBeans 35 : Shooting Brake 7
大雪の新潟、去年の秋からうちの猫になったシロが、玄関の軒下の板を破って脱走しました。
足跡を追跡した結果、空き家になっている隣家に潜り込んでいる様子。声かけても返事しません。表に出たがっていたから、返事すると呼び戻されること、わかっているんでしょう。
そんなこともあり、指がかじかんでうまく打てません。それでも続く、根性のシューティング・ブレーキです。
ブログで表示する記事(ポスト)は通常、ログインしていない読者にも広く読んでもらえるように設定されていることが多ですよね。
いま作成中のブログも、同じです。ログインが必要なページはadminコントローラーを継承し、必要ないところはadminの親であるbaseコントローラーを継承しています。
ポストの一覧表示と、一件分の表示はbaseコントローラーを継承したhomeコントローラーに実装します。
この表示ページ二種類はどちらも、見るのにログインは必要有りませんが、編集(更新)と削除処理のリンクは、ログインしている人にだけ見せるのが、親切です。ログインしていない人が、クリックし、「ログインされていない」とのメッセージを見せられ、ログインページに飛ばされるのは、ちょっと可哀想です。
ほとんどのブログでは、ログインをして記事を書く人より、読み手の方が多いのですから、書き手の人に親切にリンクを表示するよりは、読み手の人に親切に、リンクは隠しておくほうが妥当です。
その手法は、リンクの有無のビューを用意し、使い分ける方法と、ログインの有無をビューに渡し、ビューで切り分ける方法があります。カテゴリーでは、ビューを複数用意し使い分けました。今回はビューは一つにし、ロジックを入れて切り分けます。
どちらが最適かは人により意見も違うでしょうし、状況にもよります。ただ、学習目的であれば、両方経験しておくのは良いことです。
そうしたわけでビューです。post/show.php。
<div>
<p><em>タイトル:</em><?php echo $title; ?></p>
<p><em>本文:</em><?php echo $content; ?></p>
<p><em>カテゴリー:</em><?php echo $category; ?></p>
</div>
<div>
<?php if ($logined) : ?>
<?php echo Html::anchor("/blog/update/$id", '更新'); ?>
<?php echo Html::anchor("/blog/delete/$id", '削除'); ?>
<?php endif; ?>
</div>
homeコントローラーです。controller/home.php
<?php
class Controller_Home extends Controller_base
{
/**
* ポスト1件表示
*
* @param int $id
* @return Fuel\Core\View
* @throws HttpNotFoundException
*/
function action_show($id)
{
// idの存在を確認
$result = Model_Post::get($id);
if (!$result)
{
// 404ページ表示
throw new HttpNotFoundException;
}
// カテゴリー名取得
$category = Model_Category::get($result['category_id']);
$category = $category ? $category['name'] : '未カテゴリー';
$show_view = View::forge('post/show');
$show_view->id = $id;
$show_view->title = $result['title'];
$show_view->content = $result['content'];
$show_view->category = $category;
// リンクの表示を切り分けるため
// ログイン情報をビューへ渡す
$show_view->logined = Auth::check();
$view = $this->set_title('ポスト表示')
->set_content($show_view)
->get_view();
return $view;
}
}
postモデルに追加するget()です。一件取得の関数です。
/**
* IDを元に1件ゲットだぜ
*
* 仮に、複数件一致しても1件分のデーターのみを返す
*
* @param int $id
* @return mix SELECT結果1件分、エラー時false
*/
public static function get($id)
{
// FuelPHPのSQLビルダーは、原則全部エスケープするため
// 不必要であるが、念のため
if (!is_numeric($id))
{
return false;
}
$result = DB::select()
->from(self::DB_NAME)
->where('id', $id)
->execute()
->current(); // 1件分
return isset($result) ? $result : false;
}
さあこれで、homeコントローラの一覧表示、postコントローラーの更新と、削除、全部今までの知識で行けそうですね。チャレンジしてみましょう。
簡単なのでこれからやっつけましょう。
新しいことはありません。ぶっちゃけ、カテゴリーの削除処理と同じです。
/**
* ポスト削除
*
* @param int $id
* @return mix 削除時件数(int)、エラー時false
*/
public static function delete($id)
{
// FuelPHPのSQLビルダーは、原則全部エスケープするため
// 不必要であるが、念のため
if (!is_numeric($id))
{
return false;
}
$deleted_cnt = DB::delete(self::DB_NAME)
->where('id', $id)
->execute();
return $deleted_cnt;
}
postコントローラーです。deleteアクション関数の追加分です。
/**
* ポスト削除
*
* @param int $id
* @throws HttpNotFoundException
*/
public static function action_delete($id)
{
// idの存在を確認
$result = Model_Post::get($id);
if (!$result)
{
// 404ページ表示
throw new HttpNotFoundException;
}
if (Model_Post::delete($id))
{
Session::set_flash('message', 'ポストを削除しました。');
}
else
{
Session::set_flash('error', 'ポストの削除に失敗しました。');
}
Response::redirect('/');
}
あとは、ポストの一覧表示と、更新処理ですね。
| FuelBeans 34 : Shooting Brake 6< 前 | 次 >FuelBeans 36 : Shooting Brake 8 |
|---|
| < 前 | 次 > |
|---|