Всем привет.
В последнее время я всё чаще использую Zend_Action_Helper_ContextSwitch, и с каждым разом он нравится он мне всё больше. Сейчас я расскажу вам о его возможностях и приведу примеры использования.

Некоторое время назад я уже писал заметку про наследника ContextSwitch – хэлпер AjaxContext, но тогда я смотрел на него с точки зрения полезности для AJAX-скриптов. Если интересуетесь – можете ознакомиться.
Action-хэлпер SwitchContext позволяет нам использовать разные скрипты вида в зависимости от обстановки. Разберём на примере форума.
У нас есть список топиков определённого раздела:
Список тем форума - Zend Framework
Мы решили добавить возможность подписываться на новые топики форума по 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
public function init() {
    $this->_helper->contextSwitch
        ->addContext(
            'rss',
            array(
                'suffix' => 'rss',
                'headers' => array('Content-Type' => 'text/xml'),
            )
        )
        ->addActionContext('index', 'rss')
        ->initContext();
}

Код довольно простой. Задействовали мы три метода хэлпера.

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

Спасибо за внимание. Вопросы можете задавать в комментариях.

Связанные записи

One Comment

  1. Hinikato says:

    Наконец-то дошли руки до этого хелпера…

    C помощью этой статьи, разобрался в принципе работы хелпера, теперь
    заюзаю его в бою ;)

Leave a Reply