2010-10-10 31 views
2

我通常在一个动作中实例化我的表单,这是我在提交时处理它们的地方。然后,我将它们传递到视图并像平常一样输出它们。zend_form:我应该在布局中使用一个右侧

此表单(搜索框)不同,因为它不是单个页面的一部分。它必须在任何地方都可见。我已经将它作为模板layout.phtml的一部分,并在那里实例化并访问它。

$search = new SearchForm(); 
echo $search; 

表格打印出来的不错,但现在的问题是我在哪里处理此表单。我通常在动作中有这样的处理代码..

if ($this->_request->isPost()) { 
     //and form is valid 
     //process the data    
    } 

但是由于此表单是通用的,因此没有任何操作。我该如何处理?

我应该:

  • 为它创建一个假动作(这是没有意义的,因为形式是无处不在)
  • 或者我应该把处理代码对入layout.phtml(其我认为是不好的MVC练习,因为我现在正在混合处理表单和视图)。

我该怎么办?对此有何建议?

+1

你是否已将窗体instatiation放在视图中?听起来有点奇怪。也许插件是最好的方法。此外,你可以使用queryAction来创建一个searchController来处理...你有一个sigle结果页面吗? – 2010-10-10 07:01:54

+0

*(相关)* [使用动作助手实现可重用广告](http://weierophinney.net/matthew/archives/246-Using-Action-Helpers-To-Implement-Re-Usable-Widgets.html) – Gordon 2010-10-10 10:09:11

回答

5

当然,搜索将需要一些处理代码来建立结果,所以我会创建一个通用的(如在你的IndexController上)这个动作并指向这个表单。即使表单在每个页面上,您都可以将它指向特定的网址(如/ search /),这是完全正确的。

否则,您可以创建一个控制器插件,检查请求以查看它是否已提交,然后运行处理代码。

+1

我宁愿创建一个专用控制器,而不是通用函数。它不会受到伤害,如果有必要,您仍然可以从那里重定向到其他控制器。控制器插件+1。 – Gordon 2010-10-10 10:09:33

+0

是的,一个URL /控制器来处理提交。例如:如果它是出现在网站布局中的登录表单,则可以在'AuthController :: loginAction()'处理它。 – 2010-10-10 11:19:09

相关问题