2015-05-25 9 views
6

मैंने एक कस्टम मॉड्यूल बनाया जो उपयोगकर्ता को विभिन्न कस्टम नियमों के आधार पर रीडायरेक्ट करता है। मेरी समस्या यह पता लग रही है कि कोड कहां रखा जाए। अभी, मेरे पास है:Drupal में रीडायरेक्ट तर्क कहां रखा जाए?

function mymodule_init() { 
    mymodule_redirect_now(); 
} 

"mymodule_redirect_now" आम तौर पर ज्यादातर मामलों में कुछ भी नहीं है, लेकिन कभी कभी यह "drupal_goto" में हो सकता है बंद निकाल दिया जा रहा है। यह अभ्यास में काम करता है, लेकिन अन्य मुद्दों का कारण बनता है:

  1. क्रॉन फ़ाइलों में से कोई भी स्वचालित रूप से विफल रहता है। (यानी cron.php)
  2. ईकाई परीक्षण असफल (के रूप में वे क्योंकि यह "गोटो" एक विफलता के रूप में देखा जाता है पूर्ण नहीं कर सकता)

कहाँ इस तरह तर्क अनुप्रेषित डाल करने के लिए सबसे सही जगह होगा , असफल यूनिट परीक्षणों और क्रॉन नौकरियों में विफल होने से बचने के लिए?

अद्यतन

मैं इस सवाल को आसान बनाने, बल्कि यह एक और सरल प्रश्न के नीचे लाकर कोशिश की है। असल में, मैं निम्नलिखित कोड को क्रियान्वित करने से क्रॉन रोकने के लिए जानना चाहता हूँ:

function mymodule_init() { 
    mymodule_redirect_now(); 
} 

क्रॉन हमेशा init में कुछ भी कार्यान्वित करता है, लेकिन इस मामले में, मान लें रीडायरेक्ट करना तर्क है कि करते हैं:

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

असल में, यदि उपयोग में यूएस आईपी है और वर्तमान पथ यूएस पथ नहीं है, तो उसे उन्हें/हमारे पथ पर रीडायरेक्ट करना होगा।

समस्या यह है कि, यदि मैं कमांड लाइन से या ब्राउज़र से क्रॉन चलाता हूं, तो यह किसी अन्य फ़ंक्शन पर जाने से पहले उपरोक्त कोड को हिट करता है, लेकिन "drupal_goto" की वजह से, यह वास्तव में क्रॉन निष्पादित नहीं करता है कोड।

  1. क्या मैं ऊपर क्या कर रहा हूं यह करने के लिए यह बुरा अभ्यास है? और यदि हां, तो बेहतर विकल्प क्या है?
  2. मैं इस मामले में इनिट कोड को निष्पादित करने से क्रॉन को कैसे रोक सकता हूं?

उत्तर

4

hook_init() जैसा आपने देखा है अनुरोध की शुरुआत में हमेशा चलता रहेगा।

जब आप कहते हैं "... उपयोगकर्ता को विभिन्न कस्टम नियमों के आधार पर रीडायरेक्ट करता है।" आपका मतलब क्या है? क्या उपयोगकर्ता को कुछ सामग्री के साथ फ़ॉर्म सबमिट करते समय पुनर्निर्देशित किया जा रहा है? यदि उपयोगकर्ता विशिष्ट URL के (या एक सेट) पर जाकर रीडायरेक्ट किया जा रहा है? क्या स्थितियां हैं? क्या यह Rules module है?

आपके द्वारा निर्धारित कस्टम नियमों के आधार पर अलग-अलग उत्तर होंगे। उदाहरण के लिए यदि नियमों में नोड्स (लोडिंग, देखने, संपादन, ...) के साथ कुछ करना है तो आपको hook_node_$op() का उपयोग करना होगा जहां $op उदाहरण हो सकता है "देखें", या "लोड", या "सबमिट करें"। एक उदाहरण के रूप:

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

संपादित

वहाँ दो मुद्दों खेल में यहाँ के रूप में मैं इसे देख रहे हैं।एक जहां कोड में तर्क जो Drupal 7 में (और 6) वास्तव में एक अच्छा संक्षिप्त उत्तर नहीं है अनुप्रेषित जगह है, यह सब संदर्भ पर निर्भर करता। यह एक रूप लोड हो रहा है या एक रूप सबमिट करना या नोड लोड हो रहा है या देखने या संपादन (et.c.) या अन्य स्थितियों की एक संख्या के जवाब में हो सकता है। इन स्थितियों की आवश्यकता है कि रीडायरेक्ट तर्क आपके कोड में विभिन्न स्थानों पर हो। यही वह है जो मैं उपरोक्त उत्तर देने पर ध्यान केंद्रित कर रहा था।

दूसरा मुद्दा है, अपने स्पष्टीकरण पढ़ने के बाद मुख्य दोषी प्रतीत हो रहा है, जो एक अलग प्रकार की है। क्रॉन और यूनिट परीक्षणों में एक नियमित वेब ब्राउजर विज़िटर की सारी जानकारी नहीं होगी।

आप अगर cron is running पता लगाने के लिए और रीडायरेक्ट नहीं जब ऐसा होता है होगा। जैसा कि आप उपरोक्त लिंक में देखते हैं, एक अस्थायी (अनाम) उपयोगकर्ता बनाता है और कोई सत्र डेटा सहेज नहीं पाएगा। इसमें कई क्रॉन रन तोड़ने की प्रवृत्ति है। क्योंकि drupal_exit() more or less kills everything

इकाई परीक्षण drupal_goto() का सवाल है, मैं यहाँ कम यकीन है, लेकिन मेरा मानना ​​है कि यह एक ही कारण के लिए टूट जाता है। वास्तव में रीडायरेक्ट नहीं करने के लिए आप फ़ंक्शन का हिस्सा नकल करने का प्रयास कर सकते हैं।


और एक पक्ष के रूप में ध्यान दें कि आप hook_url_inbound_alter() (more info) का उपयोग कर विचार कर सकते हैं। यह वास्तव में आप जो करना चाहते हैं उसके साथ संगत हो सकता है या नहीं ... Look at what the Redirect module does, विशेष रूप से फ़ंक्शन redirect_can_redirect()

+0

मैं एक जगह है जहाँ से मैं जांच कर के रूप में init का उपयोग कर रहा है, और उस पर आधारित है, drupal_goto का उपयोग कर उपयोगकर्ता अनुप्रेषित। समस्या यह है कि यह इकाई परीक्षण और क्रॉन नौकरियों को तोड़ देता है, क्योंकि कुछ मामलों में वे नियमों को ट्रिगर कर रहे हैं। तो कुछ पथों के लिए विशिष्ट अपवादों के बिना, मैं जानना चाहता हूं कि ऐसे नियमों को स्थापित करने का सामान्य तरीका क्या है जो उपयोगकर्ता को रीडायरेक्ट करते हैं जो पहली बार सर्वर पर आते हैं? – coderama

+0

कोई "सामान्य तरीका" नहीं है, जिस तरह से आप परीक्षण कर रहे हैं उस पर निर्भर है, जब तक हम नियम मॉड्यूल के बारे में बात नहीं कर रहे हैं (जिसका अपना [दस्तावेज़ीकरण] है (https://www.drupal.org/documentation/modules/नियम))। Drupal में लॉग इन नहीं किए गए सभी विज़िटर एक ही उपयोगकर्ता हैं (उपयोगकर्ता आईडी 0), इसका मतलब यह है कि आप उपयोगकर्ता ऑब्जेक्ट पर एक चर को सहेजने के लिए सहेज नहीं सकते हैं, लेकिन मुझे संदेह है कि आप इसे 'user_cookie_save ($ मानों) के साथ हल कर सकते हैं। '। आपकी वास्तविक स्थितियों के आधार पर आपको अपने रीडायरेक्ट को प्राप्त करने के लिए विभिन्न ड्रूपल हुक का उपयोग करना होगा। –

+0

इस छद्म कोड के साथ एक आम समझ पर हम कर रहे हैं: 'अगर ($ visitor_hits_server_first_time === सच) {then_only_do_redirect_once(); } '? –

संबंधित मुद्दे