Codeigniter: реализация фильтров поиска без использования $GET


У меня есть приложение с таблицей "проекты", в которой я хотел бы иметь возможность выполнять поиск. Я бы предпочел использовать существующий метод для вызова модели для получения результатов запроса. Так что мой формат URL сейчас такой example.com/projects/id/slug и для ВСЕГО проекта просто example.com/projects . Я хотел бы иметь форму поиска, которая передает ключевые слова методу в виде строки.

Я знаю, что CI по умолчанию не разрешает $_GET:

Из руководства CodeIgniter по безопасности:

ПОЛУЧИТЬ, ПУБЛИКАЦИЯ и данные файлов COOKIE

ПОЛУЧЕНИЕ данных просто запрещено CodeIgniter, так как система использует Сегменты URI, а не традиционные Строки запроса URL (если у вас не включена опция строки запроса в файле конфигурации). Глобальный массив GET не задается входным классом во время инициализации системы.

Мой вопрос в том, как я могу использовать сегменты URI таким образом с несколькими ключевыми словами?

Могу ли я сделать что-то вроде поиск/ключевое слово+второе ключевое слово+ третье ключевое слово?

С помощью формы можно ли в любом случае получить ключевые слова из текстового поля в указанный выше формат?

Спасибо,

Билли

Author: iamjonesy, 2011-01-24

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 . '+';
    }
}
 3
Author: tgriesser, 2011-01-28 00:23:24

Использование $_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
}

Не очень расширяемый или гибкий, но для простых поисков этого может быть достаточно.

 0
Author: Ross, 2011-01-24 15:11:38

Если вы хотите, чтобы ваш 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;
 0
Author: Alpesh, 2011-01-24 18:07:55