Zend_Form を使ってよく Wysiwyg の出力コードを生成するようなカスタムエレメントを生成したいことがよくある。
昔のバージョンでは Zend_View クラスの addHelperPath() をしただけだった記憶があったんだけど、今は少し違うっぽい。
なので一通り調べて実装しなおしてみた時のメモ。
Zend Frameowrk のバージョンは 1.8.1。
ディレクトリ構成は以下の通り。
+--- application ---+--- controllers | +--- modles | +--- forms --- elements | +--- layouts | +--- views ---+--- helpers | +--- scripts | +--- incude --- Zend | +--- public_html
application/forms/elements の下に Wysiwyg.php というファイル名で以下のファイルを作成する。
<?php
require_once 'Zend/Form/Element/Xhtml.php';
class Zend_Form_Element_Wysiwyg extends Zend_Form_Element_Xhtml
{
public $helper = 'formWysiwyg';
}
?>
ここでは、単純に使用する Helper クラスの名前を指定するだけのシンプルなものにしておく。
次に application/views/helpers の下に FormWysiwyg.php というファイル名で以下のファイルを作成する。
<?php
require_once 'Zend/View/Helper/FormElement.php';
class Zend_View_Helper_FormWysiwyg extends Zend_View_Helper_FormElement
{
public function formWysiwyg($name, $value = null, $attribs = null)
{
$xhtml = "ここに Wysiwyg を出力 JavaScript などを書く。値は$valueでわたされる。";
return $xhtml;
}
}
?&ht;
上記で Helper クラスを作成しので、 View Renderer がこのパスに気がつくように、 bootstrap などに以下のようなコードを追加してやる。
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer->initView();
$viewRenderer->view->addHelperPath('application/views/helpers', 'Zend_View_Helper');
addHelperPath の第一引数がパスで、台に引数はクラス名のプリフェックスを指定する。
例えば作成した Helper クラスの名前が、 Enjoi_View_Helper_FormWysiwyg であれば、 Enjoi_View_Helper を指定する必要がある。
最後に実際に作成したカスタムフォームエレメントを使用する Zend_Form のサブクラスを実装する。
実装すると言ってもここでは、作成したエレメントクラスが自動的に認識されるように PluginLoader の設定をするだけ。
$loader = new Zend_Loader_PluginLoader();
$loader->addPrefixPath('Zend_Form_Element', 'application/forms/elements/')
->addPrefixPath('Zend_Form_Element', 'Zend/Form/Element/');
$this->setPluginLoader($loader, Zend_Form::ELEMENT);
これで、 Zend_Form は Zend_Form_Element を検索しに application/forms/elements/ と Zend/Form/Element/ を確認する。
また、 addPrefixPath の第一引数は、は先ほどの addHelperPath 同様、プレフィックスを指定している。
ここまでできたら、後は以下のようにエレメントが作成できるようになってるはず。
$this->addElement('wysiwyg', 'content_main', array(
'label' => 'Main Content',
'description' => 'hoge hoge',
'validators' => $validators,
'filters' => $filters,
'required' => true,
));