Примеры

В 2.6 подключаемые библиотеки админки работают так же, только необходимо указать, что подключаемый класс наследуется от класса baseModuleAdmin:

<?php
 abstract class __news extends baseModuleAdmin {
  //TODO: ...
 };
?>

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

abstract class __news extends baseModuleAdmin {
 public function lists() {
  //Получение id родительской страницы. Если передан неверный id, будет выброшен exception
  $parent_id = $this->expectElementId('param0');
 
  $per_page = 25;
  $curr_page = getRequest('p');
 
  //Подготавливаем выборку
  $sel = new umiSelection;
  $sel->addLimit($per_page, $curr_page);
  $hierarchy_type_id = umiHierarchyTypesCollection::getInstance()->getTypeByName("news", "rubric")->getId();
  $sel->addElementType($hierarchy_type_id);
  $sel->addHierarchyFilter($parent_id);
 
  //Выполняем выборку. В $result теперь будет лежать массив id страниц - результат выборки
  $result = umiSelectionsParser::runSelection($sel);
  $total = umiSelectionsParser::runSelectionCounts($sel);
 
  //Вывод данных
  //Устанавливаем тип для вывода данных в "list" - список
  $this->setDataType("list");
 
  //Устанавливаем действие над списокм - "view" - просмотр списка
  $this->setActionType("view");
 
  //Указываем диапазон данных
  $this->setDataRange($per_page, $curr_page * $per_page);
 
  //Подготавливаем данные, чтобы потом корректно их вывести
  $data = $this->prepareData($result, "pages");
 
  //Завершаем вывод
  $this->setData($data, $total);
  return $this->doData();
 }
};

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

abstract class __users extends baseModuleAdmin {
 public function users_list_all() {
  $per_page = 50;
  $curr_page = 0;
 
  $objectTypes = umiObjectTypesCollection::getInstance();
  $type_id = $objectTypes->getBaseType("users", "user");
 
  //Подготавливаем выборку
  $sel = new umiSelection;
  $sel->addObjectType($type_id);
  $sel->addLimit($per_page, $curr_page);
 
  //Выполняем выборку.
  $result = umiSelectionsParser::runSelection($sel);
  $total = umiSelectionsParser::runSelectionCounts($sel);
 
  $this->setDataType("list");
  $this->setActionType("view");
  $this->setDataRange($per_page, $curr_page * $per_page);
 
  //Подготавливаем данные. Отличие только во 2м параметре
  $data = $this->prepareData($result, "objects");
 
  $this->setData($data, $total);
  return $this->doData();
 }
};

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

abstract class __subjects_news extends baseModuleAdmin {
 public function subjects() {
  $objectTypesCollection = umiObjectTypesCollection::getInstance();
  $objectsCollection = umiObjectsCollection::getInstance();
 
  $type_id = $objectTypesCollection->getBaseType("news", "subject");
 
  //Получаем 1й параметр
  $mode = (string) getRequest('param0');
 
  //Если 1й параметр равен "do", значит нужно что-то сделать
  if($mode == "do") {
   //Нужно подготовить массив с параметрами для ф-ии saveEditedList
   $params = Array(
    "type_id" => $type_id
   );
 
   /* Говорим, что нам что-то пришло в POST'е и это что-то 
    является списком отредактированных объектов
   */
   $this->saveEditedList("objects", $params);
 
   //Делаем переадресацию
   $this->chooseRedirect();
  }
 
  $per_page = 25;
  $curr_page = getRequest('p');
 
  $subjects_guide = $objectsCollection->getGuidedItems($type_id);
 
  $subjects = array_keys($subjects_guide);
  $total = sizeof($subjects);
 
  $this->setDataType("list");
 
  //Тут мы указываем, что список должен быть редактируемым
  $this->setActionType("modify");
  $this->setDataRange($per_page, $curr_page * $per_page);
 
  $data = $this->prepareData($subjects, "objects");
 
  $this->setData($data, $total);
  return $this->doData();
 }
};

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

abstract class __news extends baseModuleAdmin {
 public function edit() {
  //Указываем, что в первом параметре мы ожидаем id страницы
  //Если все хорошо, то нам вернется umiHierarchyElement, если нет,
  //то будет выброшен соответствующий exception
  $element = $this->expectElement("param0");
  $mode = (String) getRequest('param1');
 
  $inputData = Array( "element" => $element,
     "allowed-element-types" => Array('rubric', 'item'));
 
  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();
 }
};

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

abstract class __news extends baseModuleAdmin {
 public function add() {
  $parent = $this->expectElement("param0");
 
  //Получаем название типа. Id типа данных будет
  //автоматически определен в ф-ях saveAddedElementData или prepareData
  $type = (string) getRequest("param1");
  $mode = (string) getRequest("param2");
 
  //Подготавливаем список параметров
  $inputData = Array( "type" => $type, 
     "parent" => $parent,
     "allowed-element-types" => Array('rubric', 'item'));
 
  if($mode == "do") {
   $this->saveAddedElementData($inputData);
   $this->chooseRedirect();
  }
 
  $this->setDataType("form");
  $this->setActionType("create");
 
  $data = $this->prepareData($inputData, "page");
 
  $this->setData($data);
  return $this->doData();
 }
};

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

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

abstract class __users extends baseModuleAdmin {
 public function edit() {
  //Тоже самое, что и expectElement, но для объектов
  $object = $this->expectObject("param0");
  $mode = (string) getRequest('param1');
 
  if($mode == "do") {
   $this->saveEditedObjectData($object);
   $this->chooseRedirect();
  }
 
  $this->setDataType("form");
  $this->setActionType("modify");
 
  $data = $this->prepareData($object, "object");
 
  $this->setData($data);
  return $this->doData();
 }
};

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

abstract class __users extends baseModuleAdmin {
 public function add() {
  $type = (string) getRequest("param0");
  $mode = (string) getRequest("param1");
 
  $inputData = Array("type" => $type);
 
  if($mode == "do") {
   $this->saveAddedObjectData($inputData);
   $this->chooseRedirect();
  }
 
  $this->setDataType("form");
  $this->setActionType("create");
 
  $data = $this->prepareData($inputData, "object");
 
  $this->setData($data);
  return $this->doData();
 }
};

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

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

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

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

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

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

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

  • int

  • float

  • boolean

  • string

  • email

  • status

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

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

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

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

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

    abstract class __news extends baseModuleAdmin {
     public function config() {
      $regedit = regedit::getInstance();
     
      //Подготавливаем параметры и забиваем в него NULL'ы
      $params = Array(
       'config' => Array(
        'int:per_page' => NULL
       )
      );
     
      $mode = (string) getRequest('param0');
     
      if($mode == 'do') {
       //Говорим, что мы ожидаем в POST'е параметры, описанные в $params
       //Ф-я expectParams заполнит его значениями или выбросит exception
       $params = $this->expectParams($params);
     
       //Смело обращаемся к массиву и получаем нужные значения
       $regedit->setVar('//modules/news/per_page', $params['config']['int:per_page']);
       $this->chooseRedirect();
      }
     
      //Заполняем массив значениями
      $params['config']['int:per_page'] = (int) $regedit->getVal('//modules/news/per_page');
     
      $this->setDataType('settings');
      $this->setActionType('modify');
     
      $data = $this->prepareData($params, 'settings');
     
      $this->setData($data);
      return $this->doData();
     }
    };
    

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

abstract class __catalog extends baseModuleAdmin {
 public function activity() {
  $element = $this->expectElement("param0");
  $is_active = getRequest('param1');
 
  $params = Array(
   "element" => $element,
   "allowed-element-types" => Array('category', 'object'),
   "activity" => $is_active
  );
 
  $this->switchActivity($params);
  $element->commit();
 
  $this->chooseRedirect();
 }
};

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

abstract class __catalog extends baseModuleAdmin {
 public function del() {
  $element = $this->expectElement("param0");
 
  $params = Array(
   "element" => $element,
   "allowed-element-types" => Array('category', 'object')
  );
 
  $this->deleteElement($params);
  $this->chooseRedirect();
 }
};

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

abstract class __banners extends baseModuleAdmin {
 public function del() {
  $object = $this->expectElement("param0");
 
  $params = Array(
   "object" => $object,
   "allowed-element-types" => Array('banner', 'place')
  );
 
  $this->deleteObject($params);
  $this->chooseRedirect();
 }
};