【发布时间】:2010-10-01 08:13:03
【问题描述】:
我正在使用 zend 框架开发一个网站。
我有一个带有 get 方法的搜索表单。当用户单击提交按钮时,查询字符串出现在 url 之后?标记。但我希望它像 url 一样 zend。
有可能吗?
【问题讨论】:
标签: zend-framework forms get submit
我正在使用 zend 框架开发一个网站。
我有一个带有 get 方法的搜索表单。当用户单击提交按钮时,查询字符串出现在 url 之后?标记。但我希望它像 url 一样 zend。
有可能吗?
【问题讨论】:
标签: zend-framework forms get submit
除了 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¶m2=val
这并不总是你想要的,但似乎是框架使用 URL 参数的方式
【讨论】:
没有明显的解决方案。 zf 生成的表单将是标准的 html 表单。当使用 GET 从浏览器提交时,它会产生类似的请求
/action/specified/in/form?var1=val1&var2=var2
获得“zendlike url”(一个带有 / 而不是 ? 或 &)的唯一解决方案是使用 javascript 破解表单提交。例如,您可以监听 onSubmit、中止提交并将浏览器重定向到已翻译的 url。我个人认为这个解决方案不值得增加复杂性,但它应该可以满足您的需求。
【讨论】:
经过一天半的反对,并尽我所能找出正确的方法来做到这一点相当简单,我放弃并做了以下事情。我仍然无法相信没有更好的方法。
需要这样做的用例是一个简单的记录列表,顶部有一个表单,用于添加一些过滤器(通过 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);
}
【讨论】: