[Zend Framework] Zend_View: 独自のビューフィルターを作成する
公式を見る限りビューフィルターという名称で良いのか分からなかったのですが、フィルターも作ってみることにします。
前回作成したビューヘルパーを参考に進めます。
Contents
パスを確認する
「推奨されるプロジェクト・ディレクトリ構造」に従って、filters ディレクトリを作成しました。
- application/views/filters
作成のためのルールとサンプル
ビューヘルパー作成時のルールを参考に、フィルターを用意しました。
サンプルを参考に作成、設置しました。
設置場所、ファイル名、クラス名を揃えます。
<?php
class Zend_View_Filter_AllowHtmlTag implements Zend_Filter_Interface
{
public function filter($str)
{
return strtolower($str);
}
}
コントローラで指定
ルールに従っているのでパスなしでも動きます。
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');
適用前
適用後
.phtml ビューファイル内で指定
<?php $this->addFilter('AllowHtmlTag');?>
適用前
適用後
partialLoopで使うと、その中でのみ機能しました。
ビューフィルターも作ってみる
AllowHtmlTag の名のとおり、許可したタグだけ通すビューフィルターを作成してみたいと思います。
partialLoop のみに適用します。
<?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);
}
}
<?php $this->addFilter('AllowHtmlTag'); ?>
<aside>
<h3><?= $this->escape($this->widgetTitle); ?></h3>
<?= $this->widgetContent . PHP_EOL; ?>
</aside>
aside 内の ul タグは通っています。 h3 の escape は効いています。
一方、本文内のフォームタグは影響を受けていません。
意図したとおりの出力を得られたようです。