データベースのユーザーデータに基づいて、テキスト入力ボックス、3つのチェックボックス、およびドロップダウンに事前に選択されたデフォルト値を持つ検索フォームがあります。たとえば、ユーザーがコミューン1に住んでいる場合、ドロップダウンのデフォルト値として1が選択されます。
CakePHPに、その値でフィルタリングされたデータベースで検索を実行し、ページ付けされた結果を返すようにします。送信ボタンを押すと簡単ですが、ユーザーの操作なしでページの読み込み時に検索を実行したいと思います。
さて、コントローラーで、ドロップダウン以外の場所からコミューンの値を取得しようとしました:
if ($this->request->is('post)) {
//Perform normal search with the other input fields included.
} else {
//Do the filtered search only by commune value, which I get from a function.
}
問題は、ページネーションが機能しないことです。これは、ページネーションがGETを使用するために予想されます。ページを変更しようとすると、投稿ではなく、検索条件が再びコミューン値のみの条件に設定され、SQLステートメントでエラーが発生します。
上記の説明が少し面倒で申し訳ありませんが、英語は私の母国語ではないので、失礼します。
別の方法でこれを行う方法の提案が必要です。それは可能ですか?これには簡単な解決策があると思いますが、私はCakePHPを初めて使用するため、理解できないようです。
検索の実行
$conditions = $this->setSearchConditions($this->request->data);
$res = $this->paginate('Ad', array($conditions));
$this->set('res', $res);
//limit is set in public $paginate variable
検索条件の設定
private function setSearchConditions($data) {
$conditions = array();
// $this->log('Search: DATA', 'debug');
//$this->log($data, 'debug');
if ($this->request->is('post)) { //Submit-button is clicked, performing full search
//$this->log('Dette er en post', 'debug');
if ($data['Ad']['searchField']) { //Text searchfield is not empty, adding title or description to search criteria
$this->log('Søkefeltet er ikke tomt', 'debug');
$str_search = '%' . $data['Ad']['searchField'] . '%';
$conditions[] = array(
'OR' => array(
'Ad.title LIKE' => $str_search,
'Ad.description LIKE' => $str_search
)
);
}//if
if ($data['Ad']['commune_id']) { // Commune dropdown is not empty, adding commune_id to search criteria
$conditions[] = array(
'Ad.commune_id' => $data['Ad']['commune_id']
);
}//if
if ($data['Ad']['type_id']) { // Type checkboxes are not empty, adding type_id to search criteria
$orArray = array();
foreach ($data['Ad']['type_id'] as $type) {
$orArray[] = array('Ad.type_id' => $type);
}
$conditions[] = array(
'OR' => $orArray
);
}//if
} else {
$conditions[] = array(
'Ad.commune_id' => $this->getDefaultCommune();
):
}
return $conditions;
}