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
спасибо за хороших статей
При копировании материалов обратная ссылка на play-stop.ru желательна обязательна!