Je crée un widget de champ personnalisé pour un entity_reference
champ. Cela a un champ de sélection personnalisé et un bouton Soumettre Ajax. Une fois que l'utilisateur a sélectionné une option (entité) dans le champ select_field et l'a soumise, j'ajoute l'entité dans un dragTable
ci-dessous.
Je pourrais y parvenir jusqu'à présent, mais mon besoin est d'ajouter une étiquette personnalisée pour l'entité sélectionnée. J'ai fourni un champ de texte pour capturer les valeurs personnalisées et je suis capable de récupérer les valeurs. Mais, je ne parviens pas à enregistrer cette personnalisation text_field
Les données. J'étends la classe principale WidgetBase
pour mon widget de champ personnalisé. Pour un champ entity_reference, est-il possible d'enregistrer des paramètres d'étiquette personnalisés avec les entités?
Mise à jour: Après avoir activé fieldType, des résultats en double apparaissent lors de la création du champ. Une aide à ce sujet? .
Vous devez créer un type de champ personnalisé pouvant contenir la valeur avec la référence d'entité.
Un widget de champ ne peut pas stocker de données pour lesquelles le type de champ n'a pas fourni d'espace.
Vous devez créer un nouveau type de champ qui ressemblerait à ceci:
<?php
namespace Drupal\MY_MODULE\Plugin\Field\FieldType;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\Core\TypedData\DataDefinition;
/**
* @FieldType(
* id = "entity_reference_with_value",
* label = @Translation("Entity reference with value"),
* category = @Translation("Reference"),
* default_widget = "my_custom_field_widget",
* default_formatter = "some_formatter",
* list_class = "\Drupal\Core\Field\EntityReferenceFieldItemList",
* )
*/
class EntityReferenceWithValue extends EntityReferenceItem {
/**
* {@inheritdoc}
*/
public static function schema(FieldStorageDefinitionInterface $field_definition) {
$schema = parent::schema($field_definition);
$schema['columns']['value'] = [
'type' => 'varchar',
'length' => 255,
];
return $schema;
}
/**
* {@inheritdoc}
*/
public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
$properties = parent::propertyDefinitions($field_definition);
$properties['value'] = DataDefinition::create('string')
->setLabel(new TranslatableMarkup('Value'))
->setRequired(TRUE);
return $properties;
}
}
Vous pouvez maintenant obtenir la valeur avec $entity->field_name->value
.
Il serait également préférable d'étendre EntityReferenceAutocompleteWidget
dans votre widget de champ, au lieu de WidgetBase
. Ensuite, vous pouvez faire comme ça dans la méthode formElement
:
public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
$widget = parent::formElement($items, $delta, $element, $form, $form_state);
$widget['value'] = [
'#type' => 'textfield',
'#title' => $this->t('Value'),
'#default_value' => $items[$delta]->value,
'#weight' => 999,
];
return $widget;
}