дешевый хостинг, все возможности хостинга за 1$. . ЭМАЛЬ НЦ 132П ЧЕРНАЯ 2 5кг . ТЕКС Краска акрилатная ВДАК 101 класс ЛЮКС белая матовая 13кг

Action'ы Часть I

Основы

Action'ы - логика на стороне сервера. В них Вы определяете те действия которые необходимо выполнить и возвращаете(не всегда) результат.

Action - класс описанный в маппинге.
Например такой URL: http://yourserver/helloAction.
SpotLight будет пытаться найти в маппинге action или flow с именем helloAction. Если ему это удастся то он будет запущен. (О flow'ах будет рассказано чуть позже)

Классический пример:
Создаем файл mySite/action/HelloAction.class.php с таким содержанием:

<?php
class HelloAction extends Action {
public function execute() {
return 'Hello world!!!';
}
}
?>
Теперь "замаппим" его в SpotLight/configs/spotlight.xml вот так:
<action name="hello" class="HelloAction" file="mySite/actions/HelloAction.class.php" />
Теперь можно с успехом вводить URL: http://yourserver/hello
Если Вы все сделали верно то увидите Hello world!!!

Имена классов и файлов остаются на вашей совести,(в версиях ниже 0.5* это было невозможно, был строгий name-convention) я предоставил Вам как можно больше прав для успешного и приятного программирования. Хотя я предпочитаю использовать java name-convention и Вам того же желаю.

Классическим вариантом action'а является такой: один класс(читай - один файл!) на один action. Правда это не всегда удобно, потому сейчас мы немного расширим пример используя дополнительные возможности.
Добавим еще один action который будет принимать один параметр с именем name. Action этот мы опишем в это же файле ибо он логически туда подходит. Он будет возвращать текст: Hello ${name}, где ${name} - переданный параметр. Класс уже будет выглядеть таким образом:

<?php
class HelloAction extends Action {
 
protected $name;
 
public function execute() {
return 'Hello world!!!';
}
 
public function helloForName() {
return 'Hello '.$this->name;
}
}
?>
И естественно добавим (не заменим наш старый, а как раз добавим новый) маппинг:
<action name="helloFor" method="helloForName" class="HelloAction" file="mySite/actions/HelloAction.class.php" />
Теперь снова с успехом вводим URL: http://yourserver/hello/name/Tesla
И вивдим результат:Hello Tesla.

Как вы уже заметили то данные попали в переменную без нашей участи. Наша задача всего лишь описать ее как protected или public (первый вариант куда более предпочтительней с архитектурной точки зрения). Никаких сеттеров/геттеров (кстати такое было в версиях ниже 0.5.0.3)

Описывать атрибути в маппинге думаю нету смысла, Dы их уже поняли. Их есть всего 4 для тега <action .. />. И только один - обязателен - name. Но тут есть тонкость, атрибуты class и file впаре тоже обязательны. Один не может быть без другого. Ежели у Вас нет бизнес-логики то и смысла описывать класс для действия тоже нет. Тогда эти два атрибута можно не писать.

Резонно спросите Вы, а какой смысл с такого действия:

<action name="loginForm" />
С такого никого смысла нет. А вот с такого есть:
<action name="loginForm" >
<result>views/pages/loginForm.html</result>
</action>
И даже с такого:
<action name="page_(d+)" >
<result>views/pages/{1}.html</result>
</action>
Тогда по URL http://yourserver/page_1 можно получить содержимое страницы views/pages/1.html. А по http://yourserver/page_2 получим содержимое views/pages/2.html.

У тега <result> есть два атрибута - type и name. Рассмотрим type.
Он может принимать 2 значения - redirect и любое другое! По умолчанию он принимает значение отличное от redirect таким образом в браузере URL остается таким как вы его замаппили. Иначе Вы получите, например первого примера, вот такое: http://yourserver/views/pages/1.html

В действиях без логики не имеет смысла использовать больше одного результата, все равно выберется первый, а так же атрибут name не берется во внимание.

Но другое дело если есть, например такое действие:

<action name="login" class="LoginAction" file="mySite/actions/LoginAction.class.php">
<result name="success">views/pages/auth/insystem.html</result>
<result name="fail">views/pages/auth/fail.html</result>
</action>

В таком случае результат будет выбираться из двух представленных, посредством сравнивания возвращенного результата из действия и значений атрибутов name. Все просто.
Описываем класс действия:

<?php
class LoginAction extends Action {
 
protected $login;
 
protected $passwd;
 
public function execute() {
return $this->login=='Tesla' && $this->passwd=='123' ? 'success' : 'fail';
}
}
?>
Надеюсь тернарный оператор Вас не смутит. :)
Теперь вводим URL: http://yourserver/login/login/Tesla/passwd/123 при таких параметрах SpotLight вернет нам по-namesuccessстраницу views/pages/auth/insystem.html. В идеале бы это все отсылать через форму. Но не в этом суть. Суть в том, что бы показать общие принципы работы и логики исполнения веб-приложений на базе SpotLight.

Выше мы уже использовали регулярные выражения для имени действия и использовали их в результатах. Их также можно использовать и в атрибутах file, class и method

Теперь мы даже немного умеем создавать действия (action'ы) и соответственно корректно маппить их. Но это не все есть еще масса вещей связанных с ними, например валидаторы и интерсепторы, магические методы, и еще и еще...