Étant donné un champ de case à cocher avec deux options:
Je souhaite développer ou réduire le conteneur <details>
d'un champ différent (dans notre cas spécifique, un champ d'adresse). En termes HTML, cela signifie ajouter l'attribut open
HTML5 à la balise <details>
et ajouter aria-expanded=true
à la balise <summary>
lorsque le bouton "Ouvrir" cliquez sur la valeur du bouton radio et assurez-vous qu'elle est supprimée lorsque cette option radio n'est pas sélectionnée (ce qui signifie également par défaut au moment du chargement de la page).
J'ai trouvé quelques ancienssemi-liés problèmes et page de documentation pour Drupal 8's drupal_process_states
, mais il semble que ce ne soit pas possible avec l'API Form #states
dans Drupal 8. Les documents n'incluent pas "open" dans la liste d'états valides pouvant être appliqués à un élément.
Les états valides sont:
On pourrait penser que les options expanded
et collapsed
pourraient fonctionner, mais cela ne semble pas être le cas avec mon exemple de code ci-dessous:
function mymodule_form_node_<type>_form_alter(&$form, FormStateInterface $form_state) {
$form['field_address']['#states'] = [
// Expand address field container when the Trigger field is 'Open'.
'expanded' => [
':input[name="field_trigger"]' => [
'value' => 'open'
],
],
];
}
Le remplacement de l'état "étendu" par "ouvert" dans ce qui précède ne fonctionne pas, pas plus que la logique inverse utilisant l'état "réduit":
function mymodule_form_node_<type>_form_alter(&$form, FormStateInterface $form_state) {
$form['field_address']['#states'] = [
// Collapse address field container when the Trigger field is 'Closed'.
'collapsed' => [
':input[name="field_trigger"]' => [
'value' => 'closed'
],
],
];
}
Plutôt que d'utiliser développé/réduit utilisez ouvert/fermé comme ci-dessous:
function mymodule_form_node_<type>_form_alter(&$form, FormStateInterface $form_state) {
$form['field_address']['#states'] = [
// Expand address field container when the Trigger field is 'Open'.
'open' => [
':input[name="field_trigger"]' => [
'value' => 'open'
],
],
'close' => [
':input[name="field_trigger"]' => [
'value' => 'closed'
],
],
];
}
Malheureusement, je vais répondre à ma propre question: expanded
et collapsed
états fonctionnent pour le <details>
type.
Mon problème était une erreur d'opérateur. J'ajoutais le #states
tableau au niveau du '#type' => 'container'
mais le conteneur contient un widget qui contient le '#type' => 'details'
. Des moments amusants avec l'API Form!
Le code de travail est le suivant:
<?php
// In mymodule.module
use \Drupal\Core\Form\FormStateInterface;
function mymodule_form_node_<type>_form_alter(&$form, FormStateInterface $form_state) {
$form['field_address']['widget'][0]['#states'] = [
// Expand location field when the Type is 'On-site'.
'expanded' => [
':input[name="field_trigger"]' => [
'value' => 'open'
],
],
// Collapse location field when the Type is 'Online'.
'collapsed' => [
':input[name="field_trigger"]' => [
'value' => 'closed'
],
],
];
// Load edit form with Location field either open or closed, based
// on the value of the Trigger field.
$form['field_address']['widget'][0]['#open'] = ($form['field_trigger']['widget']['#default_value'] == 'open') ? 1 : 0;
}