CakePHP основная помощь в использовании поискового плагина cakedc
Я использую cakephp 2.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();
Я знаю, что это должно быть какой-то очевидной ошибкой с моей стороны, пожалуйста, потерпите меня. Кто-нибудь может помочь?
Большое спасибо!
1 ответ
Я рад сообщить людям, что я нашел способ использовать поисковый плагин cakedc.
Сначала я должен был внимательно следовать этому уроку для 1.3 (сначала я думал, что он не подойдет для 2.1, но работает как шарм).
http://www.youtube.com/watch?v=FAVuLXFVaCw
И скачал пример кода 1.3 с cakedc http://cakedc.com/eng/downloads/view/cakephp_search_plugin
чтобы понять видео урок. (попытался запустить его, следуя инструкциям readme, но получил ошибку. Неустранимая ошибка: класс 'Dispatcher' не найден в C:\wamp\www\search\webroot\index.php в строке 83, поэтому решил просто получить фрагменты кода и заставить их работать в 2,1)
Вернуться к моему проекту:
1.- Скачал поисковую версию 2.1 с cakedc https://github.com/CakeDC/search,
файл 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>
Я также научился не отказываться от учебников и документации 1.3, хотя я использую 2.1. Следующим шагом является фильтрация по датам и более удобная форма поиска.
Всем удачи.
Carlos