web-dev-qa-db-ja.com

プログラムでリストフィールドの許可された値を更新するにはどうすればよいですか?

コンテンツタイプ= articleにフィールド_field_time_zone_を作成しました。

リストフィールドの許容値を設定したい。つまり、選択リストのオプションは$zones = system_time_zones();にする必要がある

このために、私はhook_form_alterを書きました:

_$zones = system_time_zones();
$entityManager = \Drupal::service('entity_field.manager');
$fields = $entityManager->getFieldStorageDefinitions('node', 'local_market');
$options = options_allowed_values($fields['field_time_zone']);

if(empty($options)) {
$options =  $zones;
$form['field_time_zone']['widget']['#options'] = $options;
}
_

上記の機能により、選択リストフィールドにタイムゾーンが正常に追加されましたが、このノードを保存すると、ノードを保存できません。

エラーをスローします。

選択した値は有効な選択ではありません。

text(list)タイプのフィールドに許可値オプションを設定し、それに応じて保存するにはどうすればよいですか?

5
Sugandh Khanna

エンティティフィールドの検証が失敗するため、フォームの変更フックでこれを行うことはできません。

フィールド設定に関数を追加する必要があります。これはフィールドUIにはないため、構成をエクスポートし、field.storage.node.field_time_zone.ymlでフィールドを変更する必要があります。

type: list_string
settings:
  allowed_values: {  }
  allowed_values_function: 'mymodule_allowed_values_function'

構成を再インポートします。次に、この関数をmymodule.moduleに実装して、オプションを動的に設定できます。

use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\field\Entity\FieldStorageConfig;

  function mymodule_allowed_values_function(FieldStorageConfig $definition, ContentEntityInterface $entity = NULL, $cacheable) {
    $options = [
      ...
    ];
    return $options;
  }

https://chromatichq.com/blog/dynamic-default-and-allowed-values-list-fields-drupal-8 を参照してください


後で追加される質問について:

text(list)タイプのフィールドに許可値オプションを設定し、それに応じて保存するにはどうすればよいですか?

問題は元々、フォームの変更で機能しないコードをどのように処理するかでした。代わりに配置できます。

この質問で静的な許容値リストがある場合は、フィールド設定UIにリストをコピーして貼り付けて保存できます。

enter image description here

そして今、それはここでエクスポートされた設定の言及されたyamlファイルに保存されます:

  allowed_values: {  }
15
4k4

多くの時間の後、私はようやく解決策を見つけました。複数選択フィールドのオプションを動的に作成し、送信時に間違ったオプションで選択を選択したというエラーメッセージが表示されました。

そのフィールドのallowed_valuesに新しいオプションを追加する必要があります。これが解決策です:

 //load your field
 $field_purchasers = FieldStorageConfig::loadByName('user', 'field_xx');
 //subscribe new options to this field
$field_purchasers->setSetting('allowed_values_function','module_name_allowed_values_function' );
//save configuration
$field_purchasers->save();

.moduleファイルにコールバック関数を書き込みます。

function module_name_allowed_values_function(FieldStorageConfig $definition, ContentEntityInterface $entity = NULL, $cacheable) {
  $options = [
    1 => 'My new option 1',
    2 => 'My new option 2',
    3 => 'My new option 3',
   ];
  return $options;
}
3
Mariusz Kobiela