2011-01-24 2 views
2

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

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

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

GET, POST и COOKIE данных

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

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

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

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

Спасибо,

Билли

ответ

3

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

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

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

спасибо Я собираюсь попробовать на этом – iamjonesy

+0

Хотя, как я мог бы получить входной текст в Ури? Если я использую GET, тогда он выйдет как? Keywords = – iamjonesy

+0

не используйте GET, используйте POST. точка выше: если вы используете приведенный выше код и используете action = "www.yoursite.com/search/" method = "POST", тогда он будет использовать ключевые слова, разделить их на + и затем перенаправить на полный uri , который вы можете использовать, чтобы показать все, что вы хотите показать, правильному uri ... просто прочитайте пример и поймите, как это работает – tgriesser

0

с помощью $ _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

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

search/keyword+secondkeyword+thirdkeyword? 

, а также хотите быть bookmarkable затем с помощью JavaScript является единственным возможным вариантом я думаю.

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

search#keyword+secondkeyword+thirdkeyword 

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

Basic Javascript код, чтобы получить параметры в URL после #, как показано ниже -

var parameters = window.location.hash; 
Смежные вопросы