Drupal → Расширить сторонний форматтер своим функционалом

11.05.2019

Пример добавления для форматтера text_default функционала обрезки текста:

// MODULENAME.module

/**
 * Implements hook_field_formatter_third_party_settings_form().
 */
function MODULENAME_field_formatter_third_party_settings_form(FormatterInterface $plugin, FieldDefinitionInterface $field_definition, $view_mode, array $form, FormStateInterface $form_state) {
  $element = [];

  if ($plugin->getPluginId() == 'text_default') {
    $element['max_length'] = [
      '#type' => 'number',
      '#title' => t('Max length'),
      '#default_value' => $plugin->getThirdPartySetting('MODULENAME', 'max_length'),
    ];
  }

  return $element;
}

/**
 * Implements hook_entity_display_build_alter().
 */
function MODULENAME_entity_display_build_alter(&$build, $context) {
  $display = $context['display']; /** @var EntityViewDisplayInterface $display */

  foreach (Element::children($build) as $field_name) {
    if ($build[$field_name]['#formatter'] == 'text_default') {
      $formatter = $display->getRenderer($field_name); /** @var FormatterInterface $formatter */
      if ($max_length = $formatter->getThirdPartySetting('MODULENAME', 'max_length')) {
        foreach (Element::children($build[$field_name]) as $delta) {
          $build[$field_name][$delta]['#text'] = Unicode::truncate($build[$field_name][$delta]['#text'], $max_length);
        }
      }
    }
  }
}
# config/schema/MODULENAME.schema.yml

field.formatter.third_party.MODULENAME:
  type: mapping
  label: 'MODULENAME module formatter settings'
  mapping:
    max_length:
      type: integer
      label: 'Maximum text length'

Не самый оптимальный вариант, лучше создать свой форматтер, если есть возможность.

Подробнее про Third Party Settings.
Пример расширения стороннего виджета.

Написанное актуально для
Drupal 8
Похожие записи

Добавить комментарий