2012-03-13 18 views
20

मैं कैसे बता सकता हूं कि वर्तमान अनुरोध बैकएंड या फ्रंटएंड पेज के लिए है या नहीं? यह चेक पर्यवेक्षक के अंदर किया जाएगा, इसलिए यदि अनुरोध करता है तो मेरे पास अनुरोध ऑब्जेक्ट तक पहुंच है।Magento अनुरोध - फ्रंटेंड या बैकएंड?

मैंने Mage::getSingleton('admin/session')->getUser() की जांच करने पर विचार किया लेकिन मुझे नहीं लगता कि यह एक बहुत ही विश्वसनीय तरीका है। मैं एक बेहतर समाधान की उम्मीद कर रहा हूं। फ़ॉलबैक जहां दुकान आईडी के रूप में सेट नहीं है के रूप में कार्य करने के लिए

Mage::getDesign()->getArea() == 'adminhtml' 

साथ

Mage::app()->getStore()->isAdmin() 

संयोजन के रूप में: यदि आप का उपयोग करना चाहेंगे

उत्तर

55

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

मैं थोड़ी देर के लिए

Mage::app()->getStore()->isAdmin() 

उपयोग कर रहा था, लेकिन यह पता चला कुछ व्यवस्थापक पृष्ठों (Magento कनेक्ट पैकेज प्रबंधक) जहां यह सच नहीं है देखते हैं। किसी कारण से यह पृष्ठ स्पष्ट रूप से स्टोर आईडी को 1 सेट करता है, जो isAdmin को झूठी के रूप में लौटाता है।

#File: app/code/core/Mage/Connect/controllers/Adminhtml/Extension/CustomController.php 
public function indexAction() 
{ 
    $this->_title($this->__('System')) 
     ->_title($this->__('Magento Connect')) 
     ->_title($this->__('Package Extensions')); 

    Mage::app()->getStore()->setStoreId(1); 
    $this->_forward('edit'); 
} 

इस व्यवहार के अन्य पृष्ठों हो सकता है,

एक और अच्छा शर्त डिजाइन पैकेज की "क्षेत्र" संपत्ति की जांच करने के लिए है।

यह व्यवस्थापक में मौजूद पृष्ठ के लिए ओवरराइड होने की संभावना कम है, क्योंकि क्षेत्र प्रशासन क्षेत्रों के डिजाइन टेम्पलेट्स और लेआउट XML फ़ाइलों के पथ को प्रभावित करता है।

क्या आप, पर्यावरण से यह निष्कर्ष निकाल नई Magento मॉड्यूल बनाते हैं, और

class Namespace_Modulename_Helper_Isadmin extends Mage_Core_Helper_Abstract 
{ 
    public function isAdmin() 
    { 
     if(Mage::app()->getStore()->isAdmin()) 
     { 
      return true; 
     } 

     if(Mage::getDesign()->getArea() == 'adminhtml') 
     { 
      return true; 
     } 

     return false; 
    } 
} 

और फिर इसे करने के लिए एक सहायक वर्ग को जोड़ने जब भी आप अगर आप व्यवस्थापक, उपयोग में हो जांच करने की आवश्यकता के लिए चुनते हैं की परवाह किए बिना इस सहायक

if(Mage::helper('modulename/isadmin')->isAdmin()) 
{ 
    //do the thing about the admin thing 
} 

इस तरह, जब/अगर आप अपने व्यवस्थापक जाँच तर्क में छेद की खोज, आप एक केंद्रीकृत स्थान में सब कुछ सही कर सकते हैं।

+0

जानकारी एलन के लिए धन्यवाद! मैं वास्तव में इसे [आपके आईई 9 फिक्स] (http://alanstorm.com/ie9_fix_for_magento) को अनुकूलित करने के लिए उपयोग कर रहा हूं, क्योंकि यह हमारे डिजाइनरों के लिए अग्रभाग पर कुछ मुद्दों का कारण बन रहा था। यह व्यवस्थापक क्षेत्र में पूरी तरह से काम करता है, इसलिए उस समाधान के साथ आने के लिए भी धन्यवाद :) –

+0

छोटी दुनिया! इसके अलावा, नीचे बीप तर्क का जवाब शायद आपकी सबसे अच्छी शर्त ** ** ** यह आपके समाधान के साथ जैव करता है। (यानी यदि आप केवल अपने पक्ष को व्यवस्थापक पक्ष पर आग लगाना चाहते हैं)। यदि आपके पास एक पर्यवेक्षक है जो फ्रंटेंड और बैकएंड दोनों पर चीजें कर रहा है, तो उपरोक्त एक अच्छी शुरुआत है। –

+0

ठीक है, यह जांचता नहीं है कि कोई स्क्रिप्ट बैकएंड में चलती है, लेकिन यदि कोई व्यवस्थापक लॉग इन है ... – feeela

10

Mage/Core/Model/Store.php अंदर तरीकों पर एक नज़र डालें आप उम्मीद करते हैं (Magento कनेक्ट इत्यादि)

+0

मुझे पता था कि यह कुछ आसान होगा: पी आपकी मदद के लिए धन्यवाद! –

+0

@ कोलिन जो सबकुछ पकड़ नहीं पाएगा। –

14

यदि आप पर्यवेक्षक का उपयोग करने में सक्षम हैं, तो आप इसे 'adminhtml' ईवेंट क्षेत्र तक सीमित कर सकते हैं।

<config> 
... 
    <adminhtml> 
    <events> 
     <core_block_abstract_prepare_layout_after> 
     <observers> 
      <mynamespace_mymodule_html_before> 
      <type>singleton</type> 
      <class>mynamespace_mymodule/observer</class> 
      <method>adminPrepareLayoutBefore</method> 
      </mynamespace_mymodule_html_before> 
     </observers> 
     </core_block_abstract_prepare_layout_after> 
    </events> 
    </adminhtml> 
</config> 
5

मुझे बीप तर्क का जवाब पसंद है - यह पर्यवेक्षकों के संदर्भ में समझ में आता है। मुझे एलन के बिंदु को भी पसंद है कि सभी संदर्भों में व्यवस्थापक स्थिति को जानने का कोई तरीका नहीं है, जो "व्यवस्थापक" का एक कार्य है जो ऐप और फ्रंट कंट्रोलर के बाद दर्ज किया गया है।

Magento का प्रशासन स्थिति प्रभावी ढंग से एक व्यवस्थापक कार्रवाई नियंत्रक को प्रेषण नियंत्रण से बनाया गया है; Mage_Adminhtml_Controller_Action::preDispatch() देखें। यह वह विधि है जो adminhtml_controller_action_predispatch_start ईवेंट को आग लगती है, जिसे Mage_Adminhtml_Model_Observer::bindStore() से उपभोग किया जाता है, जहां एडमिन स्टोर प्रारंभ में "सेट" होता है।वास्तव में, पर्यवेक्षक कॉन्फ़िगरेशन क्षेत्र (adminhtml बनाम अग्रभाग) मुख्य क्रिया नियंत्रक वर्ग की वजह से "काम करता है" - Mage_Core_Controller_Varien_Action::preDispatch() देखें, विशेष रूप से Mage::app()->loadArea($this->getLayout()->getArea()); - बस ध्यान दें कि लेआउट ऑब्जेक्ट में इसकी क्षेत्र जानकारी adminhtml predispatch में सेट है।

कोई फर्क नहीं पड़ता कि आप इसे कैसे फिसलते हैं, व्यवस्थापक व्यवहार जिस पर हम इतने सारे संदर्भों में भरोसा करते हैं - यहां तक ​​कि घटना पर्यवेक्षक प्रणाली के रूप में उच्च स्तर के रूप में कुछ भी - कमांड नियंत्रण संरचना पर निर्भर करता है।

<config> 
    <!-- ... --> 
    <adminhtml> 
    <events> 
     <core_block_abstract_prepare_layout_after> 
     <observers> 
      <mynamespace_mymodule_html_after> 
      <type>singleton</type> 
      <class>mynamespace_mymodule/observer</class> 
      <method>adminPrepareLayoutAfter</method> 
      </mynamespace_mymodule_html_after> 
     </observers> 
     </core_block_abstract_prepare_layout_after> 
    </events> 
    </adminhtml> 
    <frontend> 
    <events> 
     <core_block_abstract_prepare_layout_after> 
     <observers> 
      <mynamespace_mymodule_html_after> 
      <type>singleton</type> 
      <class>mynamespace_mymodule/observer</class> 
      <method>frontendPrepareLayoutAfter</method> 
      </mynamespace_mymodule_html_after> 
     </observers> 
     </core_block_abstract_prepare_layout_after> 
    </events> 
    </frontend> 
</config> 

अपने पर्यवेक्षक परिभाषा में:

class Mynamepace_Mymodule_Model_Observer 
{ 
    public function adminPrepareLayoutAfter() 
    { 
     $this->_prepareLayoutAfter('admin'); 
    } 

    public function frontendPrepareLayoutAfter() 
    { 
     $this->_prepareLayoutAfter('frontend'); 
    } 

    protected function _prepareLayoutAfter($area) 
    { 
     switch($area){ 
      case 'admin': 
       // do admin things 
       break; 

      case 'frontend': 
       // do frontend things 
       break; 

      default: 
       // i'm a moron 
     } 
    } 
} 

tl; डॉ: एक पर्यवेक्षक का प्रयोग करें, यहां तक ​​कि एक ही पर्यवेक्षक मॉडल का उपयोग, लेकिन एक अलग बुला विधि निर्दिष्ट करके संदर्भ में गुजरती हैं।

एचटीएच।

संपादित: एक प्रारंभिक बिंदु

0

मैं गलत या नहीं कर रहा हूँ (लेकिन मैं यह परीक्षण किया है) हैं, कुछ घटनाओं (controller_front_init_before) की तरह ही अंदर ओवरराइट किया जा सकता के रूप में बीप तर्क के config का उपयोग करके जोड़ा उदाहरण कोड वैश्विक नोड नतीजतन, यह ओवरराइड दोनों फ्रंटेंड और बैकएंड को प्रभावित करेगा।

फिर बचाव के लिए एलन और बेंचमार्क के समाधान को यह निर्दिष्ट करने के लिए आओ कि क्या आप पर्यवेक्षक को केवल आगे या बैकएंड पर लागू करना चाहते हैं।

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