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 und
es mala. ¿Cuál debería ser la forma correcta de modificar los campos de formulario correctamente en este caso?
foreach
bucle 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.Respuestas:
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 constanteLANGUAGE_NONE
y 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.Si no tiene acceso al formulario adjunto, las funciones de API de lenguaje de campo pueden ser útiles.
fuente
Si conoce el tipo de entidad y el paquete, use algo como el siguiente código, que llama a field_language () .
Descubrirá el idioma correcto y funcionará en sitios multilingües.
También eche un vistazo a field_get_items () .
fuente
Todo el asunto
und
es 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_keys
así:Eso debería funcionar todo el tiempo.
fuente
(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:
fuente
re: respuesta de kalabro
su código no funcionó para mí, mi código es un poco diferente
[$ 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.
fuente