带有友好URL的CakePHP表单提交

时间:2010-04-04 14:12:44

标签: php http cakephp forms

我必须在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到路线。
  • 在搜索表单页面上执行javascript以构建URL +上述处理方式。

你会推荐什么?

1 个答案:

答案 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();
    });   
});