2009-08-18 9 views
11

Estoy intentando crear un formulario de nodo para un tipo personalizado. Tengo habilitados los grupos orgánicos y la taxonomía, pero quiero que sus elementos salgan en un orden no estándar. Así que implementé hook_form_alter y configuré la propiedad #weight del subarreglo og_nodeapi en -1000, pero todavía va después de la taxonomía y el menú. Incluso intenté cambiar el subcampo por un fieldset (para forzarlo a que se renderice realmente), pero no por los dados. También probé el establecimiento¿Por qué la propiedad '#weight' a veces no tiene ningún efecto en los formularios de Drupal?

$form['taxonomy']['#weight'] = 1000 

(tengo dos vocabs por lo que ya está siendo presentado como un conjunto de campos), pero que no funcionó bien.

Configuré el peso de mi módulo muy alto y confirmé en la tabla del sistema que efectivamente es el módulo más alto en el sitio, así que me quedé sin ideas. ¿Alguna sugerencia?

Actualización:

Aunque no estoy muy seguro de cómo, me las arreglé para obtener el conjunto de campos taxonomía a hundirse por debajo de todo lo demás, pero ahora tengo un problema relacionado que es de esperar que sea más manejable de entender. Dentro del conjunto de campos taxonomía, tengo dos elementos (a etiquetas y una selección múltiple), y yo quería añadir algunas instrucciones en hook_form_alter de la siguiente manera:

$form['taxonomy']['instructions'] = array(
    '#value' => "These are the instructions", 
    '#weight' => -1, 
); 

lo has adivinado, esto parece después los términos insertados por el módulo de taxonomía. Sin embargo, si cambio a un conjunto de campos:

$form['taxonomy']['instructions'] = array(
    '#type' => 'fieldset', // <-- here 
    '#title' => 'Instructions', // <-- and here for good measure 
    '#value' => "These are the instructions", 
    '#weight' => -1, 
); 

entonces mágicamente flota en la superficie como lo que pretendía. También probé textarea (esto también funcionó) y explícitamente diciendo markup (esto no fue así).

Básicamente, cambiar el tipo de "marcado" (el IIRC predeterminado) a "fieldset" tiene el efecto de no seguir ignorando su peso.

+0

¿Está tratando de alterar el orden en el formulario o en la página representada? No creo que hook form alter lo cambie para ambos. –

+0

Solo en el formulario. –

+0

Actualicé mi respuesta a continuación, agregando otra razón posible cuando se ejecuta con el módulo CCK instalado. –

Respuesta

11

Esto suena bastante extraño porque la manipulación del parámetro '#weight de los elementos del formulario siempre funciona de manera confiable para mí como se anuncia. Una cosa a tener en cuenta, sin embargo, es que los pesos solo afectan el orden relativo a los elementos hermanos, por lo que si el elemento que desea mover está en un nivel inferior al de los otros elementos, tendría que cambiar el peso del elemento principal que está en el mismo nivel que los que desea mover.

Para aclarar, si usted tiene una jerarquía como tal,

$element['foo']; 
$element['bar']; 
$element['bar']['baz'] 

no se puede mover 'baz' relativas a 'foo' ajustando el peso de 'baz'. Tendría que establecer el peso en 'barra' (moviéndolo también), o sacar 'baz' y llevarlo al mismo nivel que 'foo'.

Otra posible razón podría ser CCK: Si tiene instalado CCK, que le permite establecer el orden de su cuenta, así como otros campos bajo admin/content/node-type/<yourNodeType>/fields. Cambia el orden registrando la devolución de llamada previa al renderizado content_alter_extra_weights(), por lo que se ejecutará después de los cambios en hook_form_alter.


Editar: actualización para responder a la actualización pregunta

El tipo de campo de marcado tiene un comportamiento especial cuando se utiliza dentro de conjuntos de campos, que se insinúa en la forms api documentation:

Nota: si utiliza el marcado, si su contenido no está envuelto en etiquetas (generalmente <p> o <div>), su contenido quedará fuera de los conjuntos de campos colapsados.

Parece que no solo cae fuera de los conjuntos de campo colapsados, sino que también se niega a respetar el peso en esos casos.Envolver el contenido del campo marcado en <p> etiquetas hace que respeta el peso en mi máquina:

$form['taxonomy']['instructions'] = array(
    '#value' => "<p>These are the instructions</p>", 
    '#weight' => -1, 
); 
+0

Hmmm ... Tenía CCK habilitado al mismo tiempo pero ahora lo tengo deshabilitado. Quizás es por eso que mi uso original está funcionando ahora? Pero como he dicho en la descripción actualizada, ahora tengo otro problema similar pero más fácil de reproducir. –

+0

Respuesta actualizada a la pregunta actualizada de la dirección –

+0

¡Gracias, eso es perfecto! –

1

No entiendo muy bien qué es lo que quiere lograr. ¿Podrías quizás aclarar? ¿Desea cambiar la posición del menú desplegable de la taxonomía en la página?

Mientras tanto, podría instalar el Drupal Devel module (si aún no lo ha hecho). A continuación, habilite "Mostrar las teclas y los pesos del elemento del formulario" desde Admin> Configuración de desarrollo.

Esto debería ayudarle a resolver su problema.

Edición después de retroalimentación:

miré en él un poco más. El peso taxonomía se encuentra en taxonomy.module en la línea 556 (Drupal 6.12):

$form['taxonomy']['#weight'] = -3; 

Para probar también he implementado hook_form_alter para mi módulo de la siguiente manera:

function mymodule_form_alter(&$form, $form_state, $form_id) { 
     ... 
     $form['taxonomy']['#weight'] = -9; 
     ... 
} 

Esto funciona para mí, es decir, se mueve el menú desplegable de taxonomía en la parte superior de la página. Puedo cambiar el peso y se mueve en consecuencia en la página representada.

ya que dijo que ha intentado establecer $form['taxonomy']['#weight'] en su puesto original actualmente se me ocurre sólo dos posibles comprobaciones:

  1. Asegúrese de que el caché se limpia antes de la prueba. (Se puede utilizar el módulo Devel para esto)
  2. Compruebe si suhook_form_alter se llama despuéstaxonomy_form_alter

Te publicar el código que actualmente tiene podríamos mirarlo con más detalle.


Tenga en cuenta: los pesos mostrados por el módulo Devel no son muy útiles para esta situación. Se muestran los pesos de los elementos en las "subformas" y no el peso de la "subforma" en sí. P.ej. cuando configuro $form['taxonomy']['#weight'] = -9;, el módulo Devel no muestra -9, sino más bien los pesos de los elementos dentro de $form['taxonomy'].

+0

Hola Heinrich, sí, estoy intentando cambiar la posición del menú desplegable de taxonomía. No tengo desarrollo, pero lo instalaré esta noche e informaré. ¡Gracias! –

+0

Hola Heinrich, instalé el desarrollo y comprobé los pesos. Todo parece ser como lo pretendía, pero los conjuntos de campo no están ordenados en orden ascendente. El primer fieldset es la taxonomía, que tiene un peso de 1000. El segundo es el menú (-2), luego el resumen del libro (10). Hay un par más, luego Archivos adjuntos (30), Información de autoría (20) e información de publicación (25). Por lo tanto, no son solo los conjuntos de campo que agregué los que están fuera de servicio, sino también los principales. ¿hook_form_alter es demasiado tarde para cambiar el orden de los conjuntos de campos existentes? –

+0

Gracias por la aclaración RE devel. Estoy bastante seguro de que se llamará a hook_form_alter después de taxonomy_form_alter ya que puedo ver todos los elementos agregados por la taxonomía desde mi gancho. –

0

¿Ha especificado el peso de otro campo y ahora su formulario de nodo no está organizada adecuadamente? La API de formulario es un tanto delicada y la alteración de la forma puede hacer que las cosas se mezclen. A veces tengo que reasignar un peso a mis botones de envío/vista previa para que vuelvan a aparecer en la parte inferior del formulario al que pertenecen.

0

Solo para cubrir todas las bases, asegúrese de que está limpiando su caché según sea necesario. Drupal almacena formularios en su caché de manera predeterminada, si tiene habilitado el módulo de caché.

+0

Gracias - He desactivado el almacenamiento en caché. Heinrich parece haberlo clavado sin embargo. –

3

veces (o siempre, cuando la ponderación de los elementos CCK) la línea que funciona en su hook_form_alter o $ form [ '# after_build'] devolución de llamada es éste:

$form['#content_extra_fields']['taxonomy']['weight'] = 5; 
+0

esta es la respuesta * real * a esta pregunta – gpilotino

2

desea introducir un <div> que podría utilizar en JS. Esto no funcionó para mí:

$form['you_as_reviewer']['ui_container'] = array(
    '#type' => 'markup', 
    '#value' => '<div id="le_reviewer_tags_ui"/>', 
    '#weight' => 5, 
); 

Se ignoró el peso.

Esto funcionó:

$form['you_as_reviewer']['ui_container'] = array(
    '#type' => 'markup', 
    '#prefix' => '<div>', 
    '#value' => '<div id="le_reviewer_tags_ui"/>', 
    '#suffix' => '</div>', 
    '#weight' => 5, 
); 

Agregado prefijo y sufijo.

Cuestiones relacionadas