0

私はcakephp2.1とcakedc検索プラグインを使用しています。
問題は、それを接着することができないということです。また得た:

Notice (8): Indirect modification of overloaded property ProjectsController::$paginate has no effect [APP\Controller\ProjectsController.php, line 48]

Cakedcチュートリアルに従いましたが、何かが足りません!単純な検索では、何もフィルタリングされません。
名前フィールドでフィルタリングしたい。

私のプロジェクトモデルについて

public $actsAs = array('Search.Searchable');
var $name = 'Project';

public $filterArgs = array(
       array('name' => 'name', 'type' => 'like'),
       array('name' => 'filter', 'type' => 'query', 'method' => 'orConditions'),
);

public function orConditions($data = array()) {
            $filter = $data['filter'];
            $cond = array(
                'OR' => array(
                    $this->alias . '.name LIKE' => '%' . $filter . '%',
                    //$this->alias . '.body LIKE' => '%' . $filter . '%',
                    ));
            return $cond;
        }

私のコントローラーで:

public $components = array('Search.Prg');

public $presetVars = array(
    array('field' => 'name', 'type' => 'value')
);

index.ctpのみを使用するようにインデックス関数が更新されました(検索関数なし)

public function index() {
    $this->Prg->commonProcess();
    $this->Project->recursive = 0;
    // next line causes
    // Notice (8): Indirect modification of overloaded property ProjectsController::$paginate has no effect [APP\Controller\ProjectsController.php, line 48] 
    //$this->paginate['conditions'] = $this->Project->parseCriteria($this->passedArgs);
    $this->set('projects', $this->paginate());
}

view.ctpに検索フォームを追加しました

echo $this->Form->create('Project', array('url' => array_merge(array('action' => 'index'), $this->params['pass'])));
echo $this->Form->input('name', array('div' => false));
echo $this->Form->submit(__('Search', true), array('div' => false));
echo $this->Form->end();

これは私の側の明らかな誤りであるに違いないことを私は知っています、私に耐えてください。誰か助けてもらえますか?

どうもありがとう !

4

1 に答える 1

10

私がcakedc検索プラグインを使用する方法を見つけたことを人々に知らせてうれしいです。

まず、1.3ではこのチュートリアルに厳密に従う必要がありました(最初は2.1では機能しないと思っていましたが、魅力のように機能します)。

http://www.youtube.com/watch?v=FAVuLXFVaCw

そして、ビデオチュートリアルを理解するために、cakedchttp://cakedc.com/eng/downloads/view/cakephp_search_pluginから1.3サンプルコードをダウンロードしまし た。
(readmeの指示に従って実行しようとしましたが、エラーが発生しました致命的なエラー:クラス'ディスパッチャー'が83行目のC:\ wamp \ www \ search \ webroot \ index.phpに見つからないため、コードスニペットを取得して動作させることを選択しました2.1)

私のプロジェクトに戻る:

1.-cakedchttps ://github.com/CakeDC/searchから検索バージョン2.1をダウンロードしました
。ファイルCakeDC-search-2.1-0-g834f79f.zip。

2.-すべてのファイルを/plugins/Search/フォルダーに配置しました

3.-追加

CakePlugin::load('Search');  

/Config/bootstrap.phpの下部に

4.-私のコントローラーで、コンポーネントとpresetVarsを宣言しました(nameというフィールドを使用しています)

public $components = array('Search.Prg');
public $presetVars = array(
    array('field' => 'name', 'type' => 'value'),
    array('field' => 'pr_status', 'type' => 'value'),
);

5.-そして私のインデックス関数を更新しました:

public function index() {
    $this->Prg->commonProcess();
    $this->paginate = array(
        'conditions' => $this->Project->parseCriteria($this->passedArgs));
    $this->set('projects', $this->paginate());
}

6.-私のモデルに追加

        public $actsAs = array('Search.Searchable');

        public $filterArgs = array(
            array('name' => 'name', 'type' => 'query', 'method' => 'filterName'),
            array('name' => 'pr_status', 'type' => 'value'),
        );

        public function filterName($data, $field = null) {
            if (empty($data['name'])) {
                return array();
            }
            $nameField = '%' . $data['name'] . '%';
            return array(
                'OR' => array(
                    $this->alias . '.name LIKE' => $nameField,
                    ));
        }

        // Built a list of search options (unless you have this list somewhere else)
        public function __construct($id = false, $table = null, $ds = null) {
        $this->statuses = array(
                    '' => __('All', true),
                     0 => __('Bid', true),
                     1 => __('Cancelled', true),
                    2 => __('Approved', true),
                    3 => __('On Setup', true),
                    4 => __('Field', true),
                    5 => __('Closed', true),
                    6 => __('Other', true));
         parent::__construct($id, $table, $ds);
         }

7.-最後に、テーブルタグのすぐ上にあるindex.ctpに検索フォームを作成しました

    <div><?php
        echo $this->Form->create('Project', array(
            'url' => array_merge(array('action' => 'index'), $this->params['pass'])
            ));
        echo $this->Form->input('name', array('div' => false, 'empty' => true)); // empty creates blank option.
                echo $this->Form->input('pr_status', array('label' => 'Status', 'options' => $statuses));
        echo $this->Form->submit(__('Search', true), array('div' => false));
        echo $this->Form->end();
    ?>
        </div>

また、2.1を使用していても、1.3のチュートリアルとドキュメントを破棄しないことも学びました。次のステップは、日付とより適切な検索フォームでフィルタリングすることです。

皆さん頑張ってください。

カルロス

于 2012-05-16T16:40:32.450 に答える