我必须在CakePHP应用程序中重写一个表单。该表单搜索汽车销售广告列表,并且非常复杂(约10个字段:型号,制造商,燃料类型等)。目前,表单是通过POST
发送的,并且运行良好。问题是我需要从搜索查询中创建可收藏的URL,我想知道实现这一目标的最佳方法是什么。
我尝试将'type' => 'get'
传递给$form->create()
方法,但这会生成类似usercars/search/?model=...&[...]
的网址,导致搜索中断。
我希望网址类似于<some routing>/<Manufacturer>/<Model>/<Fuel>/<etc>
,并且还支持参数省略(即<some routing>/<Manufacturer>
列出来自给定制造商的所有汽车,即使缺少其他参数)。到POST
,目前这有效。如果我只选择其中一个参数,它会给我正确的结果。
我想知道是否有办法确定蛋糕从表单提交中构建好的url并保持与处理控制器中输入的$this->data
方式的兼容性。我已经阅读了文档,但没有找到任何方法来做到这一点。
我已经有两种选择:
$this->data
,使用参数构建一个以搜索方法为目标的路径,并在控制器的beforeFilter()
方法中重定向到对应的URL到路线。你会推荐什么?
答案 0 :(得分:3)
有一种内置的方法可以通过cake的命名参数来实现。因此,如果您将链接结构化为
<强> /控制器/动作/制造商:丰田/型号:普锐斯/ 强>
在您的控制器操作中,它们将在$ this-&gt; passedArgs中显示为一个看起来像这样的关联数组
Array
(
[manufacturer] => toyota
[make] => prius
)
另见:
http://book.cakephp.org/view/46/Routes-Configuration
以下是使用原型在提交时动态创建表单网址的示例(使用原型)。
Event.observe(window, 'dom:loaded', function(e1)
{
$("formid").observe('submit', function(e)
{
this.select(".inputclass").each(function(input)
{
name = input.readAttribute('name')
val = name.match(/data\[.*\]\[(.*)\]/);
if(val && val[1])
{
name = val[1]
}
$("formid").action += "/" + name + ":" + $F(input);
});
return this.submit();
});
});