<?php
 class NewsAdmin {

use baseModuleAdmin; //TODO: ... }; ?>

Вывод списка страниц

class NewsAdmin {

use baseModuleAdmin;

public $module;

public function lists() {
// Устанавливаем тип данных - список
$this->setDataType('list');

// Устанавливаем тип операции - просмотр
$this->setActionType('view');

// Если метод вызван не через /.xml - ничего не возвращаем
if ($this->module->ifNotXmlMode()) {
$this->setDirectCallError();
  $this->doData();
return true;
}

// Получаем настройки постраничного вывода
$limit = getRequest('per_page_limit');
$currentPage = getRequest('p');
$offset = $currentPage * $limit;

// Делаем выборку страниц модуля
$sel = new selector('pages');

// Применяем фильтры и сортировку
if (!selectorHelper::isFilterRequested()) {
$sel->types('object-type')->name('news', 'rubric');
}

$sel->types('object-type')->name('news', 'item'); if (is_array(getRequest('rel')) && Service::Registry()->get('//modules/comments')) {
$sel->types('object-type')->name('comments', 'comment');
}

$sel->limit($offset, $limit);
selectorHelper::detectFilters($sel);

// Устанавливаем результаты работы метода
$data = $this->prepareData($sel->result(), 'pages');
$this->setData($data, $sel->length());
$this->setDataRangeByPerPage($limit, $currentPage);
$this->doData();
} };

Вывод списка объектов

class UsersAdmin {
use baseModuleAdmin;
public $module;
public function users_list() { $this->setDataType('list');
$this->setActionType('view');
if ($this->module->ifNotXmlMode()) {
$this->setDirectCallError();
$this->doData();
return true;
}
$limit = getRequest('per_page_limit');
$curr_page = (int) getRequest('p');
$offset = $limit * $curr_page;
$sel = new selector('objects');
$sel->types('object-type')->name('users', 'user');
$sel->limit($offset, $limit);
if (getRequest('param0') == 'outgroup') {
$sel->where('groups')->isnull();
} else {
$groupId = $this->expectObjectId('param0');
if ($groupId) {
$sel->where('groups')->equals($groupId);
}
} //Получаем права пользователя
$umiPermissions = permissionsCollection::getInstance();
if (!$umiPermissions->isSv()) {
$sel->where('id')->notequals(Service::SystemUsersPermissions()->getSvUserId());
}

// получаем логин пользователя $loginSearch = getRequest('search');

if ($loginSearch) {
$sel->where('login')->like('%' . $loginSearch . '%');
}
selectorHelper::detectFilters($sel);
$this->setDataRange($limit, $offset);
$data = $this->prepareData($sel->result(), 'objects');
$this->setData($data, $sel->length());
$this->doData(); } };

Вывод редактируемого списка объектов

class NewsAdmin {
use baseModuleAdmin;
public $module; public function subjects() { $objectTypesCollection = umiObjectTypesCollection::getInstance(); $objectsCollection = umiObjectsCollection::getInstance(); $typeId = $objectTypesCollection->getBaseType("news", "subject"); //Проверяем является ли текущий запрос запросом на сохранение данных if($this->isSaveMode()) { //Нужно подготовить массив с параметрами для ф-ии saveEditedList $params = [ "type_id" => $typeId ]; /* Говорим, что нам что-то пришло в POST'е и это что-то является списком отредактированных объектов */ $this->saveEditedList("objects", $params); //Делаем переадресацию $this->chooseRedirect(); } $perPage = 25; $currentPage = getRequest('p'); $subjectsGuide = $objectsCollection->getGuidedItems($typeId); $subjects = array_keys($subjectsGuide); $total = umiCount($subjects); $this->setDataType("list"); //Тут мы указываем, что список должен быть редактируемым $this->setActionType("modify"); $this->setDataRange($perPage, $currentPage * $perPage); $data = $this->prepareData($subjects, "objects"); $this->setData($data, $total); $this->doData(); } };

Редактирование страниц

class NewsAdmin {

use baseModuleAdmin;

public $module;
public function edit() { //Указываем, что в первом параметре мы ожидаем id страницы //Если все хорошо, то нам вернется umiHierarchyElement, если нет, //то будет выброшен соответствующий exception $element = $this->expectElement("param0", true); $this->setHeaderLabel('header-news-edit-' . $this->getObjectTypeMethod($element->getObject()));

$inputData = [
'element' => $element,
'allowed-element-types' => [
'rubric',
'item'
]
];
if ($this->isSaveMode('param1')) {
$this->saveEditedElementData($inputData);
$this->chooseRedirect();
} $this->setDataType("form"); $this->setActionType("modify"); $data = $this->prepareData($inputData, "page"); $this->setData($data); return $this->doData(); } };

Создание страниц

class NewsAdmin {

use baseModuleAdmin;

public $module;
public function add() { $parent = $this->expectElement("param0"); //Получаем название типа. Id типа данных будет //автоматически определен в ф-ях saveAddedElementData или prepareData $type = (string) getRequest("param1"); $this->setHeaderLabel('header-news-add-' . $type); //Подготавливаем список параметров $inputData = [
"type" => $type, "parent" => $parent,
"type-id" =>getRequest('type-id'); "allowed-element-types" => [
'rubric',
'item'
]
]
; if($this->isSaveMode('param2')) { $element_id = $this->saveAddedElementData($inputData);
if ($type == 'item') {
umiHierarchy::getInstance()->moveFirst(
$element_id,
($parent instanceof iUmiHierarchyElement) ? $parent->getId() : 0
);
}
$this->chooseRedirect(); } $this->setDataType("form"); $this->setActionType("create"); $data = $this->prepareData($inputData, "page"); $this->setData($data); $this->doData(); } };

Обратите внимание, что в param1 должен быть передан один из методов, которые указан в $inputData allowed-element-types.

Редактирование объектов

class UsersAdmin {

use baseModuleAdmin;

public $module;
public function edit() { //Тоже самое, что и expectElement, но для объектов $object = $this->expectObject("param0"); $objectId = $object->getId(); $this->setHeaderLabel('header-users-edit-' . $this->getObjectTypeMethod($object));
$this->checkSv($objectId);
$inputData = [
'object' => $object,
'aliases' => ['name' => 'login'],
'allowed-element-types' => ['users', 'user']
];
if ($this->isSaveMode('param1')) {
try {
Service::Protection()->checkReferrer();
} catch (Exception $e) {
$this->module->errorNewMessage(getLabel('error-users-non-referer'));
$this->module->errorPanic();
}
$this->validateRepeatPassword();
/** @var iUmiObject $object */
$object = $this->saveEditedObjectData($inputData);
$objectId = $object->getId();
$systemUsersPermissions = Service::SystemUsersPermissions();
$guestId = $systemUsersPermissions->getGuestUserId();
$auth = Service::Auth();
$userId = $auth->getUserId();
$svUserId = $systemUsersPermissions->getSvUserId();
if (in_array($object->getId(), [$userId, $guestId, $svUserId])) {
if (!$object->getValue('is_activated')) {
$object->setValue('is_activated', true);
$object->commit();
}
}
$this->module->save_perms($objectId, __FUNCTION__);
$this->chooseRedirect();
} $this->setDataType("form"); $this->setActionType("modify"); $data = $this->prepareData($inputData, "object"); $this->setData($data); $this->doData(); } };

Создание объектов

class UsersAdmin {
use baseModuleAdmin;

public $module;
public function add() { $type = (string) getRequest("param0"); $this->setHeaderLabel('header-users-add-' . $type);
$inputData = [
'type' => $type,
'type-id' => getRequest('type-id'),
'aliases' => ['name' => 'login'],
'allowed-element-types' => ['user', 'users']
];
if ($this->isSaveMode('param1')) {
$object = $this->saveAddedObjectData($inputData);
$permissions = permissionsCollection::getInstance();
$svGroupId = Service::SystemUsersPermissions()
->getSvGroupId();
$auth = Service::Auth();
if (!$permissions->isSv($auth->getUserId())) {
$groups = $object->getValue('groups');
if (in_array($svGroupId, $groups)) {
unset($groups[array_search($svGroupId, $groups)]);
$object->setValue('groups', $groups);
}
}
$object->setValue('user_dock', 'seo,content,news,blogs20,forum,comments,vote,webforms,photoalbum,dispatches,catalog,emarket,banners,users,stat,exchange,trash');
$object->commit();
$this->module->save_perms($object->getId(), __FUNCTION__);
$this->chooseRedirect($this->module->pre_lang . '/admin/users/edit/' . $object->getId() . '/');
} $this->setDataType("form"); $this->setActionType("create"); $data = $this->prepareData($inputData, "object"); $this->setData($data); $this->doData(); } };

Обратите внимание, что в param0 должен быть передан один из методов, которые указан в $inputData allowed-element-types.

Вывод редактирования настроек

В данном случае мы подготавливаем массив $params, который:

  • Определяет структуру формы

  • Используется для получения данных из POST'а

  • Валидирует отправляемые параметры по префиксу ("int:")

Первое измерение массива - это название группы настроек. Вложенный массив - название ключей настроек. Перед названием каждого поля идет префикс, который определяет, какого типа данные там могут содержаться. На данный момент поддерживаются следующие типы:

  • int

  • float

  • boolean

  • string

  • email

  • status

  • select - выбор варианта из списка. Передается ассоциативным массивом:

    $params = [
     'config' => [
      'select:selectbox-sample' => [
       '10' => 'foo',
       '23' => 'bar',
       '53' => 'zoo',
       'my' => 'xyz',
       'value' => '53' //Значение списка
      ]
     ]
    ];
    
  • guide - выбор объектов из справочника

    $params = [
     'config' => [
      'guide:gudie-sample' => [
       'type-id' => 4, //Id типа данных справочника
       'value' => 14 //Id объекта - значения списка
      ]
     ]
    ];
    
  • templates - выбор шаблона из списка шаблонов

    $params = [
     'config' => [
      'templates:templates-sample' => 6 //Id выбранного шаблона
      ]
    ];
    
  • password - с OpenSSL шифрованием

    Пример использования:

    abstract class __news extends baseModuleAdmin {
     public function config() {
      $regEdit = Service::Registry();
     
      //Подготавливаем параметры и забиваем в него NULL'ы
      $params = [
       'config' => [
        'int:per_page' => null,
        'int:rss_per_page' => null 
       ]
      ];
      
      if ($this->isSaveMode()) {
    $params = $this->expectParams($params);
    $regEdit->set('//modules/news/per_page', (int) $params['config']['int:per_page']);
    $regEdit->set('//modules/news/rss_per_page', (int) $params['config']['int:rss_per_page']);
    $this->chooseRedirect();
    } $params['config']['int:per_page'] = (int) $regEdit->get('//modules/news/per_page');
    $params['config']['int:rss_per_page'] = (int) $regEdit->get('//modules/news/rss_per_page');
    $params['config']['int:rss_per_page'] = $params['config']['int:rss_per_page'] > 0
    ? $params['config']['int:rss_per_page']
    : 10; $this->setConfigResult($params); } };

Изменение активности страницы

class CatalogAdmin {
use baseModuleAdmin;

public $module;
public function activity() { $this->changeActivityForPages(['category', 'object']); } };

Удаление страницы

class CatalogAdmin {
use baseModuleAdmin;

public $module;
public function del() { $elements = getRequest('element');

if (!is_array($elements)) {
$elements = [$elements];
}
foreach ($elements as $elementId) {
$element = $this->expectElement($elementId, false, true);
$params = [
'element' => $element,
'allowed-element-types' => [
'category',
'object'
]
];
$this->deleteElement($params);
}
$this->setDataType('list');
$this->setActionType('view');
$data = $this->prepareData($elements, 'pages');
$this->setData($data);
$this->doData(); } };

Удаление объекта

class BannersAdmin {
use baseModuleAdmin;

public $module;
public function del() { $objects = getRequest('element'); if (!is_array($objects)) {
$objects = [$objects];
}
foreach ($objects as $objectId) {
$object = $this->expectObject($objectId, false, true);>
$params = [
'object' => $object,
'allowed-element-types' => [
'banner',
'place'
]
];
$this->deleteObject($params);
}
$this->setDataType('list');
$this->setActionType('view');
$data = $this->prepareData($objects, 'objects');
$this->setData($data);
$this->doData(); } };