我希望标题听起来不会太混乱,但我不知道如何命名我的问题。
简介:
我正在使用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 帮助程序,而是对方法部分进行了硬编码,并且我的表单以编程方式提交(按钮 => jQuery 东西 => 提交)。这是否会在这里产生影响,因为我认为它不应该?:>
我希望这种行为的任何可能来源都能找到你,因为我现在真的被困住了,我根本找不到问题所在。
提前感谢!
使用 GET
方法,表单生成如下所示的 url: 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) ;
}
}
我希望它能帮助你