2015-05-25 8 views
6

Ho creato un modulo personalizzato che reindirizza l'utente in base a varie regole personalizzate. Il mio problema è capire dove posizionare il codice. In questo momento, ho:Dove inserire la logica di reindirizzamento in Drupal?

function mymodule_init() { 
    mymodule_redirect_now(); 
} 

Il "mymodule_redirect_now" in genere non fa nulla nella maggior parte dei casi, ma a volte può portare a "drupal_goto" essere licenziato off. Ciò funziona in pratica, ma causa altri problemi:

  1. Anche uno dei file cron ha esito negativo. (Cioè cron.php)
  2. test unitari sicuro (come in essi non possono finire perché questa "avanzamento" è visto come un fallimento)

dove sarebbe il posto più corretta per mettere reindirizzare logica simili , per evitare guasti ai test delle unità e guasti ai cron job?

UPDATE

Ho cercato di semplificare questa domanda, dal piuttosto portando verso il basso per una più semplice domanda. Fondamentalmente, voglio sapere come fermare cron di eseguire il seguente codice:

function mymodule_init() { 
    mymodule_redirect_now(); 
} 

Cron esegue sempre qualcosa in init, ma in questo caso, immaginiamo che il reindirizzamento ha la seguente logica:

function mymodule_redirect_now() 
{ 
    if (!$currentPathIsUS && $ipIsUS) { // lets pretend for now this always happens... 
     drupal_goto("us"); 
    } 
} 

In sostanza, se l'uso ha un indirizzo IP USA e il percorso corrente non è il percorso USA, è necessario reindirli al percorso/us.

Il problema è che, se eseguo cron dalla riga di comando, o da un browser, viene colpito il codice precedente prima di passare a qualsiasi altra funzione, ma a causa del "drupal_goto", non esegue mai effettivamente il cron codice.

  1. È una cattiva pratica fare ciò che sto facendo sopra? e se sì, qual è l'alternativa migliore?
  2. Come posso impedire a cron di eseguire il codice init in questo caso?

risposta

4

hook_init() verrà sempre eseguito all'inizio della richiesta, come notato.

Quando si dice "... reindirizza l'utente in base a varie regole personalizzate." cosa intendi? L'utente viene reindirizzato quando invia un modulo con alcuni contenuti? L'utente viene reindirizzato se visita un (o un insieme di) URL specifici? Quali condizioni ci sono? È lo Rules module?

A seconda delle regole personalizzate, ci saranno risposte diverse. Ad esempio se le regole hanno qualcosa a che fare con i nodi (caricamento, visualizzazione, modifica, ...) devi usare hook_node_$op() dove $op può essere ad es. "visualizza", "carica" ​​o "invia". Per fare un esempio:

// 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"); 
    } 
} 

Modifica

ci sono due questioni in gioco qui come la vedo io.Uno è dove nel codice inserire la logica di reindirizzamento che in Drupal 7 (e 6) in realtà non ha una buona risposta breve, tutto dipende dal contesto. Potrebbe essere in risposta a una forma carico o una forma presentando o un nodo carico o visualizzazione o modifica (et.c.) o un numero di altre condizioni. Queste condizioni richiedono che la logica di reindirizzamento sia su diversi punti del codice. Questo è quello che mi stavo concentrando nel rispondere sopra.

Il secondo problema, che nel leggere i tuoi chiarimenti sembra essere il colpevole principale, è di un tipo diverso. Cron e unit test non avranno tutte le informazioni che un normale visitatore del browser web ha.

È necessario rilevare se cron is running e non reindirizzare quando ciò accade. Come vedi nel link sopra, cron crea un utente temporaneo (anonimo) e non salverà nessun dato di sessione. Questo ha la tendenza a rompere molte corse di cron. Perché drupal_exit() more or less kills everything.

Come per le unità di test drupal_goto(), sono meno sicuro qui, ma credo che si interrompa per lo stesso motivo. Potresti provare a prendere in giro parte della funzione in realtà non reindirizzare.


E come un lato nota si può prendere in considerazione l'utilizzo hook_url_inbound_alter() (more info). Potrebbe o potrebbe non essere compatibile con esattamente ciò che si desidera fare ... Look at what the Redirect module does, in particolare la funzione redirect_can_redirect().

+0

Sto usando init come un luogo da cui controllo e, in base a ciò, reindirizzare l'utente utilizzando drupal_goto. Il problema è che questo rompe anche i test di unità e cron, perché in alcuni casi stanno innescando le regole. Quindi, senza fare eccezioni specifiche per determinati percorsi, mi piacerebbe sapere, qual è il modo generale di gestire le regole che reindirizzano un utente che si affida alla prima volta che colpiscono il server? – coderama

+0

Non c'è un "modo generale", il modo dipende da cosa si sta testando, a meno che non si parli del modulo Regole (che ha la sua [documentazione] (https://www.drupal.org/documentation/modules /regole)). Tutti i visitatori che non hanno effettuato l'accesso in Drupal sono lo stesso utente (ID utente 0), ciò significa che non è possibile salvare una variabile sull'oggetto utente da controllare, ma sospetto che si possa risolvere ciò con 'user_cookie_save ($ valori) '. A seconda di quali sono le tue condizioni effettive, dovrai utilizzare diversi hook Drupal per ottenere il tuo reindirizzamento. –

+0

Siamo d'accordo con questo pseudo-codice: 'if ($ visitor_hits_server_first_time === true) {then_only_do_redirect_once(); } '? –

Problemi correlati