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?


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.


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


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.


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"

5

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.