it-swarm.it

Procedura consigliata per la chiave di lingua per "und" in hook_form_alter

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 und sia negativo. Quale dovrebbe essere il modo corretto di modificare correttamente i campi modulo in questo caso?

30
Shafiul

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 traduzione 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_NONE e non la stringa 'und').
Quindi con la tua soluzione puoi ottenere una situazione in cui un nodo è russo, ma un campo del nodo usa LANGUAGE_NONE.
Fortunatamente, i campi sono allegati 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, Funzioni API lingua del campo può essere utile.

40
kalabro

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

10
Attiks

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

Ad ogni modo puoi ottenere la prima lingua usando array_keys come questo:

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.

4
googletorp

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.

0
decibel.places

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

Posso scrivere la seguente riga per ottenere la lingua:

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