Расширение класса полей Entityreference для добавления дополнительных полей ввода


В настоящее время я пытаюсь создать пользовательское поле, состоящее из поля ввода EntityReference (виджет автозаполнения) и двух текстовых полей для добавления дополнительной информации в Drupal 8beta11.

Я использовал код из примера модуля и тип поля EntityReference. Я скопировал его в свой пользовательский модуль. Все работало.

Но потом я вспомнил "новый" подход к ООП в Drupal 8. Зачем копировать, когда я могу расширить? Расширение класса EntityReferenceItem сработало без каких-либо проблем. Таблица была создана правильно.

Затем я попытался расширить класс виджета автозаполнения EntityReferenceAutocompleteWidget, чтобы отобразить мои дополнительные два текстовых поля. Здесь это как-то не работает. Ошибка, которую я получаю:

Fatal error: Call to undefined method Drupal\Core\Field\FieldItemList::referencedEntities() in ...\core\lib\Drupal\Core\Field\Plugin\Field\FieldWidget\EntityReferenceAutocompleteWidget.php on line 95

Я знаю, что это означает более или менее, что каким-то образом в элементах $, которые помещаются в метод parent::FormElement, не реализована функция referencedEntities. Но как я могу это исправить?

Я попытался заглянуть в другие модули и даже найдено Drupal\Core\Поле\Плагин\Поле\Fieldwidget\autocompletetagswidget для расширения EntityReferenceAutocompleteWidget, но я не нахожу разницы.

Это мой виджет CompoundReferenceWidget. Я благодарен за любой совет или подсказку, чтобы заставить его работать. Или получить информацию, что это невозможно сделать так, как я пытался.

/**
 * @file
 * Contains \Drupal\compound_reference\Plugin\field\widget\CompoundReferenceWidget.
 */

namespace Drupal\compound_reference\Plugin\Field\FieldWidget;

use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Field\Plugin\Field\FieldWidget\EntityReferenceAutocompleteWidget;
/**
 * Plugin implementation of the 'compound_reference_widget' widget.
 *
 * @FieldWidget(
 *   id = "compound_reference_widget",
 *   module = "compound_reference",
 *   label = @Translation("Modeling a reference with additional fields."),
 *   field_types = {
 *     "compound_reference"
 *   }
 * )
 */
class CompoundReferenceWidget extends EntityReferenceAutocompleteWidget {

  /**
   * {@inheritdoc}
   */
  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    $element = parent::formElement($items, $delta, $element, $form, $form_state);

    $element['description'] = array(
    //$element += array(
      '#type' => 'textfield',
      '#title' => t('Description of the reference.'),
      '#default_value' => isset($items[$delta]->description) ? $items[$delta]->description : NULL,
      //'#min' => 1,
      //'#required' => TRUE,
    );
    $element['start'] = array(
      '#type' => 'textfield',
      '#title' => t('Start Date'),
      '#default_value' => isset($items[$delta]->start) ? $items[$delta]->start : NULL,
      '#description' => t('Start'),
    );

    return $element;
  }
}
 2
Author: Alina, 2015-06-20

1 answers

Ошибка относится к классу списка элементов поля.

Чего вам не хватает, так это определения класса списка в аннотации вашего типа поля, для всего, что является ссылкой на сущность, вам необходимо явно указать его, поскольку аннотации не наследуются. См. Элемент EntityReferenceItem:

*   list_class = "\Drupal\Core\Field\EntityReferenceFieldItemList",
 3
Author: Berdir, 2015-06-21 09:14:51