Meilleure pratique pour la clé de langue pour «und» dans hook_form_alter

30

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 undest mauvais. Quelle devrait être la bonne façon de modifier correctement les champs du formulaire dans ce cas?

Shafiul
la source
Ce commentaire est probablement hors de propos puisqu'il a été demandé il y a longtemps. Une façon simple de l'utiliser en utilisant une foreachboucle. Si c'est juste LANGUAGE_NONE, c'est une seule exécution. Dans le sens de form_alter, il devrait techniquement modifier la langue du formulaire.
AyeshK

Réponses:

40

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, la 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_NONEet 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 la '#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, les fonctions de l'API Field Language peuvent être utiles.

Kalabro
la source
4
C'est la seule bonne réponse dans ce fil.
Bojan Zivanovic
Cette méthode peut également être utilisée lors de la récupération du chemin de champ d'image d'un nœud / type de contenu. Merci
Jayaram R
10

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 () .

Attiks
la source
Cela est correct en tant qu'API.
Nikit
Et si le nœud n'a pas été créé?
AgA
@Nikit Je ne suis pas sûr, car la langue d'affichage et la langue des formulaires ne sont pas identiques. L'auteur modifie un formulaire et il peut s'agir d'un formulaire pour créer un nouveau nœud ou pour ajouter une nouvelle traduction du nœud existant.
kalabro
@kalabro - langue d'affichage et langue de formulaire - les mêmes dans le contexte actuel.
Nikit
4

L'ensemble de l' undaccord 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_keyscomme ceci:

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.

googletorp
la source
Merci pour votre réponse. Je colle ce que j'ai fait pour résoudre ce problème dans une autre réponse. :)
Shafiul
Puis-je utiliser $ langs pour accéder à la valeur du même champ dans le form_state?
AgA
Est-ce vraiment sûr? Pouvez-vous être sûr que $ langs [0] est toujours l'élément de tableau correct?
rooby
0

(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"
Shafiul
la source
5
C'est faux. Voir la réponse de Kalabro .
Bojan Zivanovic
0

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.

decibel.places
la source
1
Le 0ème caractère de 'und' est 'u'. Vous êtes dans un dédale de petits passages sinueux, tous des tableaux.
Chris Burgess