我創建了一個基於各種自定義規則重定向用戶的自定義模塊。我的問題是搞清楚在哪裏放置代碼。現在,我有:在Drupal中放置重定向邏輯的位置?
function mymodule_init() {
mymodule_redirect_now();
}
的「mymodule_redirect_now」一般不會做在大多數情況下任何東西,但有時也可能導致「drupal_goto」被解僱了。這在實踐中可行,但會導致其他問題:
- 任何cron文件自動失敗。 (即cron.php)
- 單元測試失敗(如不能完成,因爲這個「轉到」被看作是一個失敗)
在哪裏將是把重定向邏輯這樣的最正確的地方,以避免失敗的單元測試和失敗的cron作業?
UPDATE
我試圖簡化這個問題,而通過把它歸結爲一個更簡單的問題。基本上,我想知道如何從執行以下代碼停止的cron:
function mymodule_init() {
mymodule_redirect_now();
}
的Cron一直執行初始化任何東西,但在這種情況下,讓我們想象重定向具有以下邏輯:
function mymodule_redirect_now()
{
if (!$currentPathIsUS && $ipIsUS) { // lets pretend for now this always happens...
drupal_goto("us");
}
}
基本上,如果使用的是US IP,並且當前路徑不是US路徑,則必須將它們重定向到/ us路徑。
問題是,如果我從命令行或瀏覽器運行cron,它在轉到任何其他函數之前碰到上述代碼,但由於「drupal_goto」,它實際上並沒有執行cron碼。
- 做上面我在做什麼是不好的做法?如果是這樣,那麼更好的選擇是什麼?
- 在這種情況下,如何停止執行init代碼的cron?
我使用init作爲我檢查的地方,並基於此,使用drupal_goto重定向用戶。問題是,這也打破了單元測試和cron的工作,因爲在某些情況下,它們觸發了規則。因此,在沒有爲特定路徑規定特定例外情況的情況下,我想知道,設置規則的一般方法是什麼?重定向依賴於第一次訪問服務器的用戶? – coderama
沒有「通用方法」,除非我們正在談論規則模塊(它有自己的[文檔](https://www.drupal.org/documentation/modules),否則這種方式取決於您正在測試的內容/規則))。所有未在Drupal中登錄的訪問者都是同一個用戶(用戶ID 0),這意味着你不能在用戶對象上保存一個變量來檢查,但是我懷疑你可以用'user_cookie_save($ values)來解決這個問題。 '。根據你的實際情況,你將不得不使用不同的Drupal鉤子來實現你的重定向。 –
我們對這個僞代碼有一個共同的理解:'if($ visitor_hits_server_first_time === true){then_only_do_redirect_once(); }'? –