【问题标题】:zend framework urls and get methodzend 框架 url 和 get 方法
【发布时间】:2010-10-01 08:13:03
【问题描述】:

我正在使用 zend 框架开发一个网站。

我有一个带有 get 方法的搜索表单。当用户单击提交按钮时,查询字符串出现在 url 之后?标记。但我希望它像 url 一样 zend。

有可能吗?

【问题讨论】:

    标签: zend-framework forms get submit


    【解决方案1】:

    除了 JS 方法外,您还可以重定向回您想要的首选 URL。 IE。让表单通过 GET 提交,然后重定向到 ZF 路由样式。

    但是,除非您有充分的理由要为您的搜索查询创建整洁的 URL,否则这太过分了。一般来说,搜索表单应该发送一个 GET 查询,该查询可以添加书签。 URL 中的 ?param=val 样式参数没有任何问题:-)

    ZF URL 有点奇怪,因为它们强制 URL 参数成为主 URL 的一部分。 IE。 domain.com/controller/action/param/val/param2/val 而不是 domain.com/controller/action?param=val&param2=val

    这并不总是你想要的,但似乎是框架使用 URL 参数的方式

    【讨论】:

    • +1 虽然重定向看起来应该是不必要的,但这似乎是要走的路。使用可重用的控制器方法查看我的答案以获得该行为。
    【解决方案2】:

    没有明显的解决方案。 zf 生成的表单将是标准的 html 表单。当使用 GET 从浏览器提交时,它会产生类似的请求

    /action/specified/in/form?var1=val1&var2=var2
    

    获得“zendlike url”(一个带有 / 而不是 ? 或 &)的唯一解决方案是使用 javascript 破解表单提交。例如,您可以监听 onSubmit、中止提交并将浏览器重定向到已翻译的 url。我个人认为这个解决方案不值得增加复杂性,但它应该可以满足您的需求。

    【讨论】:

      【解决方案3】:

      经过一天半的反对,并尽我所能找出正确的方法来做到这一点相当简单,我放弃并做了以下事情。我仍然无法相信没有更好的方法。

      需要这样做的用例是一个简单的记录列表,顶部有一个表单,用于添加一些过滤器(通过 GET),也许是一些列排序,并且 Zend_Paginate 投入使用。我在分页部分中使用 Url 视图助手时遇到了问题,但我怀疑即使只是排序和过滤形式,Zend_View_Helper_Url 仍然会失败。

      但我离题了。我的解决方案是向我的基本控制器类添加一个方法,该方法将任何原始查询字符串参数与现有的 zend 样式斜杠参数合并,并重定向(但仅在必要时)。该方法可以在任何不需要处理 POST 的操作中调用。

      希望有人会发现这很有用。或者更好的是,找到更好的方法:

        /**
         * Translate standard URL parameters (?foo=bar&baz=bork) to zend-style 
         * param (foo/bar/baz/bork).  Query-string style
         * values override existing route-params.
         */
        public function mergeQueryString(){
          if ($this->getRequest()->isPost()){
            throw new Exception("mergeQueryString only works on GET requests.");
          }    
          $q = $this->getRequest()->getQuery();
          $p = $this->getRequest()->getParams();
          if (empty($q)) {
            //there's nothing to do.
            return;
          }
          $action = $p['action'];
          $controller = $p['controller'];
          $module = $p['module'];
          unset($p['action'],$p['controller'],$p['module']);
          $params = array_merge($p,$q);
          $this->_helper->getHelper('Redirector')
                  ->setCode(301)            
                  ->gotoSimple(
                          $action,
                          $controller,
                          $module,
                          $params);
      
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多