Seagull PHP Framework - создание действия
В этой статье продолжу развивать наш первый модуль, дополнив его новыми фичами.
Прежде всего стоит отметить, что стандартным движком для генерирования HTML-страниц в Seagull является движок Flexy. Именно на этом движке строится модуль в данных статьях. Важные особенности этого движка:
1. все переменные и имена функций должны быть взяты в фигурные скобки
2. никогда не используйте пробелы между переменными, в случае использования их как аргументов, Flexy такое не приветствует
Итак, сперва сгенерирую какую-нибудь ссылку. Для этого в Seagull можно использовать функцию makeUrl().
{makeUrl()}
{makeUrl()}При использовании функции без параметров ссылка будет вести просто на ту страницу, на которой мы и находились до этого. Например, добавьте в файл helloWorld.html следующее:
<a href="{makeUrl()}">say good bye</a>
<a href="{makeUrl()}">say good bye</a>Но вообще, функция эта имеет три параметра:
{makeUrl(action,manager,module)}
{makeUrl(action,manager,module)}action - имя некоего действия, manager - имя модуля, ну и, соответственно, module - третий параметр, имя модуля. Давайте вызовем эту функцию, используя один только первый параметр. Ещё одна важная особенность движка Flexy - если в параметрах используется не имя переменной, а литерал, то его нужно брать в знак хэша (#).
<a href="{makeUrl(#sayGoodBye#)}">say good bye</a>
<a href="{makeUrl(#sayGoodBye#)}">say good bye</a>Если Вы посмотрите исходный код страницы в браузере, то Вы увидите ссылку вот такого вида:
<a href="http://localhost/seagull/www/index.php/helloworld/action/sayGoodBye/">say good bye</a>
<a href="http://localhost/seagull/www/index.php/helloworld/action/sayGoodBye/">say good bye</a>Вот - а теперь добавим немного кода в наш класс HelloWorldMgr, чтобы соответствующее действие выполнилось. Добавляем в наш класс вот такой конструктор:
function HelloWorldMgr()
{
parent::SGL_Manager();
$this->_aActionsMapping = array(
'sayGoodBye' => array('sayGoodBye'),
);
}
function HelloWorldMgr()
{
parent::SGL_Manager();
$this->_aActionsMapping = array(
'sayGoodBye' => array('sayGoodBye'),
);
}Это нужно для того, чтобы сказать Segull, какие конкретно методы будут призваны для того, чтобы выполнить действие, зависящее от значения параметра action. Пока у нас параметр только один - sayGoodBye, вот его мы и перечисляем.
Для валидации этой переменной добавляем в класс ещё одну функцию validate:
function validate($req, &$input)
{
$this->validated = true;
$input->action = $req->get('action');
}
function validate($req, &$input)
{
$this->validated = true;
$input->action = $req->get('action');
}Объяснение вышерасположенного кода можно посмотреть тут.
Осталось немного. Добавляю функцию, которая выводит некоторый текст (в нашем случае это слово Goodbye) в новую переменную word:
function _cmd_sayGoodBye(&$input, &$output)
{
$output->word = 'Goodbye';
}
function _cmd_sayGoodBye(&$input, &$output)
{
$output->word = 'Goodbye';
}Теперь осталось только немного подправить файл шаблона, во-первых, вывести ту самую переменную word в фигурных скобках, ну и сделать ссылку, при нажатии на которую будет появляться надпись Goodbye. Также я поменял вывод - теперь выводится не Hello World!, а просто World!
Итак, финальный вид того, как будет выглядеть теперь файл helloWorld.html:
{word} {testVariable}
<p><a href="{makeUrl(#sayGoodBye#)}">say good bye</a></p>
{word} {testVariable}
<p><a href="{makeUrl(#sayGoodBye#)}">say good bye</a></p>Всё. Сохраняйте изменения, перезапускайте модуль. Появится надпись World!, а под ней ссылка say good bye, при нажатии на которую действительно перед World! добавляется Goodbye.
Goodbye World!
Продолжение следует...
С уважением, Ёж.


