Phpxcore:php4:newmodule:main
Материал из phpXCoreWiki.
Содержание |
[править] С чего начать
- Изменение конфигурационного файла modules.run.xml.
- Создание основных файлов модуля.
- Манипулирование данными
- Вывод данных.
[править] Конфигурация
Всё что нам нужно - это измененить modules.run.xml. Далее приведен пример с комментариями для модуля xstaticpages:
<xstaticpages enabled='true' seo='info'> <run> <!-- Имена классов--> <main>XStaticPages</main> <default>XStaticPagesDefault</default> <gateway>XStaticPagesGateway</gateway> <admin>XStaticPagesAdmin</admin> </run> </xstaticpages> <!-- Настройка статусов: Статус - xcmod+xcact - имя статуса по имени xcact --> <status> <show template='XC.show.tpl' /> <default template='XC.index.tpl' /> </status>
И файл xstaticpages.xml
<?xml version="1.0" encoding="UTF-8" ?> <module> <!-- Информация о авторах модуля --> <info> <author> <name>FirstName LastName</name> <email>email@domain.com</email> </author> <description><![CDATA[ Информация о модуле ]]> </description> </info> <config> <!-- Информация о зависимостях модуля --> <dependences> <dependence>xcategory</dependence> </dependences> <!-- Информация о таблицах модуля --> <tables> <table>#__static_pages</table> </tables> <!-- Информация о поддерживаемых языках --> <languages enabled='true' path='lang'> <lang>en</lang> <lang>ru</lang> </languages> <main> <!-- Секция для автоподключения файлов (указанные файлы нет необходимости подключать в дальнейшем) Есть возможность описывать для каждого возможного запуска модуля: - main - default - gateway - xajax - admin --> <autoinit> <file>classes/XStaticPageEntity.class.php</file> </autoinit> </main> <gateway> <autoinit> <file>classes/XStaticPageEntity.class.php</file> </autoinit> </gateway> <!-- Секция для настройки админки - необязательна --> <admin enabled = 'true'> <autoinit> <file>classes/XStaticPageEntity.class.php</file> </autoinit> <image>icons/24x24/pages.gif</image> <title>Management of Static Pages</title> <!-- Настройка главного меню админки --> <menu> <title>Static Pages</title> <hint>Management of Static Pages</hint> <image1>icons/16x16/Normal/pages.gif</image1> <image2>icons/16x16/Disabled/pages.gif</image2> <!-- Под пункт меню --> <item> <title>Create New</title> <hint>Create new Static Page</hint> <action>create</action> </item> <item> <title>Show All</title> <hint>Show all Static Pages</hint> <action>listing</action> </item> </menu> </admin> </config> </module>
[править] Реализация
[править] Создание файлов
Для работы нам необходимо создать основной файл XStaticPages.class.php (конструктор можно не описывать):
class XStaticPages extends XModuleMain { /** * run * * Run method * * @class XStaticPages * @access public * @return void */ function run() { // switch statement for $this->request->action switch ($this->request->action) { case 'category': $this->showCategory(); break; default: $this->ShowPage($this->request->action); break; } }
Метод run будет вызван только при непосредственном обращении к модулю, т.е. xcmod == xstaticpages для данного примера.
[править] Манипулирование данными
В данном примере xcmod=xcounter и xcact=show, следовательно $this->active == true и $this->request->action == show, исходя из этого и конструкции в методе run выполняется метод _show:
/** * _show * * @access private * * @return bool */ function _show() { /* Получение текущего пользователя */ /* @var $XUser XUser */ $XUser =& $this->config->active_user; /* Получение данных из $_REQUEST */ $day = $this->request->params['day']); $day = $this->request->get('day', null); /* Получения строки из конфига source для текущего языка */ $this->output->lang->getSource('labels', 'logged'); /* Получения строки из конфига template для текущего языка */ $this->output->lang->getTemplate('labels', 'logged'); /* Получение данных из конфига модуля*/ $var1 = $this->config->all["test"]["var1"]["@"]["value"]; /* Создание правильной линки */ $link = Output::getURL("xcounter", "show", array("day" => $day)); }
[править] Вывод данных
Для вывода информации используем следующие средства:
/* Assign переменных в главные шаблоны */ $this->output->assignGlobal('title', 'Counter Statistic'); /* Assign переменных в шаблоны модуля */ $this->output->assign('test',"Good"); /* Или */ $this->assign('test',"Good"); /* Добавляем сообщение (используя class Document)*/ $this->output->document->addMessage("Тук-тук!"); /* Добавляем сообщение о ошибке*/ $this->output->document->addError("Ошибочка вышла!"); /* Шаблон для вывода информации */ $this->output->addTemplate($this->config->tpl_path."show.tpl"); /* Или Сокращенный вариант */ $this->addTemplate("show.tpl"); /* Разделение вывода информации */ $this->output->addTemplate($this->config->tpl_path."front.tpl", "front"); /* Или Сокращенный вариант */ $this->addTemplate("front.tpl", "front");
Главные шаблоны находяться в директории application\templates
Пример главного шаблона XC.stat.tpl (использование данного шаблона указано в modules.run.xml):
<table>
<tr>
<td>{$title} <!-- это вывод глобальной переменной --></td>
<td>{output module='xcounter' view='front'} <!-- это пример разделения вывода --></td>
</tr>
<tr>
<td colspan="2">
{document type='getRenderedMessages'} <!-- вывод сообщений -->
{document type='getRenderedErrors'} <!-- вывод ошибок -->
{output action='fetch_active'} <!-- вывод основных данных - в данном примере аналог {$xcounter.main} -->
</td>
</tr>
</table>[править] Redirect
Различные виды редиректа:
/* Добавляем сообщение и редиректим на нужную страницу*/ Output::setMessage('Notes was added'); header('Location: '. Output::getURL('xcounter', '')); exit; /* Добавляем ошибку и редиректим на нужную страницу*/ Output::setError('Notes was added'); header('Location: '. Output::getURL('xcounter', '')); exit; /* Или Сокращенный вариант */ Output::setError('Notes was added'); Output::goURL("xcounter", ""); /* Добавляем ошибку(или сообщение) и редиректим на home страницу*/ header('Location: '. Output::getMainURL('Permission denied', DOCUMENT_ERROR)); exit; /* Или Сокращенный вариант */ Output::goMainURL('Permission denied', DOCUMENT_ERROR);
Не следует использовать редирект при манипуляциях со Datagrid'om, т.е. если Вы отображаете датагридом список item'ов, и Вам необходимо добавить/отредактировать/удалить один из них, то следующий код является непостежимым злом:
// вполне нормальная функция run function run() { // switch statement for $this->request->action switch ($this->request->action) { case 'add': // функция которая добаваляет запись $this->add(); break; case 'del': // функция которая удаляет запись $this->del(); break; case 'showList': // функция которая выводит Datagrid $this->showList(); break; default: $this->showList(); break; } } // ненормальная функция add function add() { // тут идет код для добавления записи в БД // ... // добавили и делаем редирект!!! Output::setMessages('Notes was added'); Output::goURL("xnotes", "showList"); }
Правильно будет написать следующее:
// нормальная функция add function add() { // тут идет код для добавления записи в БД // ... // добавили и переходим на функцию showList $this->output->document->addMessage('Notes was added'); return $this->showList(); }
