Pull to refresh

Comments 43

все предельно просто и работает. в лучших традициях CI
хотя думаю через регулярные выражения было бы изящнее. а еще лучше через 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'];

вернет нам нужный массив
parse_str($_SERVER['QUERY_STRING'], $this->_get_params);
вернет нам нужный массив.
спасибо, не знал. вообщем вилосипед получился )
В любом случае от него есть польза. Для вас точно. Разобрались во внутренностях CI, значит, возможно, будут от вас ещё полезные расширения.
а разве это не отключит ЧПУ?
не отключит… поторопился с вопросом
Для использования GET необходимо в файле кофигурации выставить настройки следующим образом:
$config['uri_protocol'] = 'PATH_INFO';
$config['enable_query_strings'] = TRUE;
Это ошибка была. Сейчас все ок.
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
Ну а ты то у нас знатный программер, особенно если посмотреть на твой возраст.
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

Расскажите кто знает. Я честно, не вижу тут подводных камней.
Ну а если, например, к сортировке добавить еще штук 10 фильтров? Перечислять их всегда в определенном порядке? А если мне из этих 10 только 1 фильтр нужен? Собственно, тут и спасут get параметры.
можно в беспорядке указывать, а потом разбирать,
допустим, все четные — фильтр, нечетные — его значение,
далее забросить все в массив, использовать in_array,
проверить на корректность и т. п.

не понимаю, чем get от такого варианта отличается
И ради чего такое извращение? :)
Решение конечно через Ж возможно, но опубликую кусок кода из своего:

… какой-то код
$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= в конец
… генерация ссылок
Ещё ЧПУчнее вот так вот: /news/{PageNumber}/ — вместо {PageNumber} номер страницы конечно же. Я уже года 4 так делаю и знаю приличное количество людей кто делает так же. На мой взгляд такие вот ссылки:

/news/2/ = /news/{PageNumber}/
/news/2008/january/30/ = /news/{Year}/{Month}/{Day}/
/users/Fenix/billing/ = /users/{NickName}/billing/

гораздо читабельнее, чем когда мы приплетаем к нормальной ЧПУ ссылке гет параметры доисторические.

Я не буду приводить пример решения для таких ссылок, думаю все без труда итак догадаются, ну а если нет, то если будут желающие могу написать статью про то как надо делать действительно ЧПУчные ссылки и какие имеются способы решения этой задачи.

Чтобы сразу избавиться от вопросов типа «а если я хочу 10 фильтров, а надо мне один и я вообще не понимаю что я хочу», отвечу сразу: если вы не знаете что вы хотите от этой ссылки, то надо задуматься о том что что-то не так вы придумали на данной странице :) Таких неопределённостей впринципе возникать недолжно и это должно служить неким сигналом непродуманности решения. По моему мнению ссылка вообще не должна являться транспортом данных, это только лишь некий идентификатор некоего обработчика, возможно параметризованный, но в разумных пределах, а данные надо передавать формами, объектами и тд, но явно не ссылками — мы ведь уже в 21 веке.

Вообщем, если кто-то не согласен что так удобнее, буду рад выслушать контраргументы.
дело в том что если допустим есть фильтр в вписке, то я могу некоторые поля выбрать а некоторые могу не выбрать, тогда Ваш способ немножечко не подходит, так как урл на одну и ту же страницу может состоять из разных урлов в зависимости от фильтра
допустим список товаров:
1 — весь список
2 — весь список красных товаров
3 — только товары с картинками
4 — только красные товары с картинками с 5 страницы
итд…
А зачем ссылки на всё подряд? Это я считаю уже лишнее, информацию фильтра не надо помещать в ссылку. Фильтруйте через аякс, или через обновление страницы с передачей формы, но зачем ссылки-то загрязнять? Смысл чпу в том-то и заключается, чтобы ссылки были простыми и запоминаемыми. Такие ссылки предназначены для того чтобы их набрать можно было, запомнить, продиктовать. Всё остальное отметать надо как ненужный хлам, ИМХО.
я был бы благодарен за статью как делаются действительно ЧПУшные ссылки, причем с вариациями как я написал выше
Ок, постараюсь в ближайшее время, просто тема уже изжованная и избитая и тд и тп :) Почти каждый день кто-то пишет что-то про чпу, по крайней мере часто здесь об этом слышу
мне в голову приходит передача ссылки с параметром для поиска:
yandex.ru/yandsearch?text=%D1%85%D0%B0%D0%B1%D1%80%D0%B0%D1%85%D0%B0%D0%B1%D1%80&clid=14585
мне не нада объяснять адресату, что он должен зайти на яндекс ввести запрос и нажать на кнопку Найти
на хабре заметьте тоже гет используется для поиска ;)
Ну да, не отрицаю, есть такие случаи конечно-же, но здесь уже и о ЧПУ не надо говорить. Я к чему: если делаете ЧПУ ссылки, то не надо их обезображивать кучей гет параметров и называть это ЧПУ :) В таких случаях и я делаю вынесенный обработчик с гет запросом, хотя я уже давно так не делал, последний раз я сделал просто на странице с фильтром по вакансиям кнопку «получить ссылку», и пользователь мог передать ссылку на свою фильтрацию кому-нибудь другому. Таким образом наверху была красивая ссылка, фильтрация делалась по аякс, а передать можно было ссылку на отдельный обработчик, который читал данные, помещал в сессию и перекидывал на страницу фильтра вакансий, где по этим данным проводилась соответствующая фильтрация и данные очищались. Единственное что клиенту не понравилась идея с кнопкой такой и пришлось её убрать :( а такая фича классная.
а чем вам не нравится подход зенда к этому?
они просто удлинили чпу, вставив туда и ключи
someurl.com/products/page/4/field/title/order/up/page/4

я понимаю это выглядит длинней, но выглядит как полноценное чпу да и обрабатывается просто :)
никто не говорил, что не нравится. Я к сожалению не знаю зенд, но для вашего url в ci требуется хитрый парсер
В Zend если не задавать маршруты получиться:

Будет вызван index action в контроллере products и page =
Чертов alt+enter

продолжаю… и page = 4 & field = titile & order = up & page = 4

Но зато машрутизация в CI проще чем в Zend. Хотя я уже привык и удобст не испытываю.
не знаю насчет хитрого парсера, но понять что пришло можно элементарно (в идеальном варианте):
domain.com/model/controller/action/key1/value1/key2/value2/key3/value3/… итд
там используется мвц и поэтому первые 3 (опять же идеальный вариант) параметра заняты поумолчанию
не думаю что такой урл трудно будет разобрать, хотя я не пытался :) за меня все делает зенд
я не понимаю, что вы хотите доказать. Мы все поняли, что там идет комбинация переменная/значение ), хороший вариант, не спорю
Не знаю по теме ли :) но все же не понимаю зачем столько движений.
Все решается добавлением параметра [QSA] в .htaccess

RewriteRule ^catalog\/([a-z0-9_]+)(\/?)$ /catalog.php?alias=$1 [QSA]

И ссылка вида /catalog/abc/?p=1 передаст GET параметр при работающем ModRewrite
@параметры (например ?c=stationery&act=contacts), либо использовать ЧПУ (например stationery/contacts), но тогда мы не можем передавать в url get параметры@
Все прекрасно передается, вы ошибаетесь.
да, забыл сказать… чпу у меня реализовано через modrewrite в формате RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
А что мешает сделать ссылку такого вида:
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
я только осваиваю CI, вчера написал класс для работы с URL (аналог замены GET параметров).
может комуто будет полезно, или, если можно, укажите как лучше манипулировать 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>
Sign up to leave a comment.

Articles