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

时间:2014-11-18 11:44:12

标签: php zend-framework http-post http-get zend-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助手,而是方法部分硬编码,我的表单以编程方式提交(button => jQuery stuff => submit)。这会不会有所作为,我相信它不应该?产品:>

我希望这种行为的任何可能来源都会出现在你面前,因为我现在真的陷入困境,我根本找不到什么错误。

提前致谢!

1 个答案:

答案 0 :(得分:0)

使用GET方法,表单会生成如下网址: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) ;
    }
}

我希望它能帮到你