0

データベースのユーザーデータに基づいて、テキスト入力ボックス、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;
}
4

1 に答える 1

1

CakeDC検索プラグインを試し(最初の質問のMarksコメントへの回答を参照)、同様の質問を電子メールで送信しました。解決策は、デフォルトの検索条件で配列を設定し、それを検索条件とマージすることでした。コントローラコードは次のとおりです。

public function view() {
    $this->set('title_for_layout', 'Localtrade Norway');
    $this->set('show_searchbar', true); //Shows searchbar div in view
    $this->log($this->request->data, 'debug');

    //Setting users home commune as default filter when the form is not submitted.
    $default_filter = array(
        'Ad.commune_id' => $this->Auth->user('User.commune_id')
    );

    $this->Prg->commonProcess(); //Search-plugin
    $this->paginate = array(
        'conditions' => array_merge($default_filter, $this->Ad->parseCriteria($this->passedArgs)), //If Ad.commune_id is empty in second array, then the first will be used.
        'fields' => $this->Ad->setFields(),
        'limit' => 3
    );
    $this->set('res', $this->paginate());
}
于 2013-03-01T18:07:40.907 に答える