[Zend Framework] Zend_View: 独自のビューフィルターを作成する

公式を見る限りビューフィルターという名称で良いのか分からなかったのですが、フィルターも作ってみることにします。
前回作成したビューヘルパーを参考に進めます。

Contents

パスを確認する

推奨されるプロジェクト・ディレクトリ構造」に従って、filters ディレクトリを作成しました。

  • application/views/filters

作成のためのルールとサンプル

ビューヘルパー作成時のルールを参考に、フィルターを用意しました。

サンプルを参考に作成、設置しました。
設置場所、ファイル名、クラス名を揃えます。

application/views/filters/AllowHtmlTag.php
<?php
class Zend_View_Filter_AllowHtmlTag implements Zend_Filter_Interface
{
    public function filter($str)
    {
        return strtolower($str);
    }
}

コントローラで指定

ルールに従っているのでパスなしでも動きます。

application/Controllers/NewsController.php
    public function init()
    {
        /* Initialize action controller here */
        $this->_helper->layout->getLayoutInstance()->getView()
//             ->addFilterPath('/views/filters', 'Zend_View_Filter_')
             ->addFilter('AllowHtmlTag');
//        $this->view->addFilter('AllowHtmlTag');
    }

下記だけでもOK。action内でもこれで呼べました。

$this->view->addFilter('AllowHtmlTag');

適用前

view_helper 2013-06-27 13-54-00

適用後

view_filter 2013-07-02 02-36-01

.phtml ビューファイル内で指定

application/layouts/scripts/partialLoop.phtml
<?php $this->addFilter('AllowHtmlTag');?>

適用前

Zend_View 2013-06-21-21-25-30

適用後

view_filter 2013-07-02 02-48-30

partialLoopで使うと、その中でのみ機能しました。

ビューフィルターも作ってみる

AllowHtmlTag の名のとおり、許可したタグだけ通すビューフィルターを作成してみたいと思います。
partialLoop のみに適用します。

application/views/filters/AllowHtmlTag.php
<?php
Zend_Loader::loadClass('Zend_Filter');
class Zend_View_Filter_AllowHtmlTag implements Zend_Filter_Interface
{
    public function filter($str)
    {
        $allowed_tags = array('aside', 'h3', 'a', 'href', 'p', 'br', 'strong', 'li', 'ol', 'ul');
        $allowed_attributes = array('href');
        $filter = new Zend_Filter_StripTags(array(
                'allowTags' => $allowed_tags,
                'allowAttribs' => $allowed_attributes,
            ));
        return $filter->filter($str);
    }
}
application/layouts/scripts/partialLoop.phtml
<?php $this->addFilter('AllowHtmlTag'); ?>
                <aside>
                    <h3><?= $this->escape($this->widgetTitle); ?></h3>
                    <?= $this->widgetContent . PHP_EOL; ?>
                </aside>

view_filter 2013-07-02 03-04-51

aside 内の ul タグは通っています。 h3 の escape は効いています。
一方、本文内のフォームタグは影響を受けていません。
意図したとおりの出力を得られたようです。