Не использовать параметры $_GET

При работе с CodeIgniter оказывается, что $_GET по умолчанию отключен. Мне интересно, почему это так.

Часто мне нужно создавать очень длинные поисковые запросы. Так, например, у меня есть форма, которая позволяет выполнять поиск в базе данных по N разным полям. В code igniter URL-адрес для отображения результатов поиска будет выглядеть так:

http://mysite.com/field1/field2/field3/.../fieldN-1/fieldN

Таким образом, пример URL будет

http://mysite.com/shopping/toys/educational/age6-8/page1/sortbypriceinascendingorder/

Мне это не особо нравится, потому что:

1) что, если я хочу добавить дополнительные параметры поиска позже, чтобы у нас было что-то вроде:

http://mysite.com/shopping/toys/education/age6-8/page1/sortbypriceinascendingorder/boys-only/in-stock

Мне не нравится, как я добавляю «только для мальчиков» и «в наличии» в конце сегментов страницы/сортировки по URL-адресу. Это неправильно.

2) что делать, если человек не использует «игрушечный» сегмент и «образовательный» сегмент? Тогда URL-адрес выглядит неуклюжим

http://mysite.com/shopping/all_products/all_categories/age6-8/page1/sortbypriceinascendingorder/

Не имеет ли больше смысла использовать параметры $_GET для поиска, потому что тогда порядок, в котором вы размещаете параметры строки запроса (&field=value), не имеет значения? А отсутствие параметра строки запроса автоматически означает «не выбрано».


person John    schedule 17.11.2009    source источник
comment
Очень похоже на: stackoverflow.com/questions/334708/   -  person Ben James    schedule 17.11.2009


Ответы (4)


Вы также можете использовать другой разделитель для параметров поиска, например + (как это делают многие системы). Они передаются на один маршрут контроллера, где вы можете explode() по мере необходимости. Пример: http://http://mysite.com/shopping/toys+education+age8+etc

person Bruce Alderson    schedule 17.11.2009

Во-первых, вы всегда можете включить переменные $_GET, если хотите.

Кроме того, вы можете использовать такие параметры, как ../shopping/type:toys/cat:education/age:6-8/sort:price_asc, а затем анализировать их в коде контроллера:

function shopping() {
  $args = func_get_args();
  foreach ($args AS $arg) {
    list($filter_name, $filter_value) = explode(':', $arg, 2);
    if ($filter_name == 'cat') {
      // set category filter to $filter_value (education)
    } elseif ($filter_name == 'type') {
      // set type filter to toys
    }
    // etc etc
  }
}
person Joel L    schedule 17.11.2009

Причина, ПОЧЕМУ они это делают, заключается в том, что это мешает вызову контроллеров, функций и параметров.

CI использует строку URI, чтобы сообщить «программе», что делать. Вы можете включить режим, который делает это:

www.example.com/controller/method/parameter

в это:

www.example.com/?c=controller&m=methods&p=parameter1&yourgetitem=yourgetvalue

Хотя это не так красиво, но вы наверняка МОЖЕТЕ делать с CI все, что захотите; это просто требует некоторой настройки.

person Alex Mcp    schedule 17.11.2009

В CodeIgniter можно использовать как строки запроса, так и сегменты, вот как:

В config.php установлено:

  • $config['uri_protocol'] = "PATH_INFO";
  • $config['enable_query_strings'] = ИСТИНА;

В .htaccess используйте / после index.php вместо ? в вашем правиле CI: RewriteRule ^(.*)$ index.php/$1 [L]

person bradym    schedule 18.11.2009