Yvision.kzYvision.kz
kk
Разное
Разное
399 772 постов41 подписчиков
Всяко-разно
2
02:52, 19 февраля 2011

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

Доброго времени суток, братцы-зендфреймворковцы. Продолжаем шагать по пути создания блога на Zend Framework. Сегодня будет короткий, но крайне важный шажочек. Мы научимся создавать свои хелперы, т.е помощники видов.

 

Мы уже использовали некоторые стандартные хелперы, такие как baseUrl(), headTitle(). Давайте теперь напишем свой. Если взглянуть сейчас на наш блог, то можно заметить, что в списке постов и в отдельных постах, эти самые посты выводятся одинаково, т.е. полностью. Обычно в блогах на главной выводятся анонсы, а уже перейдя по ссылке можно прочитать пост полностью. Такое можно реализовать создав в БД два поля: анонс и полная версия. Затем для вида главной страницы выводить анонс, а для вида отдельно поста полную версию соответственно. Но я считаю ненужным создавать лишнее поле. Вместо этого мы будем использовать специальный тег для ката, эдакий хабракат или ювикат. Если тег указан - пост разделяется.

Для помощников видов в Zend Framework'е существует специальный каталог: application/views/helpers/. Хелперы обычно должны лежать там и соответствовать таким требованиям как:

 

  • Название класса хелпера должно заканчиваться названием хелпера и использовать CamelCase style.
  • Класс хелпера должен наследоваться от Zend_View_Helper_Abstract или реализовывать интерфейс Zend_View_Helper_Interface.
  • Хелпер должен иметь публичный метод, совпадающий с названием хелпера, но первая буква должна быть в нижнем регистре.

 

Давайте напишем наш первый хелпер, который, если существует специальный тег, будет обрезать и оставлять текст до него. Создаем в каталоге application/views/helpers/ файл Preview.php и пишем в него следующее:

 

  1. <?php
  2.  
  3. class Zend_View_Helper_Preview extends Zend_View_Helper_Abstract
  4. {
  5. /**
  6.   * Preview (text before cut)
  7.   *
  8.   * @param string $post Post
  9.   * @return string $preview Preview
  10.   */
  11. public function preview($post)
  12. {
  13. $post = str_replace('<p><!-- cut --></p>', '<!-- cut -->', $post);
  14. $preview = explode('<!-- cut -->', $post);
  15. $preview = $preview[0];
  16.  
  17. return $preview;
  18. }
  19. }

 

Как видно из кода, мы будем юзать тег <!-- cut --> для разделения. Теперь нужно задействовать наш хелпер во вью. Для этого в файле application/views/scripts/index/index.phtml находим строку вывода поста и оборачиваем в наш хелпер. Было:

 

  1. <?php echo $post->blog_post ?>

 

Стало:

 

  1. <?php echo $this->preview($post->blog_post) ?>

 

Как видите наш собственный хелпер вызывается точно также как и стандартные. Теперь все посты на главной выводятся до тега-разделителя. Если перейти по ссылке к отдельному посту, то он уже выведется полностью. Все хорошо, но если посмотреть исходный код, то можно увидеть наш тег-разделитель. В принципе это не так уж и важно, но все же лучше его убрать. Для этого напишем еще один хелпер, который будет искать этот тег и удалять. А вот и он (application/views/helpers/RemoveCutTag.php):

 

  1. <?php
  2.  
  3. class Zend_View_Helper_RemoveCutTag extends Zend_View_Helper_Abstract
  4. {
  5. /**
  6.   * Cut the post's separator
  7.   *
  8.   * @param string $post Post
  9.   * @return string
  10.   */
  11. public function removeCutTag($post)
  12. {
  13. if (!(strpos($post, '<!-- cut -->') === false)) {
  14. $post = str_replace('<p><!-- cut --></p>', '', $post);
  15. $post = str_replace('<!-- cut -->', '', $post);
  16. }
  17.  
  18. return $post;
  19. }
  20. }

 

Теперь также как и в первый раз, задействуем наш хелпер в виде для отдельного поста. Находим строку вывода поста и заменяем на:

 

  1. <?phpecho$this->removeCutTag($this->post['blog_post'])?>

 

Теперь в исходном коде страницы тега-разделителя не будет. Ну вообщем все. Вот так легко можно создавать и использовать свои хелперы. Исходники как всегда можно брать отсюда.

Следующий шаг теперь выйдет не скоро. Дело в том, что я уезжаю на обследование в Оренбург. Буду продолжать курс лечения в МНТК "Микрохирургия глаза". Отсутствовать буду ориентировочно две недели. Так что всем удачи, чао-какао, вообщем увидимся :).

2