Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll

Создание типа поля в модуле Drupal

26/04/2020, by maria

Типы полей определяют свойства и поведение полей. Типы полей определяются как плагины, поэтому рекомендуется ознакомиться с API плагинов перед тем, как приступить к написанию нового типа поля.

Чтобы создать тип поля в Drupal 8, вам нужен класс с аннотацией FieldType.

Расположение класса типа поля должно быть помещено в MODULE_NAME/src/Plugin/Field/FieldType
/modules/foo/src/Plugin/Field/FieldType/BazItem.php

Пространство имен этого класса должно быть Drupal\MODULE_NAME\Plugin\Field\FieldType

<?php

namespace Drupal\MODULE_NAME\Plugin\Field\FieldType;

Аннотация над классом внутри комментария к документу должна включать уникальный идентификатор, метку и средство форматирования по умолчанию. Форматтер по умолчанию будет идентификатором, используемым в аннотации класса форматера поля.

/**
 * Provides a field type of baz.
 * 
 * @FieldType(
 *   id = "baz",
 *   label = @Translation("Baz field"),
 *   default_formatter = "baz_formatter",
 *   default_widget = "baz_widget",
 * )
 */

Класс должен реализовывать интерфейс FieldItemInterface. И должен расширить класс FieldItemBase для общей реализации интерфейса.

class BazItem extends FieldItemBase {

}

FieldItemInterface::schema() должен быть переопределен, чтобы сообщить системе, как хранить значения для поля

/**
 * {@inheritdoc}
 */
public static function schema(FieldStorageDefinitionInterface $field_definition) {
  return array(
    // columns contains the values that the field will store
    'columns' => array(
      // List the values that the field will save. This
      // field will only save a single value, 'value'
      'value' => array(
        'type' => 'text',
        'size' => 'tiny',
        'not null' => FALSE,
      ),
    ),
  );
}

Этот метод возвращает массив спецификаций столбцов API схемы.

Метод FieldItemInterface::propertyDefinitions() сообщает системе более подробную информацию о ваших свойствах поля

/**
 * {@inheritdoc}
 */
public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
  $properties = [];
  $properties['value'] = DataDefinition::create('string');

  return $properties;
}

Метод Map::isEmpty (предок FieldItemBase) должен быть переопределен, сообщая системе, как определить, когда поле пусто.

/**
 * {@inheritdoc}
 */
public function isEmpty() {
  $value = $this->get('value')->getValue();
  return $value === NULL || $value === '';
}

Настройки поля

Настройки поля позволяют пользователям настраивать поле в соответствии с их потребностями. Если поле имеет какие-либо настройки поля, необходимо сделать три шага:

  1. Переопределите FieldItemBase::defaultFieldSettings(), чтобы установить значения по умолчанию
  2. Создайте схему конфигурации для созданных вами настроек
  3. Создайте форму, чтобы позволить пользователям изменять настройки

 

Шаг 1: переопределить FieldItemBase::defaultFieldSettings()

/**
 * {@inheritdoc}
 */
public static function defaultFieldSettings() {
  return [
    // Declare a single setting, 'size', with a default
    // value of 'large'
    'size' => 'large',
  ] + parent::defaultFieldSettings();
}

Шаг 2. Создайте схему конфигурации для созданных вами настроек

Схема конфигурации идет в следующем файле:

[MODULE ROOT]/config/schema/[MODULE_NAME].schema.yml

В этом файле вы опишите тип (ы) данных настроек, которые вы создали в defaultFieldSettings():

Шаг 1 создал параметр с именем «size», в котором хранится строковое значение. Схема для этого будет выглядеть следующим образом:

field.field_settings.[FIELD ID]:
  type: mapping
  label: 'FIELDNAME settings'
  mapping:
    size:
      type: string
      label: 'Size'

Шаг 3: Создайте форму, чтобы позволить пользователям изменять настройки

Форма, позволяющая пользователям изменять значения параметров, создается путем переопределения FieldItemBase::fieldSettingsForm()

/**
 * {@inheritdoc}
 */
public function fieldSettingsForm(array $form, FormStateInterface $form_state) {
  
  $element = [];
  // The key of the element should be the setting name
  $element['size'] = [
    '#title' => $this->t('Size'),
    '#type' => 'select',
    '#options' => [
      'small' => $this->t('Small'),
      'medium' => $this->t('Medium'),
      'large' => $this->t('Large'),
    ],
    '#default_value' => $this->getSetting('size'),
  ];

  return $element;
}

Реальный пример

RgbItem из модуля field_example в проекте примеров:

namespace Drupal\field_example\Plugin\Field\FieldType;

use Drupal\Core\Field\FieldItemBase;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\TypedData\DataDefinition;

/**
 * Plugin implementation of the 'field_example_rgb' field type.
 *
 * @FieldType(
 *   id = "field_example_rgb",
 *   label = @Translation("Example Color RGB"),
 *   module = "field_example",
 *   description = @Translation("Demonstrates a field composed of an RGB color."),
 *   default_widget = "field_example_text",
 *   default_formatter = "field_example_simple_text"
 * )
 */
class RgbItem extends FieldItemBase {

  /**
   * {@inheritdoc}
   */
  public static function schema(FieldStorageDefinitionInterface $field_definition) {
    return array(
      'columns' => array(
        'value' => array(
          'type' => 'text',
          'size' => 'tiny',
          'not null' => FALSE,
        ),
      ),
    );
  }

  /**
   * {@inheritdoc}
   */
  public function isEmpty() {
    $value = $this->get('value')->getValue();
    return $value === NULL || $value === '';
  }

  /**
   * {@inheritdoc}
   */
  public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
    $properties['value'] = DataDefinition::create('string')
      ->setLabel(t('Hex value'));

    return $properties;
  }

}

 

Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.