Best practice per la chiave di lingua per "und" in hook_form_alter


30

Sto modificando un modulo nel mio modulo personalizzato. Il codice è simile a:

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';

    }

}

Tuttavia, penso che l'hard-coding undsia negativo. Quale dovrebbe essere il modo corretto di modificare correttamente i campi modulo in questo caso?


Questo commento è probabilmente irrilevante poiché è stato chiesto molto tempo fa. Un modo semplice per usarlo usando un foreachloop. Se è solo LANGUAGE_NONE, è una sola corsa. In senso form_alter, dovrebbe tecnicamente alterare qualunque sia la lingua del modulo.
AyeshK,

Risposte:


40

Sfortunatamente, la tua risposta non è così universale. La lingua dei campi e la lingua dei nodi non sono le stesse cose.
La lingua dei campi è necessaria solo se si utilizza l'API di traduzione dei campi (ad esempio la traduzione delle entità ). Quando inizi a usarlo, alcuni campi vengono convertiti in traducibili.

I campi traducibili hanno un codice lingua, il che ha davvero senso. Ma se il campo non è traducibile, il codice della lingua sarà sempre (e per tutti i tipi di contenuto, entità, ecc.) - LANGUAGE_NONE(meglio usare la costante LANGUAGE_NONEe non la stringa 'und').
Quindi con la tua soluzione puoi ottenere una situazione in cui un nodo è russo, ma utilizza un campo del nodo LANGUAGE_NONE.
Fortunatamente, i campi sono collegati al modulo con '#language'chiave, che contiene sempre il codice lingua corretto.

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

Se non si ha accesso al modulo allegato, le funzioni API della lingua dei campi possono essere utili.


4
Questa è l'unica risposta corretta in questa discussione.
Bojan Zivanovic,

Questo metodo può essere utilizzato anche durante il recupero del percorso del campo immagine di un nodo / tipo di contenuto. Grazie
Jayaram R

10

Se conosci il tipo di entità e il bundle usa qualcosa come il seguente codice, che chiama field_language () .

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

Capirà la lingua giusta e funzionerà in siti multilingue.

Dai anche un'occhiata a field_get_items () .


Questo è corretto come modo API.
Nikit,

Che dire se il nodo non è stato creato?
AgA

@Nikit non ne sono sicuro, perché la lingua di visualizzazione e la lingua del modulo non sono uguali. L'autore modifica un modulo e può essere un modulo per la creazione di un nuovo nodo o per l'aggiunta di una nuova traduzione del nodo esistente.
Kalabro,

@kalabro - mostra la lingua e la lingua del modulo - lo stesso nel contesto attuale.
Nikit

4

L'intero undaffare è una delle cose più fastidiose in Drupal 7 che non ha funzionato altrettanto bene in pratica come quando è stato progettato.

Ad ogni modo puoi ottenere la prima lingua usando in array_keysquesto modo:

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);
  }
}

Dovrebbe funzionare tutto il tempo.


Grazie per la tua risposta. Sto incollando quello che ho fatto per risolvere questo problema in un'altra risposta. :)
Shafiul

Posso usare $ langs per accedere al valore dello stesso campo anche in form_state?
AgA

È davvero sicuro? Puoi essere sicuro che $ langs [0] sia sempre l'elemento dell'array corretto?
Rooby,

0

(Rispondere alla mia domanda nel caso in cui aiuti qualcuno. La risposta ha funzionato per me.)

Posso scrivere la seguente riga per ottenere la lingua:

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

5
Questo è sbagliato. Vedi la risposta di Kalabro .
Bojan Zivanovic,

0

re: la risposta di Kalabro

il suo codice non ha funzionato per me - il mio codice è leggermente diverso

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

[$ lang] [0] ha restituito "u" ma il valore completo di [$ lang] è "und" e non ho nemmeno bisogno del ['valore'], perché $ form ['FIELDNAME'] ['# language' ] non era un array, era una stringa.


1
Il 0 ° carattere di 'und' è 'u'. Sei in un labirinto di piccoli passaggi tortuosi, tutti array.
Chris Burgess,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.