2013-04-01 149 views
3

後,我用蛋糕2.3.0。如果我使用POST提交我的形式,選定的表單域結轉但是如果我使用GET提交我的表單,所有的表單字段恢復爲默認值。CakePHP的:「GET」形式不自動填充表單字段提交

有沒有辦法使GET提交工作像POST那樣工作?

這裏是我的contorller:

class ListingsController extends AppController { 
    public function results() { 
     $conditions = array(
      'Listing.Beds >=' => $this->request->query['beds'], 
      'Listing.ListingStatus >=' => $this->request->query['status'], 
     ); 

     $this->paginate = array(
      'conditions' => $conditions, 
     );  

     $this->set('listings', $this->paginate()); 
    } 
} 

這裏是我的觀點是什麼樣子。

echo $this->Form->create(null, array(
    'controller' => 'listings', 
    'action' => 'results', 
    'type' => 'get' 
)); 

echo $this->Form->input('name'); 

$beds = array('1' => '1+', '2' => '2+', '3' => '3+', '4' => '4+', '5' => '5+'); 
echo $this->Form->input('beds', array('options' => $beds)); 

$status = array('Active' => 'Active', 'Pending' => 'Pending', 'ActivePending' => 'Active and Pending'); 
echo $this->Form->input('status', array('options' => $status)); 

echo $this->Form->end('Update'); 

所以基本上,如果我改變'type' => 'get''type' => 'post'它工作得很好。不過,我需要能夠通過GET做到這一點。

感謝

回答

1

嘗試添加該到你的控制器:

$this->request->data = $this->params['url']; 
+0

我試圖在控制器的幾個地方添加這個,但似乎沒有工作。 – bigmike7801

0

使用PRG。結帳this插件。

+0

不PRG只適用於數據「張貼」的情況?我一直想知道爲什麼CakePHP中的'get'表單不會自動傳播相應的查詢數據。儘管在這種情況下,搜索插件可能是一個很好的建議。 – thaJeztah

+0

是的,我建議POST形式。基於GET數據的預填表單並不常見。但是如果你想讓你可以輕鬆製作一個組件來做到這一點。 當使用GET提交表單時,蛋糕特定的煩惱是您的字段名稱通常是形式數據[Foo] [bar]。在URL中有這些會很醜。 – ADmad

+0

對這些字段的'醜陋'格式設置+1(我通常會覆蓋搜索的名稱)。仍然不相信搜索表單'POST',因爲我認爲'POST'(和'PUT')應該保留用於*修改*數據,但這可能是一個意見問題:) – thaJeztah

2

我同意這很煩人(IMO CakePHP應該足夠聰明,根據'類型'自動確定從哪裏獲取數據)。

你必須給請求的「查詢」複製到請求的「數據」;

$this->request->data = $this->request->query; 

不是在我的電腦後面測試它(像往常一樣,大聲笑),但應該可以工作。

+0

我實際上已經試過這個它沒有工作。我能做的是循環遍歷$ this-> request-> query數組,並將這些值傳遞給匹配的$ this-> request->數據。但正如在聊天室中向我指出的那樣,這就是「艱難而沉悶的方式」,可能不應這樣做。 – bigmike7801

+1

顯然(見下面的@ADmad的答案),'官方'的方法是使用PRG,個人而言,這並不'感覺'正確,IMO'搜索'不應該使用'POST'?你當然可以創建一個自定義的formHelper,如果表單類型是'get',它將自動從request-> query中獲取數據。如果正確實施,那聽起來對我來說聽起來不太「意大利麪條」。 – thaJeztah

+0

我同意,搜索感覺應該使用'GET',我不認爲我應該使用插件或組件來做一些看似應該是開箱即用的東西。 CodeIgniter更簡單。 – bigmike7801

0

我最終做的是循環訪問$this->request->query數組,並將這些值傳遞給匹配的$this->request->data

所以我加了這一點:

foreach($this->request->query as $k => $v){ 
    $this->request->data['Listing'][$k] = $this->request->query[$k]; 
} 

最終給了我這個:

class ListingsController extends AppController { 
    public function results() { 

     foreach($this->request->query as $k => $v){ 
      $this->request->data['Listing'][$k] = $this->request->query[$k]; 
     } 

     $conditions = array(
      'Listing.Beds >=' => $this->request->query['beds'], 
      'Listing.ListingStatus >=' => $this->request->query['status'], 
     ); 

     $this->paginate = array(
      'conditions' => $conditions, 
     );  

     $this->set('listings', $this->paginate()); 
    } 
} 

我不會接受這個的答案,雖然我不知道這是不是最佳或建議的方式來做到這一點。但現在它適用於我。

1

我的解決辦法:

$this->params->data = array('Tablefilter' => $this->params->query); 

其中 「Tablefilter」 取決於表單定義(通常是型號名稱)

$this->Form->create('Tablefilter', array('type' => 'get')) 
+0

完美工作。 –

+0

這適用於我: –

0

這個工作對我來說:

$這個 - >請求 - > data ['Cluster'] = $ this-> params-> query; //控制器側

形式定義:

$這 - >形式 - >創建( '羣集',陣列( '類型'=> '得到'));

相關問題