¿Por qué hook_form_alter () es tan desordenado?

40

Aquí hay un ejemplo que acabo de encontrar. Estoy tratando de poner algo de HTML en la etiqueta de mi campo.

$form['field_feedback']['und']['#title'] <- has the title
$form['field_feedback']['und'][0]['#title'] <- has the title
$form['field_feedback']['und'][0]['value']['#title'] <- has the title. (Works)

¿Por qué hay tres atributos #title poblados con solo uno en uso?

Joren
fuente
1
donde se genera esta matriz $ form? como sé, no tenemos $ form con esta estructura en hook_form_alter
Mohammad Ali Akbari
Gracias por esto. Me estaba sacando el pelo. La estructura de la matriz es ridícula.
JM01

Respuestas:

72

Lo que está viendo es cómo Drupal representa los campos en un formulario. Se descompone así:

  • Los elementos secundarios de la matriz externa $form['field_back']['und']( 'und'for 'undefined') son los diferentes idiomas a los que se ha traducido el campo. En Drupal, se recomienda el uso LANGUAGE_NONEde 'und'un código.
  • Los elementos secundarios dentro de cada conjunto de idiomas, por ejemplo $form['field_feedback']['und'][0], representan las diferentes entradas para el campo. Por ejemplo, si un campo tiene cardinalidad ilimitado, y hay varias entradas para ese campo, que se mostrarán como $form['field_feedback']['und'][0], $form['field_feedback']['und'][1], etc.
  • Finalmente tiene los elementos de entrada de formulario, para los valores de campo en sí, por ejemplo $form['field_feedback']['und'][0]['value']. En este caso, el nombre de la columna es value, para un campo de referencia de nodo, sería nid, y así sucesivamente. Si un campo tiene varias columnas de datos asociadas, también verá más elementos secundarios. Estos están representados por un campo de texto / cuadro de selección / widget especial, y finalmente proporcionarán el valor para el campo.

El hecho de que se hayan agregado títulos a los diversos elementos en toda la jerarquía es incidental para ser sincero. El hecho de que esos títulos se muestren o no en el formulario depende de la configuración particular de la matriz de representación en la que #titleestá contenido cada uno .

Para cambiar el título en el widget de formulario real, solo debe preocuparse por el elemento de formulario en la parte inferior de la matriz: es decir, los elementos de entrada reales ( $form['field_feedback']['und'][0]['value'], etc.).

Probablemente valga la pena señalar que el elemento / widget utilizado para un campo en particular puede ser bastante complejo. Si aún no lo tiene, debe instalar el módulo Devel y usar la dpm()función para inspeccionar la $formmatriz; eso le mostrará exactamente en qué parte de la matriz se encuentran los elementos a los que intenta apuntar.

Clive
fuente
3
En resumen, agregar #title a algo que Drupal no considera una matriz de API de formulario no tiene ningún efecto; incluso en ese caso, no se dice que #title se tenga en cuenta, ya que no es un atributo para todos los elementos de formulario que implementa Drupal. El campo API complica las cosas, ya que agrega una matriz normal a la matriz de formularios, pero eso no confunde a Drupal que busca #type , para reconocer un elemento de formulario.
kiamlaluno