Создание собственного модуля (страницы)
Материал из Umicms
Официальная информация по созданию модуля описана на сайте api.umi-cms.ru. Здесь представлена обновленная информация по созданию модуля, который позволяет создавать страницы своего типа и выводить потом содержание этих страниц на сайте.
В директории classes/modules/ создаем папку modulelements, в которой создадим шесть файлов следующего содержания, class.php:
<?php class modulelements extends def_module { public $per_page; public function __construct() { parent::__construct(); if(cmsController::getInstance()->getCurrentMode() == "admin") { $configTabs = $this->getConfigTabs(); if ($configTabs) { $configTabs->add("config"); } $this->__loadLib("__admin.php"); $this->__implement("__modulelements"); } else { $this->per_page = regedit::getInstance()->getVal("//modules/modulelements/per_page"); } } public function groupelements($path = "", $template = "default") { if($this->breakMe()) return; $element_id = cmsController::getInstance()->getCurrentElementId(); templater::pushEditable("modulelements", "groupelements", $element_id); return $this->group($element_id, $template) . $this->listElements($element_id, $template); } public function item_element() { if($this->breakMe()) return; $element_id = (int) cmsController::getInstance()->getCurrentElementId(); return $this->view($element_id); } public function group($elementPath = "", $template = "default", $per_page = false) { if($this->breakMe()) return; $hierarchy = umiHierarchy::getInstance(); list($template_block) = def_module::loadTemplates("tpls/modulelements/{$template}.tpl", "group"); $elementId = $this->analyzeRequiredPath($elementPath); $element = $hierarchy->getElement($elementId); templater::pushEditable("modulelements", "groupelements", $element->id); return self::parseTemplate($template_block, array('id' => $element->id), $element->id); } public function view($elementPath = "", $template = "default") { if($this->breakMe()) return; $hierarchy = umiHierarchy::getInstance(); list($template_block) = def_module::loadTemplates("tpls/modulelements/{$template}.tpl", "view"); $elementId = $this->analyzeRequiredPath($elementPath); $element = $hierarchy->getElement($elementId); templater::pushEditable("modulelements", "item_element", $element->id); return self::parseTemplate($template_block, array('id' => $element->id), $element->id); } public function listGroup($elementPath, $template = "default", $per_page = false, $ignore_paging = false) { // Код метода } public function listElements($elementPath, $template = "default", $per_page = false, $ignore_paging = false) { // Код метода } public function config() { return __modulelements::config(); } public function getEditLink($element_id, $element_type) { $element = umiHierarchy::getInstance()->getElement($element_id); $parent_id = $element->getParentId(); switch($element_type) { case "groupelements": { $link_add = $this->pre_lang . "/admin/modulelements/add/{$element_id}/item_element/"; $link_edit = $this->pre_lang . "/admin/modulelements/edit/{$element_id}/"; return Array($link_add, $link_edit); break; } case "item_element": { $link_edit = $this->pre_lang . "/admin/modulelements/edit/{$element_id}/"; return Array(false, $link_edit); break; } default: { return false; } } } }; ?>
Файл __admin.php:
<?php abstract class __modulelements extends baseModuleAdmin { public function config() { $regedit = regedit::getInstance(); $params = array('config' => array('int:per_page' => NULL)); $mode = getRequest("param0"); if($mode == "do") { $params = $this->expectParams($params); $regedit->setVar("//modules/modulelements/per_page", $params['config']['int:per_page']); $this->chooseRedirect(); } $params['config']['int:per_page'] = (int) $regedit->getVal("//modules/modulelements/per_page"); $this->setDataType("settings"); $this->setActionType("modify"); $data = $this->prepareData($params, "settings"); $this->setData($data); return $this->doData(); } public function lists() { $this->setDataType("list"); $this->setActionType("view"); if($this->ifNotXmlMode()) return $this->doData(); $limit = 20; $curr_page = getRequest('p'); $offset = $curr_page * $limit; $sel = new selector('pages'); $sel->types('hierarchy-type')->name('modulelements', 'groupelements'); $sel->types('hierarchy-type')->name('modulelements', 'item_element'); $sel->limit($offset, $limit); selectorHelper::detectFilters($sel); $data = $this->prepareData($sel->result, "pages"); $this->setData($data, $sel->length); $this->setDataRangeByPerPage($limit, $curr_page); return $this->doData(); } public function add() { $parent = $this->expectElement("param0"); $type = (string) getRequest("param1"); $mode = (string) getRequest("param2"); $this->setHeaderLabel("header-modulelements-add-" . $type); $inputData = Array( "type" => $type, "parent" => $parent, 'type-id' => getRequest('type-id'), "allowed-element-types" => Array('groupelements', 'item_element')); if($mode == "do") { $element_id = $this->saveAddedElementData($inputData); if($type == "item") { umiHierarchy::getInstance()->moveFirst($element_id, ($parent instanceof umiHierarchyElement)?$parent->getId():0); } $this->chooseRedirect(); } $this->setDataType("form"); $this->setActionType("create"); $data = $this->prepareData($inputData, "page"); $this->setData($data); return $this->doData(); } public function edit() { $element = $this->expectElement('param0', true); $mode = (string) getRequest('param1'); $this->setHeaderLabel("header-modulelements-edit-" . $this->getObjectTypeMethod($element->getObject())); $inputData = array( 'element' => $element, 'allowed-element-types' => array('groupelements', 'item_element') ); if($mode == "do") { $this->saveEditedElementData($inputData); $this->chooseRedirect(); } $this->setDataType("form"); $this->setActionType("modify"); $data = $this->prepareData($inputData, "page"); $this->setData($data); return $this->doData(); } public function del() { $elements = getRequest('element'); if(!is_array($elements)) { $elements = array($elements); } foreach($elements as $elementId) { $element = $this->expectElement($elementId, false, true); $params = array( "element" => $element, "allowed-element-types" => Array('groupelements', 'item_element') ); $this->deleteElement($params); } $this->setDataType("list"); $this->setActionType("view"); $data = $this->prepareData($elements, "pages"); $this->setData($data); return $this->doData(); } public function activity() { $elements = getRequest('element'); if(!is_array($elements)) { $elements = array($elements); } $is_active = getRequest('active'); foreach($elements as $elementId) { $element = $this->expectElement($elementId, false, true); $params = array( "element" => $element, "allowed-element-types" => Array('groupelements', 'item_element'), "activity" => $is_active ); $this->switchActivity($params); $element->commit(); } $this->setDataType("list"); $this->setActionType("view"); $data = $this->prepareData($elements, "pages"); $this->setData($data); return $this->doData(); } public function getDatasetConfiguration($param = '') { return array( 'methods' => array( array('title'=>getLabel('smc-load'), 'forload'=>true, 'module'=>'modulelements', '#__name'=>'lists'), array('title'=>getLabel('smc-delete'),'module'=>'modulelements', '#__name'=>'del', 'aliases' => 'tree_delete_element,delete,del'), array('title'=>getLabel('smc-activity'),'module'=>'modulelements', '#__name'=>'activity', 'aliases' => 'tree_set_activity,activity'), array('title'=>getLabel('smc-copy'), 'module'=>'content', '#__name'=>'tree_copy_element'), array('title'=>getLabel('smc-move'),'module'=>'content', '#__name'=>'tree_move_element'), array('title'=>getLabel('smc-change-template'), 'module'=>'content', '#__name'=>'change_template'), array('title'=>getLabel('smc-change-lang'), 'module'=>'content', '#__name'=>'move_to_lang')), 'types' => array( array('common' => 'true', 'id' => 'item_element') ), 'stoplist' => array(), 'default' => 'h1[140px]' ); } }; ?>
Файл install.php:
<?php $INFO = Array(); $INFO['name'] = "modulelements"; $INFO['filename'] = "modules/modulelements/class.php"; $INFO['config'] = "1"; $INFO['ico'] = "ico_modulelements"; $INFO['default_method'] = "show"; $INFO['default_method_admin'] = "lists"; $INFO['is_indexed'] = "1"; $INFO['per_page'] = "10"; $INFO['func_perms'] = ""; $COMPONENTS = array(); $COMPONENTS[0] = "./classes/modules/news/__admin.php"; $COMPONENTS[1] = "./classes/modules/news/class.php"; $COMPONENTS[2] = "./classes/modules/news/i18n.php"; $COMPONENTS[3] = "./classes/modules/news/lang.php"; $COMPONENTS[4] = "./classes/modules/news/permissions.php"; ?>
Файл permissions.php:
<?php $permissions = Array( 'view' => Array('groupelements', 'item_element', 'group', 'view', 'listGroup', 'listElements'), 'lists' => Array('lists', 'add', 'edit', 'del', 'groupelements.edit', 'item_element.edit', 'activity', 'publish') ); ?>
Обратите особое внимание на строки:
'groupelements.edit', 'item_element.edit', 'activity', 'publish'
groupelements и item_element это методы из комбинаций модуль-метод:
modulelements-groupelements modulelements-item_element
это иерархические типы данных, которые далее будут использоваться в настройках модуля "Шаблоны данных". Если у какого-либо Пользователя или Группы пользователй, в настройках, будет стоять чекбокс напротив группы прав 'lists' ('Управление страницами'), то при создании страницы с иерархическим типом groupelements (Группа страниц) или item_element (Страница из группы), автоматически для создаваемой страницы проставятся полные права на данную страницу: Просмотр, Редактирование, Создание подстраницы, Удаление, Перемещение.
Данная запись:
'activity', 'publish'
дает право на публикацию страниц, т.е. возможность сделать страницу активной. 'activity' необходим, чтобы менять активность страниц при их табличном отображении.
Файл i18n.php:
<?php $i18n = Array( "label-add-list" => "Добавить группу", "label-add-item" => "Добавить страницу", "header-modulelements-lists" => "Группы и страницы", "header-modulelements-config" => "Настройки модуля", "header-modulelements-add" => "Добавление", "header-modulelements-edit" => "Редактирование", "header-modulelements-add-groupelements" => "Добавление группы", "header-modulelements-add-item_element" => "Добавление страницы", "header-modulelements-edit-groupelements" => "Редактирование группы", "header-modulelements-edit-item_element" => "Редактирование страницы", "header-modulelements-activity" => "Изменение активности", 'perms-modulelements-view' => 'Просмотр страниц', 'perms-modulelements-lists' => 'Управление страницами', ); ?>
Файл lang.php:
<?php $C_LANG = Array(); $C_LANG['module_name'] = "Модуль elements"; $LANG_EXPORT = Array(); ?>
В папке /styles/skins/mac/data/modules/ создим папку modulelements, а в ней xsl шаблон list.view.xsl:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xsl:stylesheet SYSTEM "ulang://common/modulelements"> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="data" priority="1"> <div class="imgButtonWrapper" xmlns:umi="http://www.umi-cms.ru/TR/umi"> <a id="addCategory" href="{$lang-prefix}/admin/modulelements/add/{$param0}/groupelements/" class="type_select_gray" umi:type="modulelements::groupelements"> <xsl:text>&label-add-list;</xsl:text> </a> <a id="addObject" href="{$lang-prefix}/admin/modulelements/add/{$param0}/item_element/" class="type_select_gray" umi:type="modulelements::item_element"> <xsl:text>&label-add-item;</xsl:text> </a> </div> <xsl:call-template name="ui-smc-table"> <xsl:with-param name="js-add-buttons"> <![CDATA[ createAddButton($('#addCategory')[0], oTable, '{$pre_lang}/admin/modulelements/add/{id}/groupelements/', ['groupelements', true]); createAddButton($('#addObject')[0], oTable, '{$pre_lang}/admin/modulelements/add/{id}/item_element/', ['groupelements']); ]]> </xsl:with-param> </xsl:call-template> </xsl:template> </xsl:stylesheet>
В папке clsses/modules/ создадим копию файла i18n.php и переименуем в i18n.ru.php. В файл i18n.ru.php необходимо добавить строку:
"module-modulelements" => "Модуль elements",
В папке /images/cms/admin/mac/icons/, в каждую из папок big, medium, small, необходимо добавить иконки нашего модуля с названием modulelements.png, можно использовать икноку модуля content, т.е. content.png.
В папку /images/cms/admin/mac/tree/ необходимо добавить иконки для каждого типа страниц, в данном случае: ico_modulelements_groupelements.png и ico_modulelements_item_element.png.
Можно использовать иконки модулей контент (ico_content_.png) и каталог (ico_catalog_category.png).
Проинсталлируем наш модуль, для это зайдем в модуль Конфигурация, вкладка Модули. Пропушем путь к инсталляционному файлу:
classes/modules/modulelements/install.php и нажмем кнопку "Установить".
После инсталляции модуля необходимо зайти в настройки пользователя "Гость" и в группе прав модуля "Модуль elements" поставить чебкос для поля "Просмотр страниц".
Даллее заходим в настройки модуля "Шаблоны данных": /admin/data/config/ и добавляем два новых иерархических типа:
Название - Группа страниц Модуль - modulelements Метод - groupelements
и
Название - Страница из группы Модуль - modulelements Метод - item_element
Во вкладке "Типы данных", в разделе "Раздел сайта" создаем два новых типа страниц и в "Назначение типа" выбираем в одном случае "Группа страниц", а в другом "Страница из группы".
Если используются tpl шаблоны, то в папке tpls/modulelements/ создаем шаблон default.tpl c подобным содержанием:
<?php $FORMS = Array(); $FORMS['view'] = <<<END %content% END; $FORMS['group'] = <<<END %content% END; ?>
В клиентской части сайта, при переходе на страницу с типом groupelements, в файле classes/modules/modulelements/class.php будет отрабатываться метод groupelements(), при типе item_element - метод item_element().
