xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

Пример добавления нового функционала виджету text_textarea, с помощью которого можно будет включать динамическую высоту поля в зависимости от длины текста.

Реализация состоит из двух частей:

1. Добавление опции в настройки виджета с помощью hook_field_widget_third_party_settings_form
2. Альтер формы виджета с помощью hook_field_widget_form_alter или hook_field_widget_WIDGET_TYPE_form_alter

modulename.module

/**
 * Implements hook_field_widget_third_party_settings_form().
 */
function modulename_field_widget_third_party_settings_form(WidgetInterface $widget, FieldDefinitionInterface $field_definition, $form_mode, $form, FormStateInterface $form_state) {
  $element = [];
 
  if ($widget->getPluginId() == 'text_textarea') {
    $element['dynamic_height'] = [
      '#type' => 'checkbox',
      '#title' => t('Dynamic height'),
      '#default_value' => $widget->getThirdPartySetting('modulename', 'dynamic_height'),
    ];
  }
 
  return $element;
}
 
/**
 * Implements hook_field_widget_form_alter().
 */
function modulename_field_widget_form_alter(&$element, FormStateInterface $form_state, $context) {
  /** @var WidgetInterface $widget */
  $widget = $context['widget'];
 
  if ($widget->getPluginId() == 'text_textarea') {
    if ($widget->getThirdPartySetting('modulename', 'dynamic_height')) {
      $element['#rows'] = modulename_get_textarea_rows($element['#default_value']);
    }
  }
}

config/schema/modulename.schema.yml

field.widget.third_party.modulename:
  type: mapping
  label: 'Modulename widget settings'
  mapping:
    dynamic_height:
      type: boolean
      label: 'Dynamic height'

Результат:

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

Комментарии RSS

modulename_field_widget_form_alter

Можно взять более специфичный hook_field_widget_WIDGET_TYPE_form_alter.

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

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании