2010-04-04 31 views
2

我必須在CakePHP應用程序中重寫表單。該表格搜索汽車銷售廣告列表,並且非常複雜(~10個領域:模型,製造商,燃料類型等)。目前,該表格通過POST發送,工作得很好。問題是我需要從搜索查詢中創建可收藏的網址,我在想什麼是完成此操作的最佳方法。用友好的URL提交CakePHP表單提交

我嘗試將'type' => 'get'傳遞給$form->create()方法,但這會生成一個類似於usercars/search/?model=...&[...]的URL,並導致搜索中斷。

我希望URL類似於<some routing>/<Manufacturer>/<Model>/<Fuel>/<etc>,也支持參數省略(即<some routing>/<Manufacturer>列出來自給定製造商的所有汽車,即使其他參數丟失)。由POST,目前這個工程。如果我只選擇其中一個參數,它會給我正確的結果。

我不知道是否有任何方法來確定蛋糕從表單提交中建立漂亮的網址,並保持與控制器中處理輸入的方式的兼容性。我已經通過了文檔,並沒有找到任何方法來做到這一點。

我已經有兩個選擇:

  • 重寫控制器行動來支持,而不是與$this->data工作,構建目標與PARAMS搜索方法的路線,做在控制器的beforeFilter()方法的重定向功能參數到與路線相對應的URL。
  • 在搜索表單頁面上執行javascript以構建URL +上面的處理方式。

你會推薦什麼?

回答

3

有一種內置的方式來通過蛋糕的命名參數來做到這一點。所以,如果你構建你的鏈接看起來像

/控制器/動作/製造商:豐田/型號:普銳斯/

在你的控制器動作,他們將提供$這個 - > passedArgs作爲關聯數組看起來像這樣

Array 
(
    [manufacturer] => toyota 
    [make] => prius 
) 

參見:

http://book.cakephp.org/view/46/Routes-Configuration

這是一個使用原型來動態創建提交表單url的示例(使用原型)。

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(); 
    }); 
}); 
+0

感謝您的回答;)。你有什麼想法如何讓表單提交給_that_網址? – 2010-04-05 23:28:01

+1

您必須以通常的方式提交表格。然後在控制器操作中,您必須將提交的數據「翻譯」爲友好的網址並重定向到該網址。 – dhofstet 2010-04-06 05:09:57

+0

是的,你可以做到如何dhofster建議。這裏有一篇描述這種方法的麪包店文章: http://bakery.cakephp.org/articles/view/form-posting-with-_get-parameters 我推薦使用該組件,如果你要去那條路線。如果您希望避免在每個表單提交中進行重定向,則可以使用javascript在表單提交中動態創建操作url。我在原始答案中添加了一個javascript(原型)示例。 – JoeyP 2010-04-06 15:16:29