Zend_Form in Magento

我喜欢 Zend_Form 这个组件,为了在 Magento 里使用 Zend_Form,走了不少弯路,但最终方法是很简单的。

要在 Magento 里使用 Zend_Form 最关键的一点是明白 Zend_Form 依赖于 Zend_View,而 Magento 从头到尾都没有用到 Zend_View。如果使用 Zend Framework Bootstrap,它会搭建好 MVC,在你想到去用 Zend_View 之前,它就已经就位了,所以 Zend_Form 在真正的 Zend Framework 里是取之即用的。在 Magento 里,必须自己初始化一个 Zend_View,传递给 Zend_Form 的 $_view,或者用 setView()方法,否则你会得到一个错误提示:ViewHelper decorator cannot render without a registered view object。

我走的弯路是刻意在 Magento 里照搬 Zend Framework 里 Zend_Form 的输出。我专门建了 views 这个目录,在其下又建了scripts 目录(Magento 里最接近 views/scripts 的目录是 templates,但我不想把 Zend Framework 那套文件与 Magento 的文件混在一起),然后把初始化后的 Zend_Form 赋值给 $view->form,然后在 views/scripts/index.phtml 里


echo $this->form;

然后在 Magento 的 Block 文件里新建一个方法


public function getZendView() {
	return $this->view;
}

最后在 Magento template 文件里


echo $this->getZendView();

虽然能运行,但过了一天,我自己都觉得不对头,尝试着直接在 Magento 里输出 Zend_Form,也成功了。具体做法是:

先为 Zend_Form 创建一个目录,我把它建在 {MyModuleName}/Model 下(我见 Magento 把与 Form 相关的文件归入 Block,但调用 Block 文件没有调用 Model 文件方便。既然如何在 Magento 里使用 Zend_Form 属于我的原创,在不违背 Magento 文件规范的情况下,我应该有自己的自由决定。再说把 Form 对象归于 Model 也不违背 MVC 的原则)。

然后在其下建了一个 helpers 目录,即 {MyModuleName}/Model/Form/helpers(若不涉及自定义 helper,则跳过此步骤)。选择这个位置,我对自己都有争议,但总得为 Zend_Form 的 ViewHelper 文件找个地方。我在 Zend_Form 里初始化 Zend_View,而 Zend_View 需要知道 ViewHelper 文件的位置,我可以用很简单的dirname(__FILE__) . ‘/helpers’ 得到这个位置。如果放在 Magento 自己的 Helper 目录,则搞混了 Magento Helper 与 Zend ViewHelper,而且我用不着用 Mage::helper(‘mymodulename’) 去调用它。所以我决定在 Form 目录下放置 helpers 目录,以后若把 Form 迁移位置,helpers 也可以随之迁移,方便 refactoring。

然后创建 Zend_Form,在 Block 里用 $form->render() 得到这个表单的 html 输出,最后在 template 下该怎么做我就不多说了。

Leave a Reply

Your email address will not be published. Required fields are marked *