2012-05-07 25 views
6

के लिए एक ही Magento मार्ग फ्रंटनाम का उपयोग करके मैंने Magento रूटिंग तर्क के साथ एक समस्या की खोज की और मैं यह देखना चाहता हूं कि कोई भी इसकी पुष्टि कर सकता है या नहीं।फ्रंटेंड और व्यवस्थापक राउटर

Magento स्टैक्स राउटर व्यवस्थापक, मानक, फिर डिफ़ॉल्ट और उन्हें एक समय में प्रक्रिया करता है। Magento यूआरएल के आधार पर वर्तमान मॉड्यूल नाम प्राप्त करता है (Mage_Core_Controller_Varien_Router_Standard::match()) देखें, फिर यह जांचता है कि मैगेंटो कॉन्फ़िगरेशन में फ्रंट नाम पर एक मैच के आधार पर मॉड्यूल को इस राउटर द्वारा संभाला जाना चाहिए। यदि कोई मिलान मिलता है, तो यह रूट करता है। , यह अगले रूटर करने के लिए जारी

कॉन्फ़िग अंश:।

 
    <admin> 
     <routers> 
      <myroute> 
       <use>admin</use> 
       <args> 
        <module>MyNamespace_MyModule</module> 
        <frontName>myroute</frontName> 
       </args> 
      </myroute> 
     </routers> 
    </admin> 
    <frontend> 
     <routers> 
      <myroute> 
       <use>admin</use> 
       <args> 
        <module>MyNamespace_MyModule</module> 
        <frontName>myroute</frontName> 
       </args> 
      </myroute> 
     </routers> 
    </frontend> 

इसका मतलब यह है कि अगर आप अपने व्यवस्थापक रूटर के रूप में अपने दृश्यपटल रूटर के लिए एक ही नाम का उपयोग करें, व्यवस्थापक रूटर हमेशा पहले मिलान किया जाएगा, यहां तक ​​कि पर फ्रंटेंड पेज। आपका फ्रंटएंड पेज अब व्यवस्थापक base_url का उपयोग कर एक व्यवस्थापक पृष्ठ के रूप में रूट करेगा, जो आपके स्टोर के यूआरएल से अलग हो सकता है क्योंकि टूटा हुआ रीडायरेक्ट होता है।

ध्यान दें कि यह समस्या Magento उदाहरणों में स्पष्ट नहीं है जहां व्यवस्थापक आधार URL अग्रभूमि आधार URL के समान है।

क्या कोई यह पुष्टि कर सकता है कि राउटर तर्क का मेरा आकलन सही है?

+2

मैं आपके विशिष्ट मुद्दे से बात नहीं कर सकता (मुझे यकीन नहीं है कि मैं इसे पूरी तरह से पालन करता हूं) लेकिन Magento में रूटिंग ने 1 के विचार के चारों ओर जेल करना शुरू कर दिया है। फ्रंटेंड मॉड्यूल के लिए कस्टम फ्रंटनाम का उपयोग करना; 2. व्यवस्थापक मॉड्यूल के लिए फ्रंटनाम "व्यवस्थापक" का उपयोग करना, और नियंत्रकों को अपने नियंत्रकों को जोड़ने के लिए "मॉड्यूल" टैग का उपयोग करके व्यवस्थापक राउटर की तलाश होगी। यदि आप इस पैटर्न से दूर तोड़ते हैं तो आप दर्द में भागने जा रहे हैं। –

+0

मुझे यह समस्या किसी तृतीय पक्ष मॉड्यूल में मिली। यह फ्रंटेंड और व्यवस्थापक क्षेत्रों के लिए एक ही फ्रंटनाम का इस्तेमाल करता था। यह काम करने की अपेक्षा करने के लिए एक उचित चीज की तरह लगता है, यूआरएल में "व्यवस्थापक" स्ट्रिंग होने का अंतर जो व्यवस्थापक स्टोर को लोड करता है। मुद्दा यह था कि फ्रंटएंड पेज को व्यवस्थापक राउटर द्वारा लोड किया जा रहा है, जिससे यह व्यवस्थापक आधार यूआरएल का उपयोग कर सकता है जो फ्रंटेंड बेस यूआरएल से अलग था। दोनों राउटर इस नामकरण संघर्ष को छोड़कर कॉन्फ़िगरेशन के आधार पर अपेक्षा के अनुसार काम करते हैं। – kirkmadera

+1

इस में देखकर मुझे एहसास हुआ कि मॉड्यूल काम नहीं कर रहा था जैसा मैंने सोचा था। यह पूरी तरह से व्यवस्थापक के बाहर अपना खुद का नाम स्थापित कर रहा था। व्यवस्थापक ने वही देखा क्योंकि मॉड्यूल के नियंत्रकों ने Mage_Adminhtml_Controller_Action को बढ़ाया, जिसका प्रीडिस्चैच डिज़ाइन को व्यवस्थापक डिज़ाइन पर मजबूर करता है। आप सही हैं कि सभी व्यवस्थापक नियंत्रकों को ओवरराइड करने के लिए "मॉड्यूल" नोड का उपयोग करके "व्यवस्थापक" फ्रंटनाम के माध्यम से प्रवाह करना चाहिए। यह तीसरा पक्ष मॉड्यूल ग़लत ढंग से स्थापित किया गया है। फिर भी, Magento – kirkmadera

उत्तर

3

यह एक Magento बग नहीं है, लेकिन मॉड्यूल लिखते समय या तृतीय पक्ष कोड के साथ काम करने के बारे में कुछ पता होना चाहिए। मैंने इस मुद्दे और संकल्प को here स्पष्ट किया है। अनिवार्य रूप से, मौजूदा व्यवस्थापक HTML मार्ग हमेशा नए व्यवस्थापक मार्ग बनाने के बजाय उपयोग किया जाना चाहिए। यह व्यवस्थापक में यूआरएल को लगातार बनाता है और संघर्ष से बचाता है। Magento रूटिंग बेहतर समझने में मेरी मदद करने के लिए एलन और जेरेड धन्यवाद।

+1

कप्तान, आपका ब्लॉग यूआरएल बदल गया, अब यह [यहां] है (http://blog.kirkmadera.com/magento-routing-using-the-same-frontname-for-admin-and-frontend-routes/)। –

4

आप विशेष रूप से Varien/रूटर/Standard.php से अधिक देखने के लिए रूप में अच्छी तरह कर सकते हैं:

/** 
* checking if this admin if yes then we don't use this router 
* 
* @return bool 
*/ 
protected function _beforeModuleMatch() 
{ 
    if (Mage::app()->getStore()->isAdmin()) { 
     return false; 
    } 
    return true; 
} 

और इस विधि match(Zend_Controller_Request_Http $request) के साथ-साथ collectRoutes($configArea, $useRouterName)$useRouterName के रूप में के भीतर बुलाया कभी कभी admin वापस आ जाएगी और यह भी नहीं है फ्रंटेंड अनुरोधों के लिए standard वापस करें। धारणा सही लगता है क्योंकि यह सभी इस बात पर निर्भर करता है कि कैसे Magento इस श्रेणी में _routes और _modules निजी सरणी बनाता है: Mage_Core_Controller_Varien_Router_Standard

मेरा मानना ​​है कि इस मामले में आप दृश्यपटल के लिए standard और admin व्यवस्थापक के लिए के रूप में <use> नोड निर्दिष्ट करें, या <global> नोड में नियंत्रक कार्रवाई के पुनर्लेखन के लिए चाहते हैं।

मुझे लगता है कि आपका सर्वश्रेष्ठ दांव से अधिक पढ़ने के लिए है:

और/या X-debug साथ तर्क से निकलते हैं।

यहां तक ​​कि उनके लेख में एलन तूफान लिखता है कि कैसे आगे के बैकएंड के लिए उपयोग किए जाने वाले समान राउटर समान नहीं होना चाहिए।

तो ऐसा लगता है कि मानक विधि राउटर ऑब्जेक्ट बेल्स सुनिश्चित करने के लिए यह तरीका यहां है, किसी कारण से, स्टोर मॉडल ऑब्जेक्ट इसे व्यवस्थापक मोड में सोचता है। मानक/एडमिन राउटर रिश्ते की तरह, स्टोर ऑब्जेक्ट उन चीजों में से एक है जो Magento विकास प्रक्रिया के कुछ हिस्सों को इंगित करता है, पहले फ्रंटेंड एप्लिकेशन पर ध्यान केंद्रित किया जा रहा है, और फिर बाद में व्यवस्थापक कंसोल पर काम करना और बैक-पोर्ट परिवर्तन करना ।

स्टोर ऑब्जेक्ट एक ऐसा मॉडल है जो वास्तव में केवल फ्रंटेंड/कार्ट एप्लिकेशन पर लागू होता है। हालांकि, क्योंकि Magento में इतना कोड स्टोर ऑब्जेक्ट मौजूद है मानता है, इसे व्यवस्थापक कंसोल एप्लिकेशन के लिए उपलब्ध होना आवश्यक है।यह बदले में, राउटर स्तर पर परेशानी पैदा करता है, जो इस तरह की जांच की ओर जाता है। अमूर्तता की कई परतें, कक्षाओं/मॉड्यूल के बीच कोई परिभाषित अनुबंध नहीं, और परीक्षणों की कमी से बनाए गए रिफैक्टरिंग का डर हमेशा इस तरह की परिस्थितियों का कारण बनता है।

+0

अच्छी व्याख्या से स्पष्ट व्यवहार नहीं है। मैं लोकप्रिय "ईएम क्विकशॉप" मॉड्यूल का उपयोग करके इस मुद्दे में भाग गया। इस साइट का व्यवस्थापक अनुभाग एक अलग डोमेन पर है, और HTTPS पर रीडायरेक्ट करने के हिस्से के रूप में, मॉड्यूल व्यवस्थापक डोमेन पर रीडायरेक्ट किया गया है और अनुरोध noroute गया था। एक ही रूट नाम का उपयोग करने के लिए निश्चित रूप से खराब अभ्यास। –

1

बस इसमें 2 सेंट फेंकने के लिए; मैंने निश्चित रूप से आज रात इस मुद्दे को देखा! मैं एक कस्टम मॉड्यूल का निर्माण कर रहा हूँ और मेरे config.xml रूटर तो तरह परिभाषित कर रहे हैं:

<admin> 
    <routers> 
     <namespace_module> 
      <use>admin</use> 
      <args> 
       <module>Namespace_Module</module> 
       <frontName>namespace_module</frontName> 
      </args> 
     </namespace_module> 
    </routers> 
</admin> 
<frontend> 
    <routers> 
     <namespace_module> 
      <use>standard</use> 
      <args> 
       <module>Namespace_Module</module> 
       <frontName>namespace_module</frontName> 
      </args> 
     </namespace_module> 
    </routers> 
</frontend> 

मैं दृश्यपटल पर एक 404 त्रुटि हो रही थी, जबकि बैकएंड रूटर ठीक काम किया।

<admin> 
    <routers> 
     <namespace_module> 
      <use>admin</use> 
      <args> 
       <module>Namespace_Module</module> 
       <frontName>namespace_module</frontName> 
      </args> 
     </namespace_module> 
    </routers> 
</admin> 
<frontend> 
    <routers> 
     <namespace_module> 
      <use>standard</use> 
      <args> 
       <module>Namespace_Module</module> 
       <frontName>namespace_module_front</frontName> 
      </args> 
     </namespace_module> 
    </routers> 
</frontend> 

भावना का एक अलग नाम मुझे लगता है कि उपयोग करने के लिए बनाता है: मैं दृश्यपटल नाम और देखा बदल गया है!

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