Comments 43
все предельно просто и работает. в лучших традициях CI
+2
хотя думаю через регулярные выражения было бы изящнее. а еще лучше через parse_url
$parsed_url = parse_url($url);
if($parsed_url['query'])
parse_str($parsed_url['query'], $parsed_url['query']);
$this->_get_params = $parsed_url['query'];
вернет нам нужный массив
$parsed_url = parse_url($url);
if($parsed_url['query'])
parse_str($parsed_url['query'], $parsed_url['query']);
$this->_get_params = $parsed_url['query'];
вернет нам нужный массив
0
Есть такая функция, parse_str
+2
UFO just landed and posted this here
> По моему мнению, это не совсем правильно отказаться от get, т. к. мы не можем
> сделать универсальный pager (кто сталкивался, думаю, поймет)
Хоть я и не писал ничего на CodeIgniter (хотя немного копался в нем), но не могу понять, почему вышеописанного сделать нельзя?
Например, сортировка. Разве нельзя обработать такие URI:
/products/by_date/
/products/by_name/
/products/by_cost/
или это противоречит концепции (или роутинг не умеет этого), и надо писать так:
/products?sort_by=date
/products?sort_by=name
/products?sort_by=cost
Расскажите кто знает. Я честно, не вижу тут подводных камней.
> сделать универсальный pager (кто сталкивался, думаю, поймет)
Хоть я и не писал ничего на CodeIgniter (хотя немного копался в нем), но не могу понять, почему вышеописанного сделать нельзя?
Например, сортировка. Разве нельзя обработать такие URI:
/products/by_date/
/products/by_name/
/products/by_cost/
или это противоречит концепции (или роутинг не умеет этого), и надо писать так:
/products?sort_by=date
/products?sort_by=name
/products?sort_by=cost
Расскажите кто знает. Я честно, не вижу тут подводных камней.
0
Решение конечно через Ж возможно, но опубликую кусок кода из своего:
… какой-то код
$url = $_SERVER['QUERY_STRING'];
parse_str($url, $url);
unset($url[$conf['query_string_name']]); // $conf['query_string_name'] — имя get-запроса (по дефолту page)
$url = $base_url.'?'.http_build_query($url).$conf['query_string_name'].'='; //засовуем page= в конец
… генерация ссылок
… какой-то код
$url = $_SERVER['QUERY_STRING'];
parse_str($url, $url);
unset($url[$conf['query_string_name']]); // $conf['query_string_name'] — имя get-запроса (по дефолту page)
$url = $base_url.'?'.http_build_query($url).$conf['query_string_name'].'='; //засовуем page= в конец
… генерация ссылок
0
Ещё ЧПУчнее вот так вот: /news/{PageNumber}/ — вместо {PageNumber} номер страницы конечно же. Я уже года 4 так делаю и знаю приличное количество людей кто делает так же. На мой взгляд такие вот ссылки:
/news/2/ = /news/{PageNumber}/
/news/2008/january/30/ = /news/{Year}/{Month}/{Day}/
/users/Fenix/billing/ = /users/{NickName}/billing/
гораздо читабельнее, чем когда мы приплетаем к нормальной ЧПУ ссылке гет параметры доисторические.
Я не буду приводить пример решения для таких ссылок, думаю все без труда итак догадаются, ну а если нет, то если будут желающие могу написать статью про то как надо делать действительно ЧПУчные ссылки и какие имеются способы решения этой задачи.
Чтобы сразу избавиться от вопросов типа «а если я хочу 10 фильтров, а надо мне один и я вообще не понимаю что я хочу», отвечу сразу: если вы не знаете что вы хотите от этой ссылки, то надо задуматься о том что что-то не так вы придумали на данной странице :) Таких неопределённостей впринципе возникать недолжно и это должно служить неким сигналом непродуманности решения. По моему мнению ссылка вообще не должна являться транспортом данных, это только лишь некий идентификатор некоего обработчика, возможно параметризованный, но в разумных пределах, а данные надо передавать формами, объектами и тд, но явно не ссылками — мы ведь уже в 21 веке.
Вообщем, если кто-то не согласен что так удобнее, буду рад выслушать контраргументы.
/news/2/ = /news/{PageNumber}/
/news/2008/january/30/ = /news/{Year}/{Month}/{Day}/
/users/Fenix/billing/ = /users/{NickName}/billing/
гораздо читабельнее, чем когда мы приплетаем к нормальной ЧПУ ссылке гет параметры доисторические.
Я не буду приводить пример решения для таких ссылок, думаю все без труда итак догадаются, ну а если нет, то если будут желающие могу написать статью про то как надо делать действительно ЧПУчные ссылки и какие имеются способы решения этой задачи.
Чтобы сразу избавиться от вопросов типа «а если я хочу 10 фильтров, а надо мне один и я вообще не понимаю что я хочу», отвечу сразу: если вы не знаете что вы хотите от этой ссылки, то надо задуматься о том что что-то не так вы придумали на данной странице :) Таких неопределённостей впринципе возникать недолжно и это должно служить неким сигналом непродуманности решения. По моему мнению ссылка вообще не должна являться транспортом данных, это только лишь некий идентификатор некоего обработчика, возможно параметризованный, но в разумных пределах, а данные надо передавать формами, объектами и тд, но явно не ссылками — мы ведь уже в 21 веке.
Вообщем, если кто-то не согласен что так удобнее, буду рад выслушать контраргументы.
0
дело в том что если допустим есть фильтр в вписке, то я могу некоторые поля выбрать а некоторые могу не выбрать, тогда Ваш способ немножечко не подходит, так как урл на одну и ту же страницу может состоять из разных урлов в зависимости от фильтра
допустим список товаров:
1 — весь список
2 — весь список красных товаров
3 — только товары с картинками
4 — только красные товары с картинками с 5 страницы
итд…
допустим список товаров:
1 — весь список
2 — весь список красных товаров
3 — только товары с картинками
4 — только красные товары с картинками с 5 страницы
итд…
0
А зачем ссылки на всё подряд? Это я считаю уже лишнее, информацию фильтра не надо помещать в ссылку. Фильтруйте через аякс, или через обновление страницы с передачей формы, но зачем ссылки-то загрязнять? Смысл чпу в том-то и заключается, чтобы ссылки были простыми и запоминаемыми. Такие ссылки предназначены для того чтобы их набрать можно было, запомнить, продиктовать. Всё остальное отметать надо как ненужный хлам, ИМХО.
0
я был бы благодарен за статью как делаются действительно ЧПУшные ссылки, причем с вариациями как я написал выше
0
мне в голову приходит передача ссылки с параметром для поиска:
yandex.ru/yandsearch?text=%D1%85%D0%B0%D0%B1%D1%80%D0%B0%D1%85%D0%B0%D0%B1%D1%80&clid=14585
мне не нада объяснять адресату, что он должен зайти на яндекс ввести запрос и нажать на кнопку Найти
yandex.ru/yandsearch?text=%D1%85%D0%B0%D0%B1%D1%80%D0%B0%D1%85%D0%B0%D0%B1%D1%80&clid=14585
мне не нада объяснять адресату, что он должен зайти на яндекс ввести запрос и нажать на кнопку Найти
0
на хабре заметьте тоже гет используется для поиска ;)
0
Ну да, не отрицаю, есть такие случаи конечно-же, но здесь уже и о ЧПУ не надо говорить. Я к чему: если делаете ЧПУ ссылки, то не надо их обезображивать кучей гет параметров и называть это ЧПУ :) В таких случаях и я делаю вынесенный обработчик с гет запросом, хотя я уже давно так не делал, последний раз я сделал просто на странице с фильтром по вакансиям кнопку «получить ссылку», и пользователь мог передать ссылку на свою фильтрацию кому-нибудь другому. Таким образом наверху была красивая ссылка, фильтрация делалась по аякс, а передать можно было ссылку на отдельный обработчик, который читал данные, помещал в сессию и перекидывал на страницу фильтра вакансий, где по этим данным проводилась соответствующая фильтрация и данные очищались. Единственное что клиенту не понравилась идея с кнопкой такой и пришлось её убрать :( а такая фича классная.
0
а чем вам не нравится подход зенда к этому?
они просто удлинили чпу, вставив туда и ключи
someurl.com/products/page/4/field/title/order/up/page/4
я понимаю это выглядит длинней, но выглядит как полноценное чпу да и обрабатывается просто :)
они просто удлинили чпу, вставив туда и ключи
someurl.com/products/page/4/field/title/order/up/page/4
я понимаю это выглядит длинней, но выглядит как полноценное чпу да и обрабатывается просто :)
+1
никто не говорил, что не нравится. Я к сожалению не знаю зенд, но для вашего url в ci требуется хитрый парсер
0
В Zend если не задавать маршруты получиться:
Будет вызван index action в контроллере products и page =
Будет вызван index action в контроллере products и page =
0
не знаю насчет хитрого парсера, но понять что пришло можно элементарно (в идеальном варианте):
domain.com/model/controller/action/key1/value1/key2/value2/key3/value3/… итд
там используется мвц и поэтому первые 3 (опять же идеальный вариант) параметра заняты поумолчанию
не думаю что такой урл трудно будет разобрать, хотя я не пытался :) за меня все делает зенд
domain.com/model/controller/action/key1/value1/key2/value2/key3/value3/… итд
там используется мвц и поэтому первые 3 (опять же идеальный вариант) параметра заняты поумолчанию
не думаю что такой урл трудно будет разобрать, хотя я не пытался :) за меня все делает зенд
0
Не знаю по теме ли :) но все же не понимаю зачем столько движений.
Все решается добавлением параметра [QSA] в .htaccess
RewriteRule ^catalog\/([a-z0-9_]+)(\/?)$ /catalog.php?alias=$1 [QSA]
И ссылка вида /catalog/abc/?p=1 передаст GET параметр при работающем ModRewrite
Все решается добавлением параметра [QSA] в .htaccess
RewriteRule ^catalog\/([a-z0-9_]+)(\/?)$ /catalog.php?alias=$1 [QSA]
И ссылка вида /catalog/abc/?p=1 передаст GET параметр при работающем ModRewrite
0
@параметры (например ?c=stationery&act=contacts), либо использовать ЧПУ (например stationery/contacts), но тогда мы не можем передавать в url get параметры@
Все прекрасно передается, вы ошибаетесь.
Все прекрасно передается, вы ошибаетесь.
0
А что мешает сделать ссылку такого вида:
index.php/user/search/name/joe/location/UK/gender/male
и после обработки такого адреса функцие $this->uri->uri_to_assoc(n) входит в состав библиотеки CI.
Получим такой массив:
[array]
(
'name' => 'joe'
'location' => 'UK'
'gender' => 'male'
)
Подробнее code-igniter.ru/user_guide/libraries/uri.html
index.php/user/search/name/joe/location/UK/gender/male
и после обработки такого адреса функцие $this->uri->uri_to_assoc(n) входит в состав библиотеки CI.
Получим такой массив:
[array]
(
'name' => 'joe'
'location' => 'UK'
'gender' => 'male'
)
Подробнее code-igniter.ru/user_guide/libraries/uri.html
+2
я только осваиваю CI, вчера написал класс для работы с URL (аналог замены GET параметров).
может комуто будет полезно, или, если можно, укажите как лучше манипулировать URL =)
Эти фнк я использую в view.
Например так:
может комуто будет полезно, или, если можно, укажите как лучше манипулировать URL =)
//вспомогательная фнк, возвращает измененную uri-строку function _uri_arr_replace($uri_arr_replace){ $uri_arr = $this->uri->uri_to_assoc();//достаем массив ключъ=>значение с uri foreach ($uri_arr_replace AS $key => $value){ $uri_arr[$key] = $value;//меняем или добавляем значение if (empty($value)) unset($uri_arr[$key]);//удаляем пустой ключъ } return $this->uri->assoc_to_uri($uri_arr); } //меняет URL если не нужно менять первые 2 сегмента function uri_replace($uri_arr_replace){ $seg_str = "/"; $seg_str .= ($this->uri->segment(1) ? ($this->uri->segment(1)."/") : "") . ($this->uri->segment(2) ? ($this->uri->segment(2)."/") : ""); if ($this->uri->segment(2)) return "http://".$_SERVER['SERVER_NAME'].$seg_str.$this->_uri_arr_replace($uri_arr_replace); else return "http://".$_SERVER['SERVER_NAME'].$seg_str; } //меняет URL если нужно менять и первые 2 сегмента function url_replace($seg, $uri_arr_replace = array()){ $seg_str = "/"; foreach ($seg AS $val) if (!empty($val)) $seg_str .= $val . "/"; if (!(empty($seg[0]) || empty($seg[1]))) return "http://".$_SERVER['SERVER_NAME'].$seg_str.$this->_uri_arr_replace($uri_arr_replace); else return "http://".$_SERVER['SERVER_NAME'].$seg_str; }
Эти фнк я использую в view.
Например так:
<li class="active"><a href="<?= $this->url_model->url_replace(array("news")) ?>">Новости</a></li>
0
Sign up to leave a comment.
ЧПУ + GET