orden de ejecución hook_form_alter

10

¿Hay alguna manera de cambiar el orden de ejecución de hook_form_alter en Drupal 7 sin cambiar el peso de un módulo o piratear Drupal Core?

Estoy tratando de alterar el elemento agregado en translation_form_node_form_alter desde el módulo de traducción. Al depurar el formulario, no puedo encontrar el elemento, así que supongo que mi gancho se está ejecutando antes que el del módulo de traducción.

Bart
fuente

Respuestas:

2

No lo creo. translation_form_node_form_alter()implementos hook_form_BASE_FORM_ID_alter()que creo que se llaman después hook_form_alter() , por lo que incluso cambiar el peso del módulo no sería suficiente. Creo que sus dos opciones son usar ay hook_form_BASE_FORM_ID_alter()asegurarse de que tiene un peso de módulo lo suficientemente alto, o usar hook_form_FORM_ID_alter()(si es posible).

Andy
fuente
hook_form_FORM_ID_alter () se llama después de hook_form_alter ()
iStryker
Lo resolvió usando hook_form_form_id_alter y el peso del módulo.
Bart
@Bart si lo usó hook_form_FORM_ID_alter(), entiendo que no debería necesitar modificar el peso (porque todas las hook_form_FORM_ID_alter()llamadas se realizan después de todo hook_form_BASE_FORM_ID_alter()).
Andy
@ Andy, no parece funcionar si uso foo_form_page_node_form_alter sin ajustar el peso.
Bart
1
@Bart Estaba buscando en la fuente para darte esos detalles, mira la parte inferior de drupal_prepare_form()y drupal_alter(). Ya me había dado cuenta de que los documentos parecían estar apagados, así que creé un problema . ¡No sé por qué no funciona para ti sin alterar el peso del sistema!
Andy
17

También vale la pena mencionar, hay una nueva API de drupal 7 llamada hook_module_implements_alter () que le permite alterar el orden de ejecución para un gancho dado SIN alterar la tabla de pesos del módulo.

Código de muestra de los documentos de la API que muestra lo fácil que es hacer esto:

<?php
function hook_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'rdf_mapping') {
    // Move my_module_rdf_mapping() to the end of the list. module_implements()
    // iterates through $implementations with a foreach loop which PHP iterates
    // in the order that the items were added, so to move an item to the end of
    // the array, we remove it and then add it.
    $group = $implementations['my_module'];
    unset($implementations['my_module']);
    $implementations['my_module'] = $group;
  }
}
?>
wiifm
fuente
Pude ejecutar mi gancho al final con este código exacto. ¡Gracias!
Beau
4

Aquí le mostramos cómo asegurarse de que se llame a su hook_form_alter después de que otros módulos hook_form_alter:

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, &$form_state, $form_id) {
  // do your stuff
}

/**
 * Implements hook_module_implements_alter().
 *
 * Make sure that our form alter is called AFTER the same hook provided in xxx
 */
function my_module_module_implements_alter(&$implementations, $hook) {
  if ($hook == 'form_alter') {
    // Move my_module_rdf_mapping() to the end of the list. module_implements()
    // iterates through $implementations with a foreach loop which PHP iterates
    // in the order that the items were added, so to move an item to the end of
    // the array, we remove it and then add it.
    $group = $implementations['my_module'];
    unset($implementations['my_module']);
    $implementations['my_module'] = $group;
  }
}

Esto también funciona cuando el otro módulo ha proporcionado un enlace form_alter en la variación: hook_form_FORM_ID_alter. (explican eso en la documentación: hook_module_implements_alter ).

Sé que esta publicación es bastante similar a la publicación de wiifm, pero pensé que sería útil con un ejemplo con hook_form_alter

rosell.dk
fuente
No funciono para mi.
Achraf JEDAY