<?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();
}
};