web-dev-qa-db-fra.com

Meilleure pratique pour la clé de langue pour "und" dans hook_form_alter

Je modifie un formulaire dans mon module personnalisé. Le code ressemble à:

function my_module_form_alter(&$form, &$form_state, $form_id) {

    if ($form_id == "someID") {

        $form['field_charity_author']['und'][0]['value']['#value'] = arg(3);
        //$form['field_charity_author']['#type'] = 'hidden';

    }

}

Cependant, je pense que le codage en dur und est mauvais. Quelle devrait être la bonne façon de modifier correctement les champs du formulaire dans ce cas?

30
Shafiul

Malheureusement, votre réponse personnelle n'est pas si universelle. Le langage de champ et le langage de nœud ne sont pas les mêmes choses.
La langue de champ n'est nécessaire que si vous utilisez l'API de traduction de champ (par exemple traduction d'entité ). Lorsque vous commencez à l'utiliser, certains champs sont convertis en traduisibles.

Les champs traduisibles ont un code de langue, ce qui est vraiment logique. Mais si le champ n'est pas traduisible, le code de langue sera toujours (et pour tous les types de contenu, entités, etc.) - LANGUAGE_NONE (préférable d'utiliser la constante LANGUAGE_NONE et non la chaîne 'und').
Ainsi, avec votre solution, vous pouvez obtenir une situation où un nœud est russe, mais un champ du nœud utilise LANGUAGE_NONE.
Heureusement, les champs sont attachés au formulaire avec '#language' clé, qui contient toujours le code de langue correct.

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang][0]['value']['#value'] = $value;

Si vous n'avez pas accès au formulaire joint, fonctions de l'API Field Language peut être utile.

40
kalabro

Si vous connaissez le type d'entité et le bundle, utilisez quelque chose comme le code suivant, qui appelle field_language () .

$field_language = field_language('node', $node, 'field_charity_author');  
$form['field_charity_author'][$field_language][0]['value']['#value'] = arg(3);

Il trouvera la bonne langue et fonctionnera sur des sites multilingues.

Jetez également un œil à field_get_items () .

10
Attiks

L'ensemble de l'entente und est l'une des choses les plus ennuyeuses de Drupal 7 qui n'a pas fonctionné aussi bien dans la pratique que lors de sa conception.

Quoi qu'il en soit, vous pouvez obtenir la première langue en utilisant array_keys comme ça:

function my_module_form_alter(&$form, &$form_state, $form_id) {

  if ($form_id == "someID") {
      $langs = array_keys($form['field_charity_author']);
      $form['field_charity_author'][$langs[0]][0]['value']['#value'] = arg(3);
  }
}

Cela devrait fonctionner tout le temps.

4
googletorp

re: la réponse de kalabro

son code n'a pas fonctionné pour moi - mon code est un peu différent

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang]['#value'] = $value;

[$ lang] [0] a renvoyé "u" mais la valeur totale de [$ lang] est "und" et je n'avais pas non plus besoin de la ['valeur'], car $ form ['FIELDNAME'] ['# language' ] n'était pas un tableau, c'était une chaîne.

0
decibel.places

(Répondre à ma propre question au cas où cela aiderait quelqu'un. La réponse a fonctionné pour moi.)

Je peux écrire la ligne suivante pour obtenir la langue:

$lang = $form['language']['#value'];    //  Instead of "und"
0
Shafiul