В этой статье рассказывается, как разбить результаты поиска на страницы с помощью CodeIgniter. Библиотека страниц, доступная в среде CodeIgniter, очень полезна. Это также просто реализовать. Тем не менее, предлагая своим пользователям возможность переходить по страницам после поиска, требуется немного больше работы.
Эта статья является продолжением моей предыдущей статьи, написанной для phpmaster.com, которая охватывает основы разбиения на страницы с помощью CodeIgniter. Вы должны прочитать это в первую очередь, если вы еще этого не сделали.
Итак, мы хотим сделать следующее: мы предоставили нашим пользователям форму поиска, чтобы они могли осуществлять поиск в мировой базе данных, которую мы создали в статье о базовой нумерации страниц.
Результаты этого поиска могут быть небольшими по количеству, но это может также привести к большому количеству записей. Поэтому представление набора результатов в разбивке по страницам создаст более похожий на Google опыт для наших пользователей.
Проблема заключается в том, что из-за отсутствия HTTP-состояния без сохранения состояния, когда пользователь щелкает по ссылкам нумерации страниц, система ломается, потому что мы потеряем условие поиска, введенное пользователем в поле поиска.
Однако есть решение, поэтому давайте посмотрим, как можно разбить результаты поиска на страницы с помощью CodeIgniter 2.1.
Подсчет записей на основе пользовательского поискового запроса
Начнем с модели. Нам нужен способ подсчета количества найденных записей для поиска пользователей. В базовом примере разбиения на страницы получить количество записей было легко. Мы использовали метод count_all библиотеки CodeIgniters ActiveRecord, чтобы получить количество записей в таблице базы данных.
Это не будет делать для наших результатов поиска, хотя. Нам нужно учитывать только количество записей, которые производит поисковый запрос. Это означает, что нам нужен параметр метода, содержащий условие поиска из формы, которую отправил пользователь. Затем мы можем использовать COUNT (*), чтобы получить количество результатов.
Вот метод, который нужно добавить в файл search_model.php. что добьется того что нам нужно
<?php public function search_record_count($searchterm) { $sql = "SELECT COUNT(*) As cnt FROM Country WHERE Continent LIKE '%" . $searchterm . "%'"; $q = $this->db->query($sql); $row = $q->row(); return $row->cnt; }
Здесь вы можете видеть, что мы передаем поисковый запрос, введенный пользователем (мы посмотрим, как мы его получили, чуть позже), а затем мы используем COUNT (*) для выполнения запроса к таблице базы данных «Страна». ».
Новый метод контроллера и термин поиска
В нашем контроллере welcome.php нам нужно добавить новый метод, который мы назовем search. В этом методе мы возьмем значение формы $ _POST’ed из формы поиска:
<?php public function search { $searchterm = $this->input->post('searchterm',TRUE);
Мы используем здесь класс ввода CodeIgniters и его XSS-фильтр, чтобы убедиться, что в форму поиска не введено ничего противного.
Не забудьте позвонить в библиотеку paginate; либо в методе конструктора welcome.php, либо в методе поиска:
$this->load->library("pagination");
Метод поиска в модели
Таким образом, метод поиска должен выполнять поиск по таблице стран на основе переданного поискового термина. Мы также передаем значение $ limit, чтобы определить, откуда в наборе результатов мы должны начинать. Вы можете прочитать о предельном предложении MySQL здесь .
Вот как это выглядит:
<?php public function search($searchterm,$limit) { $sql = "SELECT * FROM Country WHERE Continent LIKE '%" . $searchterm . "%' LIMIT " .$limit . ",20"; $q = $this->db->query($sql); if($q->num_rows() > 0) { foreach($q->result() as $row) { $data[] = $row; } return $data; } else { return 0; } }
Это должно быть довольно понятно. Обратите внимание, что мы установили количество результатов на странице вручную. Это также может быть передано в параметре, если мы хотим.
Вид поиска
Теперь нам нужно создать новое представление с именем search.php. Он может быть в значительной степени идентичен другому, называемому example1.php. Но нам просто нужна форма поиска, которая будет включена:
<form action ="<?=base_url()?>welcome/search" method="post" id="searchform"> Search the database: <input type="text" name="searchterm" id="searchterm" value="<?=$searchterm?>" /> <input type="submit" value="Search >>" id="submit" /> </form>
Добавьте форму поиска в представление example1.php, чтобы выполнить поиск оттуда. Действие формы должно указывать на метод поиска в контроллере приветствия.
Попробуйте выполнить поиск по континенту: (именно так настроен этот пример. Конечно, вы можете изменить вещи для поиска по различным значениям в базе данных).
Вы увидите, как вернется набор результатов, и будет хороший набор ссылок на страницы:
Проблема возникнет, когда вы нажмете на ссылки нумерации страниц. Вы заметите, что запрос больше не работает. Отображаемые результаты будут включать все в таблице.
Так что пошло не так? Проблема в том, что http — это протокол без сохранения состояния. Это означает, что он не может хранить данные между страницами. При нажатии на ссылки страницы повторно отправляются, и значение поиска теряется. Мы можем это исправить, хотя.
Сохранение поискового значения, чтобы результаты разбивались на страницы
Решение простое. Мы будем использовать библиотеку сеансов CodeIgniters, чтобы удерживать поисковый запрос до тех пор, пока мы не будем готовы его уничтожить.
Один из способов решения проблемы — написать метод-обработчик в нашей search_model. Целью метода будет проверка различных состояний, в которых может находиться переменная $ searchterm. Давайте посмотрим на код:
<?php public function searchterm_handler($searchterm) { if($searchterm) { $this->session->set_userdata('searchterm', $searchterm); return $searchterm; } elseif($this->session->userdata('searchterm')) { $searchterm = $this->session->userdata('searchterm'); return $searchterm; } else { $searchterm =""; return $searchterm; } }
Все, что мы делаем здесь: проверяем, установлена ли $searchterm
переменная (потому что пользователь отправил форму поиска), и присваиваем ее сеансу, возвращаем переменную сеанса, если она уже установлена, или возвращаем пустую строку, если ничего не установлено.
Теперь мы можем вызвать этот метод в методе поиска контроллера приветствия:
<?php $searchterm =$this->search_model->searchterm_handler($this->input->get_post('searchterm', TRUE));
так что, когда $searchterm
бы ни находилась переменная, она теперь отслеживается через наше приложение. Это означает, что значение, первоначально введенное пользователем, будет храниться в переменной сеанса. Это будет сохраняться при переходах по ссылкам на страницы нумерации страниц, что гарантирует правильную работу нашей нумерации страниц.
Это предполагает, что вы автоматически загружаете библиотеку сеансов. Если нет, вам нужно будет вызвать его и в методе поиска.
Завершение
Есть еще одна вещь, которую мы можем сделать. Добавьте следующий код в начало метода example1 в контроллере приветствия: $this->session->unset_userdata('searchterm');
Это обеспечит сброс переменной сеанса при запуске нового поиска пользователями.
Итак, в этой статье вы увидели, как можно разбить результаты поиска по базе данных с помощью CodeIgniter. Вы видели, как обеспечить сохранение значения поиска при кликах на странице и как рассчитать количество записей, возвращаемых на лету.
Полностью рабочий пример доступен на Github.