2010-09-10 25 views
3

我有一个表格,由Zend_Form生成,与方法= GET用于搜索与元件记录如下:的Zend避免在GET参数提交按钮值在URL

[表格] 用户名[INPUT TYPE =”文本”名称=‘UNAME’] [输入类型=‘提交’价值=‘搜索’NAME =‘搜索’] [/表格]

表格后提交的所有GET参数一起提交按钮价值出现在网址中。

http://mysite.com/users/search?uname=abc&search=Search

如何避免提交按钮值出现在网址是什么?定制路由解决方案?

回答

0

在表示表单动作的控制器中,重定向到仅包含相关参数的另一个控制器(或同一个控制器)。

伪代码:

$params = $this->getRequest()->getParams(); 
if isset($params['search']) 
    unset($params['search']); 
    return $this->_helper->Redirector->setGotoSimple('thisAction', null, null, $params); 

handle form here 

这基本上是相同的想法,只是你要修改的请求(通过取消参数)在不同的阶段之间,而不是做一些持续性(图像Post/Redirect/Get该Wiki页面显示将数据插入到数据库中)。

如果我是你,我会把它留在。IMO不值得向Web服务器提出额外的请求。

+0

我认为zend框架中可能存在一些已经存在的代码或功能。谢谢.... – adithya 2010-09-10 16:21:48

+0

@adithya:您可以在搜索结果页上始终有一个文字链接,标明“您已经搜索了dogs”以保留某种干净网址的功能。但请检查Google,例如非常难看的网址。 – chelmertz 2010-09-10 21:13:28

3

当表单被提交时,其所有元素及其名称和值都成为GET/POST查询的一部分。因此,如果你不想让一个元素出现在你的GET - 查询中,你所要做的就是创建这个没有名字的元素。这可能不是最好的方法,但是因为我们在谈论'提交'元素,所以我想这并不重要。

看着Zend_View_Helper_FormSubmit助手,你可以看到它正在创建'submit'元素并设置它的名字。所以,可能的解决方案是创建自己的视图助手,并使用它来呈现'submit'元素而不是默认助手。

您可以设置自定义的助手与

$element->setAttribs(array('helper' => 'My_Helper_FormSubmit')); 
1

然后建立自己的表单元素类,并从与preg_replace函数的元素中删除的name属性。它的美妙之处在于,它不会干扰其他装饰者。

所以是这样的:

class My_Button extends Zend_Form_Element_Submit 
{ 
    public function render() 
    { 
     return preg_replace('/(<input.*?)(name="[^"]*")([^>]*>)/', "$1$3", parent::render(), 1); 
    } 
} 
4

当你创建你的元素,你可以简单地删除name属性自动设定在创建

$submit = new Zend_Form_Element_Submit('search')->setAttrib('name', ''); 

或者内部Zend_Form

// Input element 
$submit = $this->createElement('submit', 'search')->setAttrib('name', ''); 

// Or Button element 
$submit = $this->createElement('button', 'search')->setAttribs(array 
(
    'name' => '', 'type' => 'submit', 
); 
+0

这应该是被接受的正确答案(如果只有一个表单提交)。 – Armin 2015-02-09 09:40:24

1

您可以在javascript中删除用于提交按钮的名称属性。 jQuery示例:

$('input[name="submit"]').removeAttr('name');