Codeigniter: реализация фильтров поиска без использования $GET
У меня есть приложение с таблицей "проекты", в которой я хотел бы иметь возможность выполнять поиск. Я бы предпочел использовать существующий метод для вызова модели для получения результатов запроса. Так что мой формат URL сейчас такой example.com/projects/id/slug и для ВСЕГО проекта просто example.com/projects . Я хотел бы иметь форму поиска, которая передает ключевые слова методу в виде строки.
Я знаю, что CI по умолчанию не разрешает $_GET:
Из руководства CodeIgniter по безопасности:
ПОЛУЧИТЬ, ПУБЛИКАЦИЯ и данные файлов COOKIE
ПОЛУЧЕНИЕ данных просто запрещено CodeIgniter, так как система использует Сегменты URI, а не традиционные Строки запроса URL (если у вас не включена опция строки запроса в файле конфигурации). Глобальный массив GET не задается входным классом во время инициализации системы.
Мой вопрос в том, как я могу использовать сегменты URI таким образом с несколькими ключевыми словами?
Могу ли я сделать что-то вроде поиск/ключевое слово+второе ключевое слово+ третье ключевое слово?
С помощью формы можно ли в любом случае получить ключевые слова из текстового поля в указанный выше формат?
Спасибо,
Билли
3 answers
Если бы ты хотел сделать это вот так...
Вы могли бы просто сделать что-то подобное, предполагая, что есть несколько входных сообщений, и они предназначены только для поиска, это может выглядеть примерно так
function search(){
$url = $this->uri->segment(2);
if(empty($url)){
if((isset($_POST) && (!empty($_POST))
{
$search_seg = '';
foreach($_POST as $k => $v){
// I always make sure to use the CI post w/
// TRUE set in the second param so as to XSS filter the user input
$var = $this->input->post($k, TRUE);
// Just incase the user input had a plus in it?
$var = str_replace('+', '%20', $var)
// Concatenate the search string
$search_seg .= $var . '+';
}
// Make the url, use substr() to strip the last + off the end
$search_seg = 'search/' . substr($search_seg, 0, -1);
/* Make sure CI's URL helper is enabled
$this->load->helper('url'); if it hasn't been loaded
This will give the illusion that the form post went to this URL,
thus doing what you're looking for... */
redirect($search_seg, 'location');
}else{
// There was no post, do whatever
}
}else{
$search_arr = explode('+', $url);
}
Вышесказанное должно в значительной степени соответствовать тому, что вы описали, хотя есть способы воссоздать массив $_GET и по-прежнему использовать их с URL-адресами в стиле CI, хотя это немного сложнее
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
Если существует только один поле ввода поиска и, скажем, термины разделены пробелами, тогда вы можете сделать это так (возможно, с некоторой фильтрацией регулярных выражений)... замените цикл foreach($_POST as $k => $v)...
следующим:
$keywordinput = $this->input->post('keywords', TRUE);
$keywordinput = trim($keywordinput);
$keywords = explode(' ', $keywordinput);
foreach($keywords as $word){
if(!empty($word)){
$word = str_replace('+', '%20', $var)
$search_seg .= $word . '+';
}
}
Использование $_POST может быть лучшим вариантом для сложных запросов, но это может сработать, но требует, чтобы URI имел определенный порядок параметров (могут быть лучшие способы)
/*controller/method/params = search/do_search/Ross/Red/Male */
function do_search($name, $colour, $gender)
{
$this->db->or_where('name', $name);
$this->db->or_where('colour', $colour);
$this->db->or_where('gender', $gender);
// etc
}
Не очень расширяемый или гибкий, но для простых поисков этого может быть достаточно.
Если вы хотите, чтобы ваш URL был таким -
search/keyword+secondkeyword+thirdkeyword?
А также хотите, чтобы он был заметен, тогда, я думаю, остается только использовать javascript.
Используя javascript, вы можете задать параметры поиска в url после #, чтобы конечный URL был примерно таким -
search#keyword+secondkeyword+thirdkeyword
Если вы используете этот подход, это означает, что вы будете загружать результаты поиска через ajax ie каждый раз, когда встречается URL-адрес, то вы получите ключевые слова для поиска после хэша из url-адреса с помощью javascript. загружать результаты через ajax и отображать результаты. Если критерии поиска изменены, то каждый раз вам нужно добавлять новое ключевое слово к URL-адресу после хэша с помощью javascript.
Базовый код javascript для получения параметров в URL-адресе после #, как показано ниже -
var parameters = window.location.hash;