шаблоны сайтов для лицеев . Плитка Toledo Verde 23 5x35 5 . аксессуары для iphone 4

Action'ы Часть II

Ajax-based actions

В предыдущей статье описаны по большей части не-аяксовые события. Они могут использоваться вместе с аяксом но только в случае если сам программистом возьмется за отправку запросов и принятие результатов действия. Ядро не сможет их интерпретировать если вы вызовете не аяксовое действие аяксовым запросом. Толку от этого будет очень мало.
В этой главе мы рассмотрим как на полную использовать возможности SpotLight в отношении действий(actions), в частности - аяксовых действий.

Итак, "тип" действия определятся по возвращенному результату. Ели действие возвращает NULL (return null;) - то можно считать,(а SpotLight так и считает) что оно ajax-based.

Вот в предыдущей статье, мы возвращали строку. По сути ядро приняв это строку смотрит есть ли в маппинге к действию результаты (<result>...</result>). Если нет то просто делает echo результата. Вот и вся мудреность. :)

Но вернемся к ajax-based действиям. Итак нам надо вернуть NULL, но как же мы тогда увидим данные которые должно возвращать действие?

Для этого существует объект Responce. В действие он создаеться при создании самого действия и находиться в переменной responce, то есть обратиться к нему можно вот так:

$this->responce->METHOD_NAME(PARAMS);

Итак пройдемся по методам:

# установить атрибут $key в значение $val в теге выбраным по селектору $selector
$this->responce->setAttributeBySelector($selector, $key, $val);
 
# установить тело тега с именем $tagname в значение $val (аналог jQuery = $("title").html("123"))
$this->responce->setElementByTagName($tagname, $val);
 
# установить тело тега с идентификатором $id в значение $val (аналог jQuery = $("#footer").html("some html tags"))
$this->responce->setElementById($id,$value);
 
# синоним setElementById; я всегда им пользуюсь, он короче :)
$this->responce->set($id,$value);
 
# добавить java-script код который выполниться на клиентской машине.
$this->responce->addJSEval($val);
 
# дописать за элементом с идентификатором $id
$this->responce->append($id, $val);
 
# дописать перед элементом с идентификатором $id
$this->responce->prepend($id, $val);
Последние два очень редко использовал.

Итак теперь как это все работает, а главное почему. Насчет идеологии читайте Tutorial 1: Идеология.
Прочитав тот туториал Вы уже знаете, что SpotLight придерживается идеи одного базового шаблона. И второй пункт - одно действе меняет лишь один элемент на странице.

Важно знать, что аяксовые действия непосредственно не возвращают данные. С помощью объекта Responce они могут заполнять отдельные части страницы. А уж по выполнении всей цепи действий результат обрабатывается и возвращается заполненный шаблон.

В spotlight.xml есть тег <template name="TEMPLATE_PATH" /> Он определяет базовый шаблон (конечно его можно менять по ходу выполнения действия). Вот в него то и будут загружаться все манипуляции проведенные с помощью объекта Responce.

Пишем все тот же Hello World:
Определим базовый шаблон в spotlight.xml:

<template name="views/test/helloWorld.html" />
Замечание тег <template ... /> имеет одиночное вхождение в маппинг (во всяком случае выберется первый тег изо всех вами определенных). HTML helloWorld.html :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>hello world</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="SpotLight/js/jquery.js"></script>
<script type="text/javascript" src="SpotLight/js/jquery.history.js"></script>
<script type="text/javascript" src="SpotLight/js/jquery.form.js"></script>
<script type="text/javascript" src="SpotLight/js/core.js"></script>
</head>
<body>
<div id="top"> <a href="<c:url@base />sayAjaxHello" type="ajax">say ajax hello</a> </div>
<div id="bottom"> bottom row </div>
</body>
</html>
Насчет <c:url@base /> не беспокойтесь, о библиотеке тегов будет немного позже.
У линка есть атрибут type="ajax" это говорит ядру, что надо отсылать запрос с помощью XMLHTTPRequest и соответственно его распарсить.
Снова лезем в spotlight.xml и добавляем действие:
<action name="sayAjaxHello" class="AjaxHelloAction" file="mySite/actions/AjaxHelloAction.class.php"/>
И наконец код этого класса:
<?php
class AjaxHelloAction extends Action {
 
public function execute() {
 
#уствновим елемент с id=='bottom' в значение: "HELLO FROM AJAX ACTION!!!!!"
$this->responce->set('bottom','HELLO FROM AJAX ACTION!!!!!');
 
#уствновим елемент с id=='top' (где была ссылка) в значение: "Link has gone )))"
$this->responce->set('top','Link has gone )))');
 
return null;
}
 
}
?>

Вот в принципе и все. Короткий экскурс в аяксовые действия окончен.

Следующая статья будет посвящена валидации данных "магических" методах.