J'ai créé un champ field_time_zone
Dans un type de contenu = article
.
Je veux définir les valeurs autorisées du champ de liste, c'est-à-dire que les options de la liste de sélection doivent être $zones = system_time_zones();
Pour cela, j'ai écrit un 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;
}
La fonction ci-dessus a ajouté avec succès des fuseaux horaires à mon champ de liste de sélection, mais lorsque j'enregistre ce nœud, il ne permettra pas au nœud d'être enregistré.
Il jette une erreur;
La valeur que vous avez sélectionnée n'est pas un choix valide.
Comment puis-je définir les options de valeur autorisées dans un champ de type texte (liste) et l'enregistrer en conséquence?
Vous ne pouvez pas le faire dans un crochet de modification de formulaire, car la validation du champ d'entité échouera.
Vous devez ajouter une fonction aux réglages sur place. Ce n'est pas dans l'interface utilisateur du champ, vous devez donc exporter la configuration et modifier le champ dans field.storage.node.field_time_zone.yml:
type: list_string
settings:
allowed_values: { }
allowed_values_function: 'mymodule_allowed_values_function'
Réimportez la configuration. Ensuite, vous pouvez implémenter cette fonction dans mymodule.module pour définir dynamiquement les options:
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\field\Entity\FieldStorageConfig;
function mymodule_allowed_values_function(FieldStorageConfig $definition, ContentEntityInterface $entity = NULL, $cacheable) {
$options = [
...
];
return $options;
}
Voir https://chromatichq.com/blog/dynamic-default-and-allowed-values-list-fields-drupal-8
Pour la question ajoutée plus tard:
Comment puis-je définir les options de valeur autorisées dans un champ de type texte (liste) et l'enregistrer en conséquence?
À l'origine, la question était de savoir quoi faire avec le code qui ne fonctionne pas sous la forme alter, où vous pouvez le placer à la place.
Si vous voulez dire qu'avec cette question, vous avez une liste de valeurs autorisées statiques, vous pouvez copier et coller la liste dans l'interface utilisateur des paramètres de champ et l'enregistrer:
Et maintenant, il est stocké dans le fichier yaml mentionné de la configuration exportée ici:
allowed_values: { }
Après plusieurs heures, j'ai finalement trouvé une solution. J'ai créé dynamiquement des options pour le champ de sélection multiple et j'ai reçu un message d'erreur lors de la soumission qui a sélectionné la mauvaise option.
Il nécessite d'ajouter de nouvelles options aux valeurs_autorisées pour ce champ. Voici la solution:
//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();
Dans votre fichier .module, écrivez la fonction de rappel:
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;
}