2014-01-30 4 views
0

Я хочу простую функцию поиска, которая может искать текущие выбранные результаты на индексной странице модели. Я создал модель поиска, которая не имеет никакой фактической таблицы:Simple CakePHP search action

class Search extends AppModel { 

protected $_schema = array(
    'search_term' => array('type' => 'string' , 'null' => true, 'default' => '', 'length' => '255'), 
    'model' => array('type' => 'string' , 'null' => true, 'default' => '', 'length' => '255'), 
); 
public $useTable = false; 
public $validate = array(
    'search_term' => array(
     'notEmpty' => array(
      'rule' => array('notEmpty'), 
      'message' => 'Please enter a search term' 
     ), 
     'between' => array(
      'rule' => array('between',3,30), 
      'message' => 'Please enter a search term greater than 3 characters.' 
     ) 
    ) 
); 

}

В любом представлении index.ctp я это со скрытым полем ввода с именем модели:

echo $this->Form->create('Search, array('action' => 'search')); 
    echo $this->Form->input('search_term', array('label'=> 'Search')); 
    echo $this->Form->input('model', array('type'=> 'hidden', 'value'=>$this->params['controller'])); 
    echo $this->Form->end(__('Submit'));  

В SearchesController:

public function search() { 
$conditions = null; 
if($this->request->is('post')) { 
     $searchModel = $this->request->data[$this->modelClass]['model']; 
     ... 
     $this->{$this->modelClass}->useTable = Inflector::tableize($searchModel); 
    ... 
    $this->paginate = array('conditions'=>array($groups,'OR' => $conditions)); 
    $this->set($searchModel, $this->paginate()); 
    $this->render("/$searchModel/index"); 
} 

Проблема в paginate возвращает массив с моделью l abelled как «Поиск» (по понятным причинам из-за вызова useTable), а не для групп или пользователей, при поиске модели. Любой способ переместить массив, возвращенный из paginate, в обычную модель? Альтернативой является изменение всех файлов index.ctp или создание results.ctp для каждой модели.

+0

Зачем взломали это вместе? Объявите функциональность, которая уже доступна (и в чистом и сухом режиме): https://github.com/CakeDC/search - он использует PRG и хорошие соглашения, которые вы должны использовать. Это также упрощает добавление функций поиска к любому из ваших контроллеров. – mark

+0

Да, я видел это, но это выглядело сложным ... Я уже делал поиск с одной функцией в AppController, а затем просто отбрасывал окно поиска/элемент на любой индексной странице, а страницу индекса затем повторно использовалась для получения результатов. – trafalgar

+0

Его 3 строки кода. это не сложнее, чем то, что вы пытаетесь сделать :) – mark

ответ

1

Я бы не создал другую модель только для поиска; это взломать и не растягивать.

В прошлом я только что использовал параметры (обычно в строке запроса), чтобы изменить массив условий (независимо от того, является ли это нормальной операцией paginate)). Пример:

<?php 
class ItemsController extends AppController { 

    public function index() { 
     $conditions = array(); 

     if (isset($this->request->query['search'])) { 
      $conditions['Item.title'] = $this->request->query['search']; 
     } 

     $items = $this->Item->find('all', array(
      'conditions' => $conditions 
     )); 

     $this->set(compact('items')); 
    } 
} 

Надеюсь, вышеприведенный пример демонстрирует этот подход.

+0

Я использовал массив ('OR' => array ('name LIKE' => $ searchTerm, 'descr LIKE' => $ searchTerm)), но все же возвращает результаты несоответствия ... – trafalgar

Смежные вопросы