Définir par programme la valeur par défaut d'un champ

10

Dans Drupal 6, nous pourrions utiliser PHP pour définir des valeurs par défaut, mais le même code ne peut pas être utilisé avec Drupal 7.

J'essaie de le faire hook_form_alter(), mais le code ne fonctionne pas.

function my_form_alter(&$form, &$form_state, $form_id) {
  dsm($form);

  switch($form_id) {
    case 'accounts_node_form':
      $form["field_accounts"]["und"]['#default_value'] = $default;
      // …
      break;
  }
}
giorgio79
la source

Réponses:

17

En supposant que votre fonction alter form est en cours d'exécution (ce que vous pouvez confirmer avec cet appel à dsm()), il y a en fait 2 niveaux de tableau supplémentaires que vous devez descendre pour accéder à l'élément de champ:

$form["field_accounts"][LANGUAGE_NONE][0]['value']['#default_value'] = $default;

Dans Drupal 7, vous avez un tableau de valeurs pour chaque langue dans laquelle le champ a été traduit (afin que les champs avec une cardinalité multiple / illimitée puissent être pris en charge), et sous chacun d'eux se trouve dans un tableau pour les différentes colonnes de champ différentes. Dans la majorité des cas, ce sera «valeur» mais pas toujours (par exemple, un champ d'image a une colonne d'identification de fichier, une colonne alt, etc.)

J'espère que ça t'as aidé

Clive
la source
C'est une profondeur de plus :)$form["field_accounts"]["und"][0]["value"]['#default_value'] = $default;
giorgio79
2
Cette réponse ne fonctionnera pas pour tous les widgets; dépend de la façon dont ils spécifient leur valeur. Par exemple, avec un champ de référence d'entité, utilisez: $ form ['field_name'] ['und'] [0] ['target_id'] ['# default_value'] = $ default
Renee
@Renee Très vrai; il y a une explication plus approfondie ici
Clive
1
Les valeurs des champs ont toujours une langue @Mouneer, si vous n'avez pas de site multilingue, la valeur par défaut LANGUAGE_NONEdoit être utilisée
Clive
1
En effet, j'aurais pu expliquer un peu mieux @Mouneer :) Vous trouverez la langue actuelle dans le formulaire quelque part (je pense que peut-être $form['#entity']->languagemais je devrais vérifier, afin qu'elle puisse être utilisée à la place d'une constante. Code de récupération utiliserait également le langage actuel tel que déterminé par le $languageglobal, mais il existe des méthodes API pour aider de toute façon ( field_get_itemsou encore mieux celle EntityMetadataWrapperfournie par le module d'entité)
Clive
0

C'est correct:

function my_form_alter(&$form, &$form_state, $form_id) {
  dsm($form);

  switch($form_id) {
    case 'accounts_node_form':
      $form["field_accounts"][LANGUAGE_NONE][0]['value']['#default_value'] = $default;
      // …
      break;
  }
}
keopx
la source
0

Cela fonctionne bien:

function my_form_alter(&$form, &$form_state, $form_id) {
  dsm($form);
  switch($form_id) {
    case 'accounts_node_form':
      $form["field_accounts"]["und"][0]['value']['#default_value']=$default;
      break;
  }
}
keopx
la source