我目前在搜索控制器中有一个搜索表单,所以我能找到它的唯一方法是通过/search/
.我必须重构我的代码,以便此搜索表单不仅出现在搜索控制器中,还出现在整个站点的全局中.
(代码不完全,因为我必须重新键入一些)
我的课程扩展Zend_Form
位于application/forms/forms/SearchForm.php
:
class Form_SearchForm extends Zend_Form { public function init() {}; }
我的搜索控制器就像..
class SearchController extends Zend_Controller_Action { public function search() { $searchForm = new Form_SearchForm(); $this->view->form = $searchForm; } }
在我的Bootstrap.php中,我有一个模型自动加载器:
protected function _initAutoload() { $autoLoader = Zend_Loader_Autoloader::getInstance(); $resourceLoader = new Zend_Loader_Autoloader_Resource( array( 'basePath' => APPLICATION_PATH, 'namespace' => '', 'resourceTypes' => array( 'form' => array( 'path' => 'forms', 'namespace' => 'Form_', ), 'model' => array( 'path' => 'models/', 'namespace' => 'Model_', ), ), ) ); return $autoLoader;
}
我想知道我可以在哪里存储我的代码,以便在视图中生成全局搜索表单.
我的全局布局文件位于application/layouts/scripts/layout.phtml
并且当前吐出动态内容区域:
layout()->content;?>
我应该只将表单添加到此layout.phtml中,还是应该使用一些通用控制器?
编辑:很抱歉没有指定这个,但是如果我想不包括1-2特殊页面(可能是管理部分)怎么办...如果我将它硬编码到layout.phtml它仍然会出现..或应该我提供不同的布局文件,管理区域?
创建a searchAction()
对性能不利,因为它需要一个全新的调度周期.如果且仅当您拥有非常复杂的逻辑来证明单独的操作时,您可以创建一个Controller插件并添加searchAction()
到ActionStack中.如果您只是实例化/分配表单,或者如果您不需要每个请求的搜索表单,那么它不是最佳解决方案.
另一种可能性是在引导程序中实例化并分配表单.这种打破了关注点的分离,但提供了更好的性能.
protected function _initSearchForm() { $this->bootstrap('view'); $view = $this->getResource('view'); $searchForm = new Form_SearchForm(); $view->searchForm = $searchForm; return $searchForm; }
最后,我首选的解决方案是自定义视图助手:
对于这些解决方案中的任何一个,您最好在布局文件中输出表单,以最大限度地减少重复.
layout.phtml:
searchForm() ?>并
admin.phtml
为管理区域页面创建备用布局.这使您可以灵活地在弹出新需求时更改管理页面.