Codeigniter: реализация поисковых фильтров без использования $ _GET - PullRequest
2 голосов
/ 24 января 2011

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

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

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

GET, POST и COOKIE Data

GET данные просто запрещены CodeIgniter, так как система использует Сегменты URI, а не традиционные Строки запроса URL (если у вас нет опция строки запроса включена в вашем конфигурационном файле). Глобальный массив GET отменяется классом Input во время инициализации системы.

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

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

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

Спасибо

Билли

Ответы [ 3 ]

3 голосов
/ 24 января 2011

Если бы вы хотели сделать это так ...

Вы могли бы просто сделать что-то вроде этого, предполагая, что есть несколько входных сообщений, и они предназначены только для поиска, это может выглядеть примерно так

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 . '+';
    }
}
0 голосов
/ 24 января 2011

если вы хотите, чтобы ваш URL был таким -

search/keyword+secondkeyword+thirdkeyword? 

, а также хотите, чтобы он был добавлен в закладки, тогда использование javascript - это единственная оставленная опция, я думаю.

Используя javascript, вы можете установить параметры поиска в URL после #, поэтому окончательный URL будет выглядеть примерно так -

search#keyword+secondkeyword+thirdkeyword

Если вы используете этот подход, это означает, что вы будете загружать результаты поиска через ajax, т.е. каждый раз, когда встречается URL-адрес, тогда вы получите ключевые слова для поиска после хэша от URL-адреса с помощью JavaScript. загрузить результаты через AJAX и отобразить результаты. Если критерии поиска изменены, тогда каждый раз, когда вам нужно добавить новое ключевое слово в URL после хэша, используя javascript.

Базовый код JavaScript для получения параметров в URL после #, как показано ниже -

var parameters = window.location.hash;
0 голосов
/ 24 января 2011

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

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

...