Práctica recomendada para la clave de idioma para "und" en hook_form_alter

30

Estoy modificando un formulario en mi módulo personalizado. El código se ve así:

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

    }

}

Sin embargo, creo que la codificación rígida undes mala. ¿Cuál debería ser la forma correcta de modificar los campos de formulario correctamente en este caso?

Shafiul
fuente
Este comentario probablemente sea irrelevante ya que se hizo hace mucho tiempo. Una forma simple de usarlo usando un foreachbucle Si es solo LANGUAGE_NONE, es una sola ejecución. En el sentido de form_alter, técnicamente debería alterar cualquier idioma que tenga el formulario.
AyeshK

Respuestas:

40

Desafortunadamente, su auto respuesta no es tan universal. El lenguaje de campo y el lenguaje de nodo no son las mismas cosas.
El lenguaje de campo solo es necesario si está utilizando API de traducción de campo (por ejemplo, traducción de entidad ). Cuando empiezas a usarlo, algunos campos se convierten en traducibles.

Los campos traducibles tienen código de idioma, lo que realmente tiene sentido. Pero si el campo no es traducible, el código del idioma siempre lo será (y para todos los tipos de contenido, entidades, etc.) LANGUAGE_NONE(lo mejor es usar la constante LANGUAGE_NONEy no la cadena 'und').
Entonces, con su solución, puede obtener una situación en la que un nodo es ruso, pero usa un campo del nodo LANGUAGE_NONE.
Afortunadamente, los campos se adjuntan al formulario con '#language'clave, que siempre contiene el código de idioma correcto.

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

Si no tiene acceso al formulario adjunto, las funciones de API de lenguaje de campo pueden ser útiles.

kalabro
fuente
44
Esta es la única respuesta correcta en este hilo.
Bojan Zivanovic
Este método también se puede utilizar al recuperar la ruta del campo de imagen de un nodo / tipo de contenido. Gracias
Jayaram R
10

Si conoce el tipo de entidad y el paquete, use algo como el siguiente código, que llama a field_language () .

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

Descubrirá el idioma correcto y funcionará en sitios multilingües.

También eche un vistazo a field_get_items () .

Attiks
fuente
Esta correcta como forma API.
Nikit
¿Qué pasa si el nodo no se ha creado?
AgA
@Nikit No estoy seguro, porque el idioma de visualización y el lenguaje de formulario no son lo mismo. El autor altera algún formulario y puede ser un formulario para crear un nuevo nodo o para agregar una nueva traducción del nodo existente.
kalabro
@kalabro: idioma de visualización y lenguaje de formularios, lo mismo en el contexto actual.
Nikit
4

Todo el asunto undes una de las cosas más molestas en Drupal 7 que no funcionó tan bien en la práctica como cuando fue diseñado.

De todos modos, puedes obtener el primer idioma usando array_keysasí:

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

Eso debería funcionar todo el tiempo.

googletorp
fuente
Gracias por tu respuesta. Estoy pegando lo que he hecho para solucionar este problema en otra respuesta. :)
Shafiul
¿Puedo usar $ langs para acceder al valor del mismo campo también en form_state?
AgA
¿Es esto realmente seguro? ¿Puede estar seguro de que $ langs [0] es siempre el elemento de matriz correcto?
rooby
0

(Responder mi propia pregunta en caso de que ayude a alguien. La respuesta funcionó para mí).

Puedo escribir la siguiente línea para obtener el idioma:

$lang = $form['language']['#value'];    //  Instead of "und"
Shafiul
fuente
55
Esto está mal. Ver la respuesta de kalabro .
Bojan Zivanovic
0

re: respuesta de kalabro

su código no funcionó para mí, mi código es un poco diferente

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

[$ lang] [0] devolvió "u" pero el valor total de [$ lang] es "und" y tampoco necesitaba el ['valor'], porque $ form ['FIELDNAME'] ['# idioma' ] no era una matriz, era una cadena.

decibelios.
fuente
1
El carácter 0 de 'und' es 'u'. Estás en un laberinto de pequeños pasajes sinuosos, todos los arreglos.
Chris Burgess