Php Zend-重构以在站点全局包含表单
我目前在搜索控制器中有一个搜索表单,因此我只能通过Php Zend-重构以在站点全局包含表单,php,model-view-controller,zend-framework,Php,Model View Controller,Zend Framework,我目前在搜索控制器中有一个搜索表单,因此我只能通过/search/访问它。我必须重构我的代码,这样这个搜索表单不仅会出现在搜索控制器中,而且会在整个站点中全局出现 (代码不准确,因为我不得不重新键入一些代码) 扩展Zend_Form的我的类位于application/forms/forms/SearchForm.php: class Form_SearchForm extends Zend_Form { public function init() {}; } 我的搜索控制器类似于
/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;
}
我想知道在哪里可以存储代码,以便在视图中全局生成搜索表单
我的全局布局文件位于应用程序/layouts/scripts/layout.phtml
中,当前弹出一个动态内容区域:
<div id="main">
<?php echo $this->layout()->content;?>
</div>
我应该只是将表单添加到此layout.phtml中,还是应该使用一些通用控制器
编辑:很抱歉没有指定这个太多,但如果我想不包括它的1-2个特殊页面(可能是一个管理部分)。。如果我把它硬编码到layout.phtml中,它仍然会出现。。或者我应该提供一个不同的布局文件,比如说,一个管理区域
class Form_SearchForm ... {
static function getInstance() {
static $instance;
if (!$instance)
$instance = new Form_SearchForm();
return $instance;
}
}
现在,不要创建新表单,只需将其作为
$form = Form_SearchForm::getInstance();
我会把它分成一部分和一个占位符 在layout.phtml中:
<?php if($searchForm = $this->placeHolder('searchForm'): ?>
<?php echo $searchForm; ?>
<?php endif; ?>
<?php echo $this->searchForm() ?>
创建一个searchAction()
对性能不好,因为它需要一个全新的调度周期。如果,而且只有当,你有非常复杂的逻辑来证明一个单独的行动是正确的,你才能。如果您只是实例化/分配表单,或者不需要每个请求都使用搜索表单,那么这不是最佳解决方案
另一种可能是在引导中实例化和分配表单。这种方法打破了关注点之间的分离,但提供了更好的性能
protected function _initSearchForm()
{
$this->bootstrap('view');
$view = $this->getResource('view');
$searchForm = new Form_SearchForm();
$view->searchForm = $searchForm;
return $searchForm;
}
最后,我的首选解决方案是自定义视图帮助器:
<?php
class My_View_Helper_SearchForm extends Zend_View_Helper_Abstract
{
public function searchForm()
{
$searchForm = new Form_SearchForm();
return $searchForm;
}
}
很抱歉,你失去了我,你介意为我的新手扩展一下吗?你更喜欢哪个选项?我想我不知道正确的方法。但我认为最正确的是第一个,但现在太复杂了。将类设为单例很简单,我现在将为此添加一个代码。如何将Form_SearchForm的实例添加到Zend_注册表中,您可以自己弄清楚:)很好奇,将其设置为单身会实现什么?Richard Nguyen正是需要的:我确保它只创建一次,因此,如果表单被处理,它将存储值和验证结果。他将如何使用控制器中的表单?您可以访问视图,从而访问视图帮助器控制器。如果您谈论的是使用Zend_表单实际构建from,那么您可以调用动作帮助器,而不是调用部分帮助器,从而转到搜索_控制器。假设$view是Zend_视图实例。。。“form”是输出表单的操作的名称$查看->占位符('searchForm')->set($view->action('form','search','default));对不起,我很困惑,我是否必须在每个视图中都包含第二个代码段?是的,您希望表单出现在任何视图中。如果你有比没有更多的视图,那么前端控制器插件更容易。。。减少维护。
<?php echo $this->searchForm() ?>