Рейтинг:1

Расширенный виджет выбора ядра

флаг tr

Пожалуйста, помогите со следующим:

Мне нужен новый виджет (просто немного измененный выбор), который может быть настроен кем угодно из пользовательского интерфейса. Я сделал следующее:

  1. Создал новый пользовательский модуль и включил его.

  2. Создал новый виджет.

<?php

пространство имен Drupal\filtered_select\Plugin\Field\FieldWidget;

используйте Drupal\Core\Field\FieldItemListInterface;
используйте Drupal\Core\Field\Plugin\Field\FieldWidget\OptionsSelectWidget;
используйте Drupal\Core\Form\FormStateInterface;

/**
 * Реализация плагина виджета filtered_select.
 *
 * @FieldWidget(
 * идентификатор = "filtered_select",
 * label = @Translation("Отфильтрованный выбор"),
 * типы полей = {
 * "entity_reference"
 * },
 * несколько_значений = ЛОЖЬ
 * )
 */
класс FilteredSelectWidget расширяет OptionsSelectWidget {

  /**
   * {@inheritdoc}
   */
  публичная функция formElement(FieldItemListInterface $items, $delta, элемент массива $, массив &$form, FormStateInterface $form_state) {
    $element = parent::formElement($items, $delta, $element, $form, $form_state);
    // Используем функцию родительского выбора,
    // просто переключите элемент.
    $element['#type'] = 'fselect';

    вернуть $элемент;
  }

}

  1. Создал новый элемент, чтобы я мог переключать тему. (не уверен, что это необходимо)
<?php

пространство имен Drupal\filtered_select\Element;

используйте Drupal\Core\Render\Element\Select;

/**
 * Предоставляет отфильтрованный элемент выбора.
 * 
 * @FormElement("fselect")
 */
класс FilteredSelect расширяет Select {

  /**
   * {@inheritdoc}
   */
  публичная функция getInfo() {
    $info = родитель::getInfo();

    // Переключатель темы.
    $info['#theme'] = 'fselect';

    вернуть $информацию;
  }
}

  1. В противном случае это не сработало, поэтому я также добавил hook_theme в свой файл модуля, например:
/**
 * Реализует hook_theme().
 */
функция filtered_select_theme ($ существующая, $ тип, $ тема, $ путь): массив {
    возвращаться [
        'fвыбрать' => [
            'рендерить элемент' => 'элемент',
            'шаблон' => 'fselect',
        ],
    ];
}
  
  1. Я просто скопировал шаблон из ядра в свой пользовательский модуль, и он работает в том смысле, что он печатает правильный шаблон, я еще не изменил этот, я просто хочу сначала получить ту же старую основную функциональность, работающую под другим именем.

Проблема: В моем новом элементе рендеринга отсутствует массив параметров, и я не могу понять, почему. Я сделал действительно базовую перезапись и не могу понять, почему он не создает массив параметров.

Свалки Twig Var:

--- ЭТО ОСНОВНОЙ ВЫБОР ---

массив: 15 [≥ ¼
  "элемент" => массив: 41 [ ¶]
  "theme_hook_original" => "выбрать"
  "атрибуты" => Drupal\Core\Template\Attribute {#7543 â¶}
  "title_attributes" => Drupal\Core\Template\Attribute {#7932 â¶}
  "content_attributes" => Drupal\Core\Template\Attribute {#7896 â¶}
  "префикс_названия" => []
  "title_suffix" => []
  "db_is_active" => истина
  "is_admin" => правда
  "logged_in" => правда
  "user" => Drupal\Core\Session\AccountProxy {#2354 â¶}
  "каталог" => "ядро/темы/семь"
  "options" => массив: 3 [â¼0 => массив: 4 [â¶]
    1 => массив: 3 [▶]
    2 => массив: 3 [▶]
  ]
  "#cache" =>массив:1 [❖]
  "theme_hook_suggestions" => []
]

--- ЭТО МОЙ 'НОВЫЙ' фильтрованный выбор ---

массив: 14 [≈ ¼
  "элемент" => массив: 41 [ ¶]
  "theme_hook_original" => "fselect"
  "атрибуты" => Drupal\Core\Template\Attribute {#7543 â¶}
  "title_attributes" => Drupal\Core\Template\Attribute {#8034 â¶}
  "content_attributes" => Drupal\Core\Template\Attribute {#7708 â¶}
  "префикс_названия" => []
  "title_suffix" => []
  "db_is_active" => истина
  "is_admin" => правда
  "logged_in" => правда
  "user" => Drupal\Core\Session\AccountProxy {#2354 â¶}
  "каталог" => "ядро/темы/семь"
  "#cache" =>массив:1 [❖]
  "theme_hook_suggestions" => []
]

Как видите, мне не хватает массива параметров, и я не могу понять, почему. Пожалуйста, порекомендуйте.

Рейтинг:1
флаг cn

Вам не хватает template_preprocess_select(). Вы можете скопировать код в свой собственный хук предварительной обработки для fвыбрать или, что может быть лучше, расширить Выбрать в качестве базового хука и используйте двойное подчеркивание select__fвыбрать для расширенного имени шаблона. Видеть Как определить пользовательский файл html.html.twig?

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

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.