web-dev-qa-db-ja.com

カスタムentity_referenceフィールドウィジェットのパラメーターとしてカスタムラベルを保存する方法

entity_referenceフィールドのカスタムフィールドウィジェットを作成しています。これには、カスタム選択フィールドとAjax送信ボタンがあります。ユーザーがselect_fieldからオプション(エンティティ)を選択して送信したら、エンティティを下のdragTableに追加します。

これまでは達成できましたが、選択したエンティティにカスタムラベルを追加する必要があります。カスタム値をキャプチャするためにテキストフィールドを提供し、値をフェッチすることができます。しかし、このカスタムtext_fieldデータを保存できません。カスタムフィールドウィジェットのコアWidgetBaseクラスを拡張しています。 entity_referenceフィールドの場合、エンティティとともにカスタムラベルパラメーターを保存できますか?

enter image description here

更新:fieldTypeを有効にすると、フィールドの作成中に重複した結果が表示されます。これについて何か助けはありますか? enter image description here

4
Kiran

エンティティ参照とともに値を保持できるカスタムフィールドタイプを作成する必要があります。

フィールドウィジェットは、フィールドタイプがスペースを提供していないデータを格納できません。

次のような新しいフィールドタイプを作成する必要があります。

<?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;
  }

}

これで、$entity->field_name->valueを使用して値を取得できます。

また、EntityReferenceAutocompleteWidgetではなく、フィールドウィジェットでWidgetBaseを拡張することをお勧めします。次に、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