Создание собственного модуля (страницы)

Материал из 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().