Zend Framework 1 使用 get 传递参数到路由


Zend Framework 1 pass parameters using get to the route

我希望标题听起来不会太混乱,但我不知道如何命名我的问题。

简介:
我正在使用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&param2=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) ;
    }
}

我希望它能帮助你