Cakephp - Поиск по индексу - PullRequest
       6

Cakephp - Поиск по индексу

0 голосов
/ 12 сентября 2018

У меня есть вопрос о том, как я могу искать, например, по имени или фамилии в представлении INDEX. Есть ли какой-нибудь плагин или простой в использовании компонент, который не слишком загружает приложение?

В настоящее время у меня есть небольшая форма в index.ctp с одним полем ввода, где я ввожу то, что хочу найти, и в контроллере есть if ($ this-> request-> is ('post') )) после чего к $ this-> Model-> find добавляется условие WHERE. Но я признаю, что это не очень хороший способ, он также перезагружает страницу.

Это контроллер:

public function index()
{
    if ($this->request->is('post')) {
        $s = '%'.$this->request->getData('Search').'%';
        $students = $this->Students->find('all')->where(['OR' => ['name LIKE' => $s, 'lastname LIKE' => $s]]);
        $this->set('students', $this->paginate($students));
    } else {
        $students = $this->paginate($this->Students);
        $this->set(compact('students'));
    }
}

И это index.ctp:

<div class="input-group mb-3">
    <?= $this->Form->button(__('<i class="fas fa-search"></i>'), ['escape' => false, 'class' => 'btn btn-primary']) ?>
    <?= $this->Form->input('Search', ['type' => 'text', 'class' => 'form-control', 'label' => false]); ?>
    <?= $this->Form->end() ?>
</div>

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

установить плагин https://github.com/FriendsOfCake/search

затем в настройках поиска

$this->searchManager()
     // Here we will alias the 'q' query param to search the `Students.name`
     // field and the `Students.lastname` field, using a LIKE match, with `%`
            // both before and after.
            ->add('q', 'Search.Like', [
                'before' => true,
                'after' => true,
                'fieldMode' => 'OR',
                'comparison' => 'LIKE',
                'wildcardAny' => '*',
                'wildcardOne' => '?',
                'field' => ['name', 'lastname']
            ]);
0 голосов
/ 12 сентября 2018

Из того, что я вижу, вы либо нашли лучшее решение для поиска, и / или способ не перезагружать страницу для отображения результатов поиска. Если это не то, что вам нужно, уточните свой вопрос, чтобы лучше описать, как бы вы хотели, чтобы ваше решение выглядело.

Вы должны отделить свой поиск от индексной функции, поскольку она предназначена только для отображения содержимого на этой странице. Добавление таких условий приведет к тому, что у вас будет действительно длинная индексная функция, выполняющая все ваше приложение на основе различий в запросе, что не очень хорошо.

Разделите поиск на отдельную функцию, которая, в свою очередь, создаст новую страницу для отображения результатов.

public function index()
{
    $students = $this->paginate($this->Students);
    $this->set(compact('students'));
}

public function search()
{
    $s = '%' . $this->request->getData('Search') . '%';
    $students = $this->Students->find('all')->where(['OR' => ['name LIKE' => $s, 'lastname LIKE' => $s]]);
    $this->set('students', $this->paginate($students));
}

Это хорошо описано в учебнике по документации CakePHP - CMS Tutorial - Создание контроллера статей и может быть связано с вашим приложением, поскольку индекс для вас содержит форму для передачи критериев поиска в ваше приложение. и функция / страница поиска затем извлечет результаты и отобразит их для вас.

Не забудьте затем изменить форму, чтобы она указывала на страницу /search. - Настройка URL для формы

Вам потребуется создать файл search.ctp в папке src / Template / ExampleController. Поместите туда свой HTML-код, чтобы отобразить результаты в виде таблицы или, если хотите, результаты поиска.

Наконец, вам нужно будет добавить маршрут в ваш route.php, чтобы разрешить путь /search в вашем приложении.

$routes->connect('/search', ['controller' => 'Example', 'action' => 'search']);

Теперь, если вы не хотите, чтобы страница перезагружалась при использовании формы, вам нужно использовать Ajax и JS / JQuery, чтобы выполнить запрос к вашему методу поиска и динамически отобразить результаты функции поиска на странице. Уже есть много хороших примеров этого в stackoverflow и в Интернете для использования ajax и jquery для построения таблиц из поисков, поэтому я не буду публиковать их здесь.

Если вы хотите решение с плагином / библиотекой, посмотрите этот учебник, чтобы результаты поиска отображались в таблице с использованием DataTables. - Поиск с использованием таблиц данных

...