Я хочу простую функцию поиска, которая может искать текущие выбранные результаты на индексной странице модели. Я создал модель поиска, которая не имеет никакой фактической таблицы: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 для каждой модели.
Зачем взломали это вместе? Объявите функциональность, которая уже доступна (и в чистом и сухом режиме): https://github.com/CakeDC/search - он использует PRG и хорошие соглашения, которые вы должны использовать. Это также упрощает добавление функций поиска к любому из ваших контроллеров. – mark
Да, я видел это, но это выглядело сложным ... Я уже делал поиск с одной функцией в AppController, а затем просто отбрасывал окно поиска/элемент на любой индексной странице, а страницу индекса затем повторно использовалась для получения результатов. – trafalgar
Его 3 строки кода. это не сложнее, чем то, что вы пытаетесь сделать :) – mark