web-dev-qa-db-fra.com

Comment enregistrer une étiquette personnalisée en tant que paramètre pour un widget de champ entity_reference personnalisé?

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?

enter image description here

Mise à jour: Après avoir activé fieldType, des résultats en double apparaissent lors de la création du champ. Une aide à ce sujet? enter image description here .

4
Kiran

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;
}
5
user72672