2009-11-22 72 views
2

我目前在搜索控制器中有一个搜索表单,因此唯一可以通过的方式是通过/search/。我必须重构我的代码,以便此搜索表单不仅出现在搜索控制器中,而且还出现在整个网站中。Zend - 在网站上重构全局表单

(代码心不是确切我不得不重新键入一些吧)

我的类,它扩展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,目前吐出动态内容区域:

<div id="main"> 
    <?php echo $this->layout()->content;?> 
</div> 

如果我只是形式添加到该layout.phtml或者是有一些通用的控制器,我应该使用?

编辑:对不起,也没有指定,但如果例如我想不包括它1-2个特殊页面(可能是一个管理员部分)..如果我硬编码到layout.phtml它仍然会出现..或者我应该提供不同的布局文件来说,管理区域?

回答

5

创建searchAction()不利于性能,因为它需要一个全新的调度周期。如果并且只有当你有非常复杂的逻辑证明单独的行为是正当的时,你才可以create a Controller Plugin and add searchAction() to the ActionStack。如果您只是实例化/分配表单,或者如果您不需要每请求的的搜索表单,则这不是最佳解决方案。


另一种可能性是实例化并在引导程序中分配表单。这种 - 打破了关注点的分离,但提供了更好的性能。

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; 
    } 
} 

对于这两种解决方案,你理想的输出在布局文件的形式,以尽量减少复制。

layout.phtml:

<?php echo $this->searchForm() ?> 

,并为管理区域页面备用布局admin.phtml。这使您可以灵活地在新需求弹出时更改管理页面。

2
  1. 您可以在控制器插件创建表单并添加它以某种方式查看瓦尔(由前端控制器?),这是在布局访问了。但它在当前ZF的版本太复杂(或者我太愚蠢)

  2. 您可以Form_SearchForm单身

    class Form_SearchForm ... { 
        static function getInstance() { 
          static $instance; 
          if (!$instance) 
           $instance = new Form_SearchForm(); 
          return $instance; 
        } 
    } 
    

    现在不是创建新Form_SearchForm()只是把它作为

    $form = Form_SearchForm::getInstance(); 
    
  3. 你可以把Form_SearchForm的实例注册表

  4. 我可能已经错过了一个非常酷实现方式:)

+0

对不起,你失去了我,你是否介意扩大并为我的新手自我贬低? – 2009-11-22 09:40:32

+0

你更喜欢哪个选项?我不认为我知道正确的方法。但我认为最正确的是第一个,但现在太复杂了。 – 2009-11-22 09:44:40

+0

使一个单独的类很简单,我现在将为此添加一个代码。如何将Form_SearchForm的实例添加到Zend_Registry中,你可以自己找出:) – 2009-11-22 09:45:27

1

我会分裂成部分和占位符。

布局。PHTML:

<?php if($searchForm = $this->placeHolder('searchForm'): ?> 
    <?php echo $searchForm; ?> 
<?php endif; ?> 

然后在你的意见,你可以拨打:

<?php $this->placeHolder('searchForm')->set($this->partial('search-from.phtml', 'search')); ?> 

,如果你想你甚至可以做出基本上没有占位呼叫搜索视图助手。

控制器插件会更好,如果你有更多的页面不需要它比D虽然。我仍然可能使用占位符来完成它。这样,您可以稍后在逐个查看的基础上轻松覆盖或追加它,而无需在前端控制器上调用任何内容。

+0

他将如何使用控制器的表单? – 2009-11-22 10:01:52

+0

你有权访问视图,因此视图助手控制器。 如果你正在谈论的是用Zend_Form实际构造from而不是调用部分助手,你可以调用动作助手去Search_Controller。假设$ view是一个Zend_View实例...并且'form'是输出表单的动作名称... $ view-> placeHolder('searchForm') - > set($ view-> action('表单','搜索','默认)); – prodigitalson 2009-11-22 10:07:44

+0

对不起,我很困惑,我是否必须在每个视图中都有第二个代码片段? – 2009-11-22 10:12:56