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'
Результат:
Комментарии
Можно взять более специфичный hook_field_widget_WIDGET_TYPE_form_alter.
Оставить комментарий