我希望标题听起来不会太混乱,但我不知道如何命名我的问题。
简介:
我正在使用Zend 1.1X
目前我一直在使用搜索表单,通过POST发送一些参数。
现在我必须将其更改为使用GET,我创建的路线看起来类似于:
"search/what/:what/shape/:shape"
等等,我还有2个可选参数,默认为null。
我正在尝试在表单的操作中生成一个URL(使用Zend View Helper Url),但它会引发异常:
Uncaught exception 'Zend_Controller_Router_Exception' with message what is not specified
我现在不知道该怎么办。如果我将路线更改为“仅搜索”,则会正确发送表单,但我最终会使用"search?what=XXXX&shape=YYYY"
而不是"search/what/XXXX/shape/YYYY"
。
有什么方法可以按我喜欢的方式处理???产品:>
@EDIT
我认为这也应该被提及 - 我有一个不同的形式,类似的形式,指向没有指定参数的路线,并且uri被“翻译”为“键/值”对的形式。它们之间的唯一区别是第一个不使用Url助手,而是方法部分硬编码,我的表单以编程方式提交(button => jQuery stuff => submit)。这会不会有所作为,我相信它不应该?产品:>
我希望这种行为的任何可能来源都会出现在你面前,因为我现在真的陷入困境,我根本找不到什么错误。
提前致谢!
答案 0 :(得分:0)
使用GET
方法,表单会生成如下网址:action?param1=val1¶m2=val2&....
我看到两种解决方案:
第一个是通过javacsript重新生成URL,我们可以想象这样的事情:
<form method="get" id="id_form">
....
</form>
<script>
var objet_form = document.getElementById('id_form');
function gestionclic(event){
var url = objet_form.action;
for(var i = 0; i < objet_form.length; i++){
url += "/" + objet_form[i].name + "/" + objet_form[i].value;
}
objet_form.action = url;
}
if (objet_form.addEventListener){
objet_form.addEventListener("submit", gestionclic, false);
} else{
objet_form.attachEvent("onsubmit", gestionclic, false);
}
</script>
但我不认为这是一个很好的解决方案。
第二种是使用插件来管理它:
对于插件,必须在bootstrap
中声明。
例如:
public function _initPlugins(){
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Application_Plugin_PRoutage());
}
使用此示例,application/plugins
文件夹,创建PRoutage.php
插件,如下所示:
class Application_Plugin_PRoutage extends Zend_Controller_Plugin_Abstract
{
public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
{
...
}
}
使用变量$request
,您可以使用$request->getParams()
作为数组访问您的数据。
我们可以想象这样的事情:
public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
{
$param = $request->getParams();
$what = "";
$shape = "";
if (isset($param['what']) $what = $param['what'];
if (isset($param['shape']) $shape = $param['shape'];
if ($what == "XXXX" && $shape == "YYYY"){
$request->setControllerName('other_controler')
->setActionName('other_action')
->setDispatched(true) ;
}
}
我希望它能帮到你