Symfony2「blogチュートリアル(10) 記事の編集」

Symfony2「blogチュートリアル(10) 記事の編集」

記事の削除居続いて、CRUDの最後となる編集の機能追加

【編集ページへのルーティング追加】

記事を編集するページが増えるので、対応するルーティングを追加する

$ vim src/My/BlogBundle/Resources/config/routing.yml
blog_edit:
pattern: /{id}/edit
defaults: { _controller: MyBlogBundle:Default:edit }

【編集アクションの作成】

Defaultコントローラにeditアクションを追加する

$ vim src/My/BlogBundle/Controller/DefaultController.php
class DefaultController extends Controller
{
// …
public function editAction($id)
{
// DBから取得
$em = $this->getDoctrine()->getEntityManager();
$post = $em->find(‘MyBlogBundle:Post’, $id);
if (!$post) {
throw new NotFoundHttpException(‘The post does not exist.’);
}

    // フォームのビルド
    $form = $this->createFormBuilder($post)
        ->add('title')
        ->add('body')
        ->getForm();

    // バリデーション
    $request = $this->getRequest();
    if ('POST' === $request->getMethod()) {
        $form->bindRequest($request);
        if ($form->isValid()) {
            // 更新されたエンティティをデータベースに保存
            $post = $form->getData();
            $post->setUpdatedAt(new \DateTime());
            $em->flush();
            return $this->redirect($this->generateUrl('blog_index'));
        }
    }

    // 描画
    return $this->render('MyBlogBundle:Default:edit.html.twig', array(
        'post' => $post,
        'form' => $form->createView(),
    ));
}

}

【編集用テンプレートの作成】

編集用のテンプレートを作成

編集用テンプレート

$ vim src/My/BlogBundle/Resources/views/Default/edit.html.twig
<h1>Edit Post</h1>
<form action="{{ path(‘blog_edit’, {‘id’:post.id}) }}" method="post" {{ form_enctype(form) }} novalidate>
{{ form_widget(form) }}
<input type="submit" value="Save Post" />
</form>

一覧表示用テンプレート

$ vim src/My/BlogBundle/Resources/views/Default/index.html.twig
<h1>Blog posts</h1>
<table>
<tr>
<td>Id</td>
<td>Title</td>
<td>CreatedAt</td>
<td>Operation</td>
</tr>
{# ここから、posts配列をループして、投稿記事の情報を表示 #}
{% for post in posts %}
<tr>
<td>{{ post.id }}</td>
<td><a href="{{ path(‘blog_show’, {‘id’:post.id}) }}">{{ post.title }}</a></td>
<td>{{ post.createdAt|date(‘Y/m/d H:i’) }}</td>
<td><a href="{{ path(‘blog_edit’, {‘id’:post.id}) }}">Edit</a> <a href="{{ path(‘blog_delete’, {‘id’:post.id}) }}">Delete</a></td>
</tr>
{% else %}
<tr>
<td colspan="4">No posts found</td>
</tr>
{% endfor %}
</table>
<div>
<a href="{{ path(‘blog_new’) }}">add post</a>
</div>

【ブラウザで確認】

以下へアクセス後、「edit」リンクがあることを確認
投稿記事(POST)の変更が可能なことを確認

http://somewhere/respo/blog.git/blog

【参考】

ref. blogチュートリアル(10) 記事の編集