drupal 7 - fivestar - ¿Dónde colocar la lógica de redirección en Drupal?
drupal fivestar (1)
hook_init()
siempre se ejecutará al inicio de la solicitud como habrás notado.
Cuando dice "... redirige al usuario según varias reglas personalizadas". ¿Qué quieres decir? ¿El usuario está siendo redirigido al enviar un formulario con algún contenido? ¿El usuario está siendo redirigido si visita una (o un conjunto de) URL específicas? ¿Qué condiciones hay? ¿Es el módulo de Reglas ?
Dependiendo de las reglas personalizadas, quiere decir que habrá diferentes respuestas. Por ejemplo, si las reglas tienen algo que ver con los nodos (cargar, ver, editar, ...) tienes que usar hook_node_$op()
donde $op
puede ser, por ejemplo, "ver", o "cargar", o "enviar". Como ejemplo:
// Redirect user when submitting a node of type ''book''
function mymodule_node_submit($node, $form, &$form_state) {
if ($node->type === ''book'') {
drupal_goto("some/place/else");
}
}
Editar
Aquí hay dos cuestiones en juego, como yo lo veo. Uno es donde en el código para ubicar la lógica de redirección que en Drupal 7 (y 6) realmente no tiene una buena respuesta corta, todo depende del contexto. Podría ser en respuesta a la carga de un formulario, a la presentación de un formulario o a la carga o visualización o edición de un nodo (et.c.) o a una serie de otras condiciones. Estas condiciones requieren que la lógica de redirección esté en diferentes lugares en su código. Esto es en lo que me estaba concentrando para responder arriba.
El segundo problema, que al leer sus aclaraciones parece ser el principal culpable, es de un tipo diferente. Las pruebas cronológicas y de unidades no tendrán toda la información que un visitante habitual del navegador web tenga.
Tendrá que detectar si cron se está ejecutando y no redireccionar cuando eso ocurra. Como puede ver en el enlace anterior, cron crea un usuario temporal (anónimo) y no guardará ningún dato de sesión. Esto tiene una tendencia a romper muchas ejecuciones de cron. Porque drupal_exit () más o menos mata todo .
En cuanto a las pruebas unitarias drupal_goto()
, estoy menos seguro aquí, pero creo que se rompe por la misma razón. Podría tratar de burlarse de parte de la función para no redirigirla.
Y como nota al margen, puede considerar usar hook_url_inbound_alter () ( más información ). Puede o no ser compatible con exactamente lo que quieres hacer ... Mira lo que hace el módulo Redirect , especialmente la función redirect_can_redirect()
.
Creé un módulo personalizado que redirige al usuario según varias reglas personalizadas. Mi problema es averiguar dónde colocar el código. En este momento, tengo:
function mymodule_init() {
mymodule_redirect_now();
}
El "mymodule_redirect_now" generalmente no hace nada en la mayoría de los casos, pero a veces puede hacer que se "dispare" drupal_goto. Esto funciona en la práctica, pero causa otros problemas:
- Cualquiera de los archivos cron automáticamente también falla. (es decir, cron.php)
- Las pruebas unitarias fallan (ya que no pueden finalizar porque este "goto" se ve como un error)
¿Dónde sería el lugar más correcto para colocar la lógica de redirección de esta manera, para evitar fallas en las pruebas unitarias y fallas en los trabajos cron?
ACTUALIZAR
Intenté simplificar esta pregunta, llevándola a una pregunta más simple. Básicamente, quiero saber cómo detener a cron para que ejecute el siguiente código:
function mymodule_init() {
mymodule_redirect_now();
}
Cron siempre ejecuta cualquier cosa en init, pero en este caso, imaginemos que la redirección tiene la siguiente lógica:
function mymodule_redirect_now()
{
if (!$currentPathIsUS && $ipIsUS) { // lets pretend for now this always happens...
drupal_goto("us");
}
}
Básicamente, si el uso tiene una dirección IP de los EE. UU. Y la ruta actual no es la ruta EE. UU., Debe redirigirlos a la ruta / us.
El problema es que si ejecuto cron desde la línea de comandos, o desde un navegador, aparece el código anterior antes de pasar a cualquier otra función, pero debido a "drupal_goto", en realidad no ejecuta el código cron.
- ¿Es una mala práctica hacer lo que estoy haciendo arriba? y si es así, ¿cuál es la mejor alternativa?
- ¿Cómo puedo evitar que cron ejecute el código de inicio en este caso?