пятница, 12 июля 2013 г.

Cущности конфигурации в Друпал 8

В Drupal 8 появляется новый тип сущности - сущность конфигурации. Кто работал с Drupal 7 тот знаком с понятиями сущностей. Drupal 8 предостовляет новую концепцию сущности конфигурации, которая схожа с CTools exportable(экспортированный) в Drupal 7. В Drupal 7 CTools exportables используется такими модулями как: Views, Panels, Page Manager, Context, что помогает безболезненно экспортировать конфигурацию для хранения в системах контроля версий кода, размещения проектов на различные уровни разработки проектов.z

Примеры сущностей конфигурации
В ядре D8 у нас уже есть сущности конфигурации: Views, cловари, категориии форм контактов, шаблоны электронных сообщений пользователя, различные настройки вывода, экземпляры классов, наборы закладок(shortcuts), пользовательские меню и стили изображений.

Различия от конфигурации контента
Сущности в понимании Drupal 7 были переименованны в сущности контента. Основные различия между сущностями конфигурации и контента - это место, где они сохраняются. Сущности конфигурации сохраняются системой управления конфигурацией в каталоги конфигурации, в файлы yaml, придерживаясь условий наименования файлов. В то время, как сущности контента сохраняются в базу данных. Модуля содержат файлы конфигураций, которые используются для значений по умолчанию. К примеру, в каталогах модулей views находится множество конфигурационных файлов, которые определяют значения по умолчанию. Данная возможность заменяет функционал модуля features, что облегчает миграцию конфигурации между различными экземплярами проектов. Далее идёт раздел статьи , где рассказывается о процессе миграции. Предлагаю вам на выбор просмотреть уже обработанный материал по этой теме, или прочитать на сайте оригинала статьи.

Определение собственной конфигурационной сущности
Определим, что новая сущность и модуль называются robot. Следовательно, PSR-0 необходимо придерживаться правил размещения и наименования. Внутри файла  robot/lib/Drupal/robot/Plugin/Core/Entity/Robot.php объявим класс сущности конфигурации Robot.

/**
 * @file
 * Contains Drupal\robot\Plugin\Core\Entity\Robot.
 */

namespace Drupal\robot\Plugin\Core\Entity;

use Drupal\Core\Config\Entity\ConfigEntityBase;
use Drupal\Core\Annotation\Plugin;
use Drupal\Core\Annotation\Translation;

/**
 * Defines the robot entity.
 *
 * @Plugin(
 *   id = "robot",
 *   label = @Translation("Robot"),
 *   module = "robot",
 *   controller_class = "Drupal\robot\RobotStorageController",
 *   list_controller_class = "Drupal\robot\RobotListController",
 *   form_controller_class = {
 *     "default" = "Drupal\robot\RobotFormController"
 *   },
 *   uri_callback = "robot_uri",
 *   config_prefix = "robot.robot",
 *   entity_keys = {
 *     "id" = "id",
 *     "label" = "label",
 *     "uuid" = "uuid"
 *   }
 * )
 */
class Robot extends ConfigEntityBase {
  // ....Definition of robot's properties...
  // e.g.:

  /**
   * The custom block type ID.
   *
   * @var string
   */
  public $id;
}

Определим функциональные контроллеры: хранения, списка и формы.

Контроллер хранения
Унаследуем/расширим контроллер Drupal\Core\Config\Entity\ConfigStorageController, если нет особой необходимости, тогда, стандартной реализацией достаточно.

Контроллер списка
Это новая особенность в Drupal 8, которая определяет общую логику группирования вывода сущностей в виде списка, что-то схоже на CTools exportables. Логика работы частично схожа с модулем Views.

Для расширения функциональности унаследуйте Drupal\Core\Config\Entity\ConfigEntityListController

Обязательно необходимо реализовать данные методы: buildRow(), buildHeader() и getOperations().

Контроллер формы
Унаследуем Drupal\Core\Entity\EntityFormController реализуем метод form(), используя возможности FAPI. Форма используется пользователем для сохранения данных в сущность.
save() - это метод, где происходит обработка данных формы, происходит процесс формирования объекта сущности, сохранения.

 /**
   * Overrides Drupal\Core\Entity\EntityFormController::save().
   */
  public function save(array $form, array &$form_state) {
    $robot = $this->getEntity($form_state);
    $status = $robot->save();
    // .. do other things with the updated/inserted entity
  }
Есть также и другие методы, которые возможно переопределить для изменения логики работы.

Оригинал статьи.

Комментариев нет:

Отправить комментарий