Расширение класса полей 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;
}
}
1 answers
Ошибка относится к классу списка элементов поля.
Чего вам не хватает, так это определения класса списка в аннотации вашего типа поля, для всего, что является ссылкой на сущность, вам необходимо явно указать его, поскольку аннотации не наследуются. См. Элемент EntityReferenceItem:
* list_class = "\Drupal\Core\Field\EntityReferenceFieldItemList",