AJAX ссылка с подменой необходимого URL

Здравствуйте! Сегодня хотелось бы поделиться способом создания ajax ссылок в Yii. Зачастую бывает, что кроме самого функционала ajax ссылки необходимо проставить соответствующие адреса, для более правильной индексации поисковиками.

Давайте представим, что у нас есть какое-то меню рубрик товаров. Например меню состоит из 3х пунктов «Цветы, горшки, земля» и мы решили сделать эти ссылки посредством ajax т.е. при нажатии на «Горшки» у нас в блоке контента появляются горшки без перезагрузки страницы. Код подобной ссылки будет примерно следующий:

CHtml::ajaxLink('Горшки',array('site/index'), array(
	'type' => 'POST',
	'data'=>array('type'=>'1'),
	'success' => "
		function(html){
		$('#content').html(html);}",
	));?>

Таким образом в блоке content у нас появится результат выполнения запроса к экшену index, но в таком случае получается, что ссылки на горшки и на цветы в нашем меню будут выглядеть одинаково, что не очень хорошо для поисковых роботов.

Поэтому для того, чтобы при наведении на ajax ссылку, у нас отображалась своя ссылка можно воспользоваться параметром href в htmlOptions. Теперь код ajax ссылки в Yii будет выглядеть так.

 <?echo CHtml::ajaxLink('Горшки',array('site/index'), array(
	'type' => 'POST',
	'data'=>array('type'=>'1'),
	'success' => "
		function(html){
		$('#content').html(html);}",
	),array('href' => Yii::app()->createUrl('site/index', array('type'=>'1'))));?>

Теперь при наведении на ajax ссылку у нас будет отображаться необходимый URL адрес.

Давайте пойдем дальше и представим, что наш пользователь захотел поделиться ссылкой на горшки с другом, а в адресной строке браузера ссылка остается неизменной при перемещении по рубрикам. В таком случае воспользуемся функцией js history.pushState.

Вкратце что она делает. Она меняет адрес страницы без перезагрузки, что нам очень подходит в рамках ajax ссылок. Принимает 3 параметра. Первый это переменная состояния, второй это заголовок этой ссылки в истории (устарело), адрес для адресной строки.

В результате должно получиться примерно следующее.

 <?echo CHtml::ajaxLink('Горшки',array('site/index'), array(
	'type' => 'POST',
	'data'=>array('type'=>'1'),
	'success' => "
		function(html){
		$('#content').html(html);
		history.pushState(null,null,'".Yii::app()->createUrl('site/index',array('type'=>'1'))."');}",
	),array( 'href' => Yii::app()->createUrl('site/index',array('type'=>'1'))));?>
comments powered by HyperComments
Ищущий
2014-11-09 21:40:24
Выходит, можно вместо test.com#!cart/c1whb использовать просто text.com/cart?
Фарход
2015-09-04 09:51:21
спасибо за хороших статей
ivibbet
2026-04-06 13:13:30
I've been using ivibbet for a few weeks now. Good bonuses and the customer service is responsive. I can't complain. Give them a try <a href='https://ivibbet.org' rel="nofollow ugc">ivibbet</a>.
sn88bet
2026-04-06 13:13:46
I was on sn88bet yesterday, had pretty good luck. User experience is great plus they have a large variety of game types to choose from. You can visit it here: <a href='https://sn88bet.info' rel="nofollow ugc">sn88bet</a>.
plataformawin656
2026-04-06 13:14:03
Gave plataformawin656 a try last week. Pretty standard, but had some good deals going on. Navigation is so so, but worth a shot when they have promotions running. Find it at <a href='https://plataformawin656.com' rel="nofollow ugc">plataformawin656</a>.
При копировании материалов обратная ссылка на play-stop.ru желательна обязательна!