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