5

次のような CakePHP プロジェクトに単純な検索エンジンを設定しました。

<?php 
    echo $this->Form->create("Post", array(
        "action" => "search", 
        "id" => "searchForm"
    ));
    echo $this->Form->input("keyword", array(
        "label" => "",
        "type" => "search",
        "placeholder" => "Recherche..."
    ));
    echo $this->Form->end(); 
?>

コントローラーは次のとおりです。

function search() {
    $keyword = $this->request->data;
    $keyword = $keyword["Post"]["keyword"];
    $cond = array("OR" => array(
        "Post.title LIKE '%$keyword%'",
        "Post.description LIKE '%$keyword%'"
    ));
    $posts = $this->Post->find("all", array("conditions" => $cond));
    $this->set(compact("posts", "keyword"));
}

そして、それはうまく機能します。唯一の問題は、結果をページ分割したいときです。私は単に追加します:

$posts = $this->paginate();

そして、ここに問題があります。これを追加すると、CakePHP はキーワードに一致する投稿だけでなく、すべての投稿を表示します。

だから、もしあなたが解決策を持っているなら、それはいいでしょう:)

4

3 に答える 3

0

最初に条件を保存するためにセッションを使用できます
。フォームを送信すると、条件をセッションに保存し
、次に(ページネーション)セッションから条件を読み取ることができます

example i want to search the products:
Products/search.ctp
<?php
    echo $this->Form->create('Product');
    echo $this->Form->input('keyword');
    echo $this->Form->end(__('Search'));
?>
ProductsController.php
<?php 
class ProductsController extends AppController{

public function search() {
        if ($this->request->is('post')) {
            $keyword = $this->request->data['Product']['keyword'];
            $this->paginate = array(
                'fields' => array('Product.name', 'Product.price', 'Product.created'),
                'order' => array('Product.created' => 'DESC', 'Product.price' => 'DESC'),
                'limit' => 30,
                'conditions' => array('Product.name LIKE' => '%' . $keyword . '%')
            );
            // store array $this->paginate into Session
            $this->Session->write('paginate', $this->paginate);
        }
        $this->paginate = $this->Session->read('paginate');
        $this->set('products', $this->paginate('Product'));
    }
}
于 2014-08-03T07:56:23.450 に答える