---
title: "Zend Framework: создаем блог. Шаг 2"
description: "Продолжаем копипасту разработку блога на Zend Framework. В планах на этот раз у нас создание категор..."
author: "KanatYvi"
published: "2011-02-16T04:07:00+00:00"
modified: "2014-10-06T07:16:49+00:00"
locale: "ru"
canonical_url: "https://yvision.kz/post/zend-framework-sozdaem-blog-shag-2-120790"
markdown_url: "https://yvision.kz/post/zend-framework-sozdaem-blog-shag-2-120790/markdown"
site_name: "Yvision.kz"
---

# Zend Framework: создаем блог. Шаг 2

> Продолжаем копипасту разработку блога на Zend Framework. В планах на этот раз у нас создание категор...

Продолжаем копипасту разработку блога на Zend Framework. В планах на этот раз у нас создание категорий, отображение постов в них и вывод комментариев к постам. Готовы? Поехали.

Начнем с моделей. Нам нужно вывести список категорий и при выборе определенной категории, вывести посты принадлежащие ей. Давайте добавим в нашу модель постов новый метод для выбора постов по ID'шнику категории. Вот полный код обновленной модели постов.

``` fetchRow('id = ' . $id); if (!$row) { throw new Exception('Ахтунг! Выборка поста не удалась :('); } return $row; } /** * Get by category's ID * * @param int $categoryId ID of category * @return array */ public function getByCategoryId($categoryId) { $categoryId = intval($categoryId); // Формируем условие запроса $select = $this->select()->where('category_id = ' . $categoryId) ->order('created_at DESC') ->order('id DESC'); // Выполняем запрос $row = $this->fetchAll($select); if (!$row) { throw new Exception('Ахтунг! Выборка категорий не удалась :('); } return $row->toArray(); }} ```

Как видите, мы добавили метод getByCategoryId($categoryId). Он принимает в качестве параметра ID'шник категории и возвращает посты соотвествующие ей в виде массива. Обратите внимание на условия запроса: они образуют как бы "паровозик" из методов. Также нам нужно получать данные по самой категории. А именно название (а если бы были мета-теги, то и их). Для этого нам нужно создать еще одну модель для категорий. Приведу ее код:

``` fetchRow('id = ' . $id); if (!$row) { throw new Exception('Ахтунг! Выборка данных по категории не прошла :('); } return $row; }} ```

Здесь у нас метод, принимающий в качестве параметра ID'шник и возращающий данные по категории соответствующей ему. Теперь нам нужно создать модель для комментариев. В нем будет метод, выбирающий комментарии по ID'шнику поста. Давайте напишем его:

``` fetchAll('post_id = ' . $postId); if (!$row) { throw new Exception('Ахтунг! Попытка получить комменты не удалась :('); } return $row->toArray(); }} ```

Давайте теперь изменим наш контроллер. Я сразу приведу готовый код и ниже поясню:

``` view->title = 'Тестовый блог на Zend Framework'; // Устанавливаем разделитель для тега title с помощью хелперов // headTitle() и setSeparator() $this->view->headTitle()->setSeparator(' | '); // Передаем заголовок в тег title, с помошью хелпера headTitle() $this->view->headTitle($this->view->title); // Создаем экземпляр модели категорий $categories = new Application_Model_DbTable_Categories(); // Выбираем все категории $this->view->categories = $categories->fetchAll(); } public function indexAction() { // Создаем экземпляр модели постов $posts = new Application_Model_DbTable_Posts(); // Выбираем все посты // Формируем условие $select = $posts->select()->order('created_at DESC') ->order('id DESC'); // Выполняем запрос $this->view->posts = $posts->fetchAll($select); } /** * View post * * @return void */ public function postAction() { // Берем ID'шник из параметра $id = intval($this->_getParam('id', 0)); if ($id > 0) { // Создаем экземпляр модели постов и выбираем посты по ID $post = new Application_Model_DbTable_Posts(); $this->view->post = $post->getById($id); // Устанавливаем заголовок для поста в тег title $this->view->postTitle = $this->view->post['title']; $this->view->headTitle($this->view->postTitle); // Получаем комменты к посту $comments = new Application_Model_DbTable_Comments(); $this->view->comments = $comments->getByPostId($id); } } /** * View category * * @return void */ public function categoryAction() { $id = intval($this->_getParam('id', 0)); if ($id > 0) { $posts = new Application_Model_DbTable_Posts(); $this->view->posts = $posts->getByCategoryId($id); // Получаем данные по категории $category = new Application_Model_DbTable_Categories(); $this->view->category = $category->getById($id); // Устанавливаем заголовок для категории в тег title $this->view->categoryTitle = $this->view->category['title']; $this->view->headTitle($this->view->categoryTitle); } } } ```

Первое изменение произошло в методе init(). В него мы добавили вывод всех категорий для отображения в сайдбаре. Изменение номер два - в методе postAction() добавлен вывод комментариев к посту. И наконец последнее измение - добавление нового метода categoryAction(). Он будет срабатывать при выборе определенной категории. Его можно добавить как ручками, так и с помощью Zend_Tool - командой "zf create action category index". При втором варианте также создастся соответствующий вид (application/views/scripts/category.phtml), иначе его надо будет добавить самому. Итак в методе categoryAction() мы получаем из параметров ID. Далее если ID больше нуля, то получаем посты, данные по категории и устанавливаем заголовок для категории.

И наконец осталось набросать вьюшку. Для начала подредактируем layout (application/layouts/scripts/layout.phtml). В месте где у нас в сайдбаре выводился список категорий, добавим реальный список из БД:

```

#### Категории categories as $category) : ?> - [title ?>](url(array('controller' => 'index', 'action' => 'category', 'id' => $category->id)) ?>) ```

Я не стал снова приводить код всего макета, а показал сам сайдбар. Здесь просто цикл foreach, в котором выводятся категории. Все должно быть знакомо и понятно. А вот и сама вьюшка категорий (application/views/scripts/index/category.phtml):

``` posts) Посты закончились

 posts as $post) : ?>

## [escape($post\['title'\]) ?>](url(array('controller' => 'index', 'action' => 'post', 'id' => $post['id'])) ?>) escape($post['created_at']) ?>

```

Тут все как на главной. Ну а теперь добавим вывод комментариев в наш вид для отдельного поста (application/views/scripts/index/post.phtml):

```

## post['title'] ?> post['blog_post'] ?> post['created_at'] ?>

### Комменты: comments)) : ?> Комментов нет comments as $comment) : ?>

##### [escape($comment\['name'\]) ?>]()

##### escape($comment['name']) ?>

```

Теперь можете запустить браузер, набрать URL вашего проекта и лицезреть результат. Поклацайте по ссылкам, все должно работать. В следующий раз займемся добавлением комментариев. Так что если вы до сих пор не подписались на [RSS](http://feeds.feedburner.com/gailimov), самое время исправиться. На этом у меня все, до следующего поста. Исходники лежат [тут](http://gailimov.info/files/zftest.tar.gz).

---

Source: [https://yvision.kz/post/zend-framework-sozdaem-blog-shag-2-120790](https://yvision.kz/post/zend-framework-sozdaem-blog-shag-2-120790)