Как создать форму поиска в формате Codeigniter URI? - PullRequest
2 голосов
/ 28 апреля 2011

дорогой всем, я новичок в codeigniter,

Я хотел бы попросить совета о том, как создать форму поиска, которая привела бы к URL:

http://domain/class/index/searchvar1/searcvar1val/searchvar2/searchvar2val

форма будет выглядеть следующим образом:

<form action="http://domain/class/index">
   <input name="searchvar1" value="searchvar1val">
   <input name="searchvar2" value="searchvar2val">
   <input type="submit">
</form>

Каков наилучший способ для этого?

Я гуглил, включая сообщения stackoverflow,все еще не могу найти решение.

спасибо:)

~ thisismyfirstposthere

update ::

Я хотел бы подчеркнуть, что моей целью является обработка переменных поиска из строки uri (выше), а не из post vars;так что я думаю, что настройка поиска формы в POST не вариант?:)

обновление (2)

я не думаю, что это можно сделать из коробки в codeigniter, я думаю,клиентской обработки формы vars / vals в действие формы в формате URI с использованием jQuery.здесь будет опубликовано обновление позже.

Ответы [ 3 ]

2 голосов
/ 28 апреля 2011

взглянем на user_guide :

$this->uri->assoc_to_uri()

Принимает ассоциативный массив в качестве ввода и генерирует строку URI из него. Ключи массива будут включены в строка. Пример:

$array = array('product' => 'shoes', 'size' => 'large', 'color' => 'red');

$str = $this->uri->assoc_to_uri($array);

// Produces: product/shoes/size/large/color/red 

и я думаю, что если ваша форма это:

<form action="http://domain/class/index/search">
   <input name="product" value="shoes">
   <input name="size" value="large">
   <input name="color" value="red">
   <input type="submit">
</form>

тогда где-то в контроллере поиска сделай это $this->uri->assoc_to_uri($data); ИМХО выдаст product/shoes/size/large/color/red

1 голос
/ 28 апреля 2011

Эй, ребята, спасибо, что ответили и обсудили, я думаю, что imma идти с потоком:

Вид -> форма -> jquery, при отправке формы: заменить атрибут действия на параметры формы -> контроллер на строку uri -> остальная часть процесса

часть jquery будет выглядеть примерно так

$("#searchFormID").submit(function(){

    // $(this).serialize() outputs param1=value1&param2=value2 string
    // var.replace(regex, string) outputs param1/value1/param2/value2 string
    // newact would be http://localhost/class/index/param1/value1/param2/value2
    var newact = $(this).attr("action") + "/" + $(this).serialize().replace(/&|=/g,"/");

    $(this).attr("action", newact); // or $(this).attr("target", newact);

    return true;
});

Примечания:

  • добавить атрибут id в форму -> для селектора формы в jquery
  • использовать метод post в форме (это значение по умолчанию для codeigniter) -> чтобы URL действия не заполнялся строкой GET
0 голосов
/ 28 апреля 2011

Вы можете включить строки запроса и использовать $_GET. ИМО, это прекрасный пример того, для чего предназначена строка запроса.

Обязательно измените форму на <form method="get" action="http://domain/class/index">

После этого в вашем URL появится строка запроса, например ?searchvar1=value1&searchvar2=value2

Вы можете получить доступ к частям строки следующим образом: $this->input->get('searchvar1')

С помощью метода, который вы используете в настоящее время, если пользователь ищет какие-либо символы, которые не разрешены в вашем $config['permitted_uri_chars'], вам придется много кодировать и декодировать самостоятельно, чтобы убедиться, что строка безопасна / читаема в ваш URL. Класс CI Input позаботится об этом за вас, поэтому я рекомендую.

Другим недостатком поисковых параметров на основе сегментов URI является то, что не существует правильного способа выражения массива, подобного ?values[]=one&values[]=two&values[]=three. Есть обходные пути, чтобы обойти это, но все они именно так: хаки. со временем у вас будут проблемы.

Использование $ _POST очень утомительно и заставляет использовать отправку форм для разбитых на страницы результатов и ссылок, а также гарантирует, что вы не можете ссылаться на результаты поиска или использовать кнопку "Назад" должным образом.

Если вы должны использовать этот метод, просто отправьте сообщение формы на ваш контроллер, прочитайте ввод, а затем redirect() на URL, который вы создадите из него. Littlechad имеет правильную идею для этого метода в его ответ

// This URL:
http://domain/class/index/searchvar1/searcvar1val/searchvar2/searchvar2val

// With this:
$search = $this->uri->uri_to_assoc();

// Produces this:
array(
    'searchvar1'    =>    'searchvarval1',
    'searchvar2'    =>    'searchvarval2',
);

// And you can use it like this:
$arg1 = $search['searchvar1'];
$arg2 = $search['searchvar2'];

Чтобы получить ДО этого URL, вы можете сделать что-то вроде этого с вашей формой поста (в контроллере после поста):

$var1 = $this->input->post('searchvar1');
$var2 = $this->input->post('searchvar2');
redirect('searchvar1/'.urlencode($var1).'/searchvar2/'.urlencode($var2));

Я уверен, что вы можете увидеть, насколько это больше, чем просто использовать проверенную строку запроса ...

...