Всем привет.
В последнее время я всё чаще использую Zend_Action_Helper_ContextSwitch, и с каждым разом он нравится он мне всё больше. Сейчас я расскажу вам о его возможностях и приведу примеры использования.
Некоторое время назад я уже писал заметку про наследника ContextSwitch – хэлпер AjaxContext, но тогда я смотрел на него с точки зрения полезности для AJAX-скриптов. Если интересуетесь – можете ознакомиться.
Action-хэлпер SwitchContext позволяет нам использовать разные скрипты вида в зависимости от обстановки. Разберём на примере форума.
У нас есть список топиков определённого раздела:

Мы решили добавить возможность подписываться на новые топики форума по RSS. При помощи SwitchContext это можно сделать очень быстро и изящно.
Итак, мы имеем следующий контроллер:
1 2 3 4 5 6 7 8 | class ForumController extends Zend_Controller_Action { public function indexAction() { $topics = new Topics(); $this->view->topics = $topics->fetchAll(null, 'date DESC'); } } |
Скрипт вида выводит переданные ему топики в нужном виде, но это нас сейчас мало волнует. Нам надо, чтобы топики выводились в RSS-формате. Для этого мы задействуем другой скрипт вида – index.rss.phtml, а для переключения между видами – SwitchContext.
Добавим метод инициализации в наш контроллер:
1 2 3 4 5 6 7 8 9 10 11 12 |
Код довольно простой. Задействовали мы три метода хэлпера.
- addContext
- C помощью него мы добавляем новый тип содержимого (context) с именем “rss”. Второй параметр метода – массив параметров. Мы передаём два параметра. Первый – это suffix имён скриптов вида (index.%suffix%.phtml, в нашем случае – index.rss.phtml). Второй – массив посылаемых заголовков. В заголовки мы передаём только content-type: text/xml.
- addActionContext
- Этот метод служит для добавления контекста к действию нашего контроллера. Мы добавляем контекст “rss” к действию “index”
- initContext()
- Запускает хэлпер
Плавно переходим к следующему вопросу. Каким образом хэлпер выбирает скрипт вида для выполнения? Здесь всё тоже совсем просто. По умолчанию используется стандартный скрипт вида. Передача названия нужного формата происходит через URL (/forum/index/format/rss) или через GET (/forum/index?format=rss).
Создаём скрипт вида для RSS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"> <channel> <title>Новые топики форума</title> <link>http://sitename.ru</link> <lastBuildDate><?php echo strftime('%a, %d %b %Y %H:%M:%S', strtotime($this->topics->current->date)) ?></lastBuildDate> <?php foreach($topics as $topic): ?> <item> <link><?php echo $this->url(array('action' => 'topic', 'id' => $topic->id)) ?></link> <guid>topic <?php echo $topic->id ?> on your_sitename</guid> <pubDate><?php echo strftime('%a, %d %b %Y %H:%M:%S', strtotime($topic->date)) ?></pubDate> </item> <?php endforeach ?> </channel> </rss> |
Вот и всё! Теперь перейдя по ссылке http://your-sitename/forum/index/format/rss мы можем увидеть последние созданные топики в формате RSS.
И, напоследок, несколько полезных ссылок:
Zend_Controller_Action_Helper_ContextSwitch в руководстве разработчика
Перевод спецификации RSS
Спасибо за внимание. Вопросы можете задавать в комментариях.
Hinikato says:
Наконец-то дошли руки до этого хелпера…
C помощью этой статьи, разобрался в принципе работы хелпера, теперь
16 декабря 2008, 9:42заюзаю его в бою