Kohanaに入門してみた(2)

簡易ブログのエントリ一覧は表示できたので、次はエントリ追加、エントリ詳細、コメント追加をできるようにします。

エントリ追加。

  • controllers/blog.php
public function add_entry() {
  $_POST = new Validation($_POST);
  $_POST->add_rules('title', 'required');

  if($_POST->validate()) {
    $entry = new Entry_Model;
    $entry->title = $_POST['title'];
    $entry->body = $_POST['body'];

    $entry->save();
    url::redirect('blog');
  } else {
    $view = new View('add_entry');
    $view->errors = $_POST->errors();
    $view->render(true);
  }
}
  • views/add_entry.tpl
<h1>Add entry</h1>
{if count($errors) > 0}
  {foreach $errors error}
    <p>{$error}</p>
  {/foreach}
{/if}
{form::open('blog/add_entry', array('method'=>'post'))}
<dl>
<dt>Title</dt>
<dd>
{form::input('title')}
</dd>
<dt>Contents</dt>
<dd>
{form::textarea('body')}
</dd>
<dl>
{form::submit('submit', 'Submit')}


エントリ詳細

  • controllers/blog.php
public function view_entry($id) {
   $entry = ORM::factory('entry', (int)$id);

   $view = new View('view_entry');
   $view->entry = $entry;
   $view->comments = $entry->comments;
   $view->render(true);
}
  • views/view_entry.tpl
{html::anchor('blog', 'Entry list')}
<hr />
<h1>{$entry->title}</h1>
<p>{$entry->body}</p>
<p>{html::anchor('blog/add_comment/$entry->id', 'Add comment')}</p>
<hr />

{foreach $comments comment}
  <p><strong>{$comment->author}</strong><br />
  {$comment->body}</p>
{/foreach}


コメント追加

  • controllers/blog.php
public function add_comment($id) {
  $_POST = new Validation($_POST);
  $_POST->add_rules('body', 'required');

  if($_POST->validate()) {
    $entry = ORM::factory('entry', (int)$_POST['entry_id']);

    $comment = new Comment_Model;
    $comment->entry_id = $entry->id;
    $comment->author = $_POST['author'];
    $comment->body = $_POST['body'];
    $comment->save();

    url::redirect('blog/view_entry/' . (int)$_POST['entry_id']);
  } else {
    $view = new View('add_comment');
    $view->entry_id = $id;
    $view->errors = $_POST->errors();
    $view->render(true);
  }
}
  • views/add_comment.tpl
<h1>Add comment</h1>
{if count($errors) > 0}
  {foreach $errors error}
    <p>{$error}</p>
  {/foreach}
{/if}

{form::open('blog/add_comment/$entry_id', array('method'=>'post'))}
<dl>
<dt>Author</dt>
<dd>
{form::input('author')}
</dd>
<dt>Contents</dt>
<dd>
{form::textarea('body')}
</dd>
<dl>
{form::hidden("entry_id", $entry_id)}
{form::submit('submit', 'Submit')}


とりあえず動くようになっただけ。
I/Oチェックとバリデーションの使い方とかもっとちゃんとドキュメント見ないと駄目だ。。。
とりあえず、次はログインコントローラを作りながらその辺もやってみたいと思います。