Utworzono niestandardowy moduł, który przekierowuje użytkownika na podstawie różnych reguł niestandardowych. Mój problem polega na zastanawianiu się, gdzie umieścić kod. W tej chwili mam:Gdzie umieścić logikę przekierowania w Drupal?
function mymodule_init() {
mymodule_redirect_now();
}
W „mymodule_redirect_now” generalnie nic nie robić w większości przypadków, ale czasami może to spowodować „drupal_goto” wyrzuceniu off. Działa to w praktyce, ale powoduje inne problemy:
- Dowolny z plików cron automatycznie również zawiedzie. (Tj cron.php)
- testy jednostkowe nie (jak w nie można zakończyć, ponieważ ta „goto” jest postrzegany jako niepowodzenie)
Gdzie byłoby najbardziej właściwe miejsce, aby umieścić przekierowanie logikę tak , aby uniknąć niepowodzenia testów jednostkowych i nieudanych zadań crona?
UPDATE
starałem się uprościć to pytanie, by raczej obniżając ją do jeszcze jednego prostego pytania. Zasadniczo, chcę wiedzieć, jak zatrzymać crona od wykonywania następujący kod:
function mymodule_init() {
mymodule_redirect_now();
}
Cron zawsze wykonuje coś w init, ale w tym przypadku, wyobraźmy sobie, że przekierowanie ma następującą logiką:
function mymodule_redirect_now()
{
if (!$currentPathIsUS && $ipIsUS) { // lets pretend for now this always happens...
drupal_goto("us");
}
}
Zasadniczo, jeśli użycie ma amerykański adres IP, a obecna ścieżka nie jest ścieżką USA, musi przekierować je do ścieżki/us.
Problem polega na tym, że jeśli uruchomię crona z wiersza poleceń lub przeglądarki, uderzy w powyższy kod przed przejściem do jakiejkolwiek innej funkcji, ale z powodu "drupal_goto", to faktycznie nigdy nie wykonuje crona kod.
- Czy to jest zła praktyka robić to, co robię powyżej? a jeśli tak, to jaka jest lepsza alternatywa?
- W jaki sposób mogę zatrzymać cron przed uruchomieniem kodu init?
Używam init jako miejsca, z którego robię kontrole, i na tej podstawie przekierowuję użytkownika za pomocą drupal_goto. Problem polega na tym, że powoduje to również przerwanie testów jednostkowych i zadań cron, ponieważ w niektórych przypadkach uruchamiają one reguły. Więc bez robienia konkretnych wyjątków dla pewnych ścieżek, chciałbym wiedzieć, jaki jest ogólny sposób radzenia sobie z ustawianiem reguł przekierowujących użytkownika, który polega na tym, że po raz pierwszy trafili na serwer? – coderama
Nie ma "ogólnej drogi", droga jest zależna od tego, z czym testujesz, chyba że mówimy o module Reguły (który ma swoją własną dokumentację) (https://www.drupal.org/documentation/modules/rules)). Wszyscy odwiedzający, którzy nie są zalogowani w Drupal, są tym samym użytkownikiem (User ID 0), co oznacza, że nie można zapisać zmiennej na obiekcie użytkownika, aby sprawdzić, ale podejrzewam, że możesz rozwiązać to za pomocą 'user_cookie_save ($ values) '. W zależności od twoich rzeczywistych warunków będziesz musiał użyć różnych haków Drupala, aby osiągnąć swoje przekierowanie. –
Czy mamy do czynienia z powszechnym zrozumieniem tego pseudokodu: 'if ($ visitor_hits_server_first_time === true) {then_only_do_redirect_once(); } '? –