Zend Framework и AJAX

В данном посте расскажу о том, как лучше и правильнее интегрировать AJAX в Zend Framework, а точнее в его MVC-компоненты. Для реализации клиентской части скрипта используется javascript библиотека json.js. Рассказывать буду на примере старой версии страницы с описанием игровых навыков и заклинаний игры Divine Divinity. Ранее я уже рассказывал об оптимизации этой странички.

Введение

AJAX-запрос похож на обычную загрузку страницы. Те же заголовки запроса и ответа. На практике же приходится подключать дополнительно альтернативный модуль вывода данных (к примеру, чтобы возвращать данные в XML или JSON формате). Покажу на примере AJAX запроса для получения информации по навыку. Работать будем с использованием хэлпер AjaxContext, делающий нашу работу с AJAX’ом ещё удобнее и проще. Хэлпер (помощник, helper) – один из компонентов фреймворка, помогающий выполнять какие-то определённые действия. Принцип действия AjaxContext заключается в том, что он заменяет шаблон вида на нужный нам формат вывода.

Серверная часть

На сервере, собственно, необходимо пошаманить с контроллером соответствующим.

class AjaxController extends Zend_Controller_Action
{
    public function init()
    {
		//передаём имя action'а, который необходимо интегрировать с AJAX'ом
$this->_helper->AjaxContext()->addActionContext ('selectskill', 'json')->initContext('json');
    }


	//обработка AJAX запроса на получение информации по навыку
	public function selectskillAction()
	{
		//здесь получение ассоциотивного массива данных $res
		...
		//возвращаем этот массив
		$this->view->s = $res;
	}
	
}

Хелпер отслеживает ajax-запросы и отключает для них авторендеринг скриптов вида. Затем, после выполнения action’а, хэлпер кодирует все данные, переданные в наш view-класс, в формат JSON и выводит на экран (т.е. передаёт браузеру). Таким образом, нам больше не нужно задумываться на стороне сервера о том, откуда поступил запрос и как его нужно обработать, это всё перекладывается на плечи разработчиков клиентской части скрипта. Теперь в случае ajax-запроса мы получим JSON-кодированные данные.

Клиентская часть

Остаётся только JS код для отправки запроса и обработки полученных результатов написать.

//Функция получения инфы по навыку
function GetSkillById(id, obj)
{

	if(list_ajax['skill_'+id] == null)
	{	
		//формируем запрос
		$.getJSON
		(
			base +'ajax/skill', 
			{skillid:id},
			function(results) 
			{
				//обработка результата
				//в results.s возвращённый массив
				if(results.s[0] == 'success')
				{
					...
				}
				else
				...
					
			}   
		);
	}
	else
	{
		...
	}
}

P.S. Если вы ещё вначале пути и задумываетесь над выбором CMS для своего сайта, советую рассмотреть PHP-Fusion.

  Категории: JavaScript, php, Zend Framework
  • http://www.plutov.by Alexander

    Some good articles about Zend Framework you can find here http://www.plutov.by

  • http://thai-blog.net таиланд

    Извените, что пишу не по теме, но я добавил ваш сайт к себе в RSS-Reader, но новые записи, почемуто, не отображаются =(
    Это я делаю что то не так или у вас глючит rss фид?

    • http://suvitruf.ru Suvitruf

      Не глючит)

  • http://stafox.ru Stafox

    Кстати, в ZF есть такой метод [php]isXmlHttpRequest()[/php], который можно использовать когда есть ajax запросы. Если нам не к чему обращение к Action’y напрямую,

    public function selectskillAction() {
    if($this->_request->isXmlHttpRequest()) {
    //здесь получение ассоциотивного массива данных $res
    ...
    //возвращаем этот массив
    $this->view->s = $res;
    }
    }