コンテンツタイプ= 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)タイプのフィールドに許可値オプションを設定し、それに応じて保存するにはどうすればよいですか?
エンティティフィールドの検証が失敗するため、フォームの変更フックでこれを行うことはできません。
フィールド設定に関数を追加する必要があります。これはフィールド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にリストをコピーして貼り付けて保存できます。
そして今、それはここでエクスポートされた設定の言及されたyamlファイルに保存されます:
allowed_values: { }
多くの時間の後、私はようやく解決策を見つけました。複数選択フィールドのオプションを動的に作成し、送信時に間違ったオプションで選択を選択したというエラーメッセージが表示されました。
そのフィールドの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;
}