Создание собственного модуля (страницы) — различия между версиями
VITL' (обсуждение | вклад) |
Mad grant (обсуждение | вклад) |
||
Строка 477: | Строка 477: | ||
В клиентской части сайта, при переходе на страницу с типом groupelements, в файле '''classes/modules/modulelements/class.php''' будет отрабатываться метод '''groupelements()''', при типе item_element - метод '''item_element()'''. | В клиентской части сайта, при переходе на страницу с типом groupelements, в файле '''classes/modules/modulelements/class.php''' будет отрабатываться метод '''groupelements()''', при типе item_element - метод '''item_element()'''. | ||
+ | [[Категория:API]] |
Версия 12:19, 5 июня 2013
Официальная информация по созданию модуля описана на сайте 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().