سؤال

كيف يمكنني معرفة ما إذا كان الطلب الحالي مخصصًا لصفحة خلفية أم واجهة أمامية؟سيتم إجراء هذا الفحص داخل مراقب، لذا يمكنني الوصول إلى كائن الطلب إذا كان ذلك مفيدًا.

فكرت في التحقق Mage::getSingleton('admin/session')->getUser() لكنني لا أعتقد أن هذه طريقة موثوقة للغاية.آمل أن أجد حلاً أفضل.

هل كانت مفيدة؟

المحلول

هذه واحدة من تلك المجالات التي لا توجد فيها إجابة جيدة.لا يوفر Magento نفسه طريقة/واجهة برمجة تطبيقات واضحة لهذه المعلومات، لذلك مع أي حل ستحتاج إلى فحص البيئة واستنتاج الأشياء.

كنت أستخدم

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

لفترة من الوقت، ولكن اتضح أن هناك صفحات إدارية معينة (مدير حزمة Magento Connect) حيث هذا غير صحيح.لسبب ما، تقوم هذه الصفحة بتعيين معرف المتجر بشكل صريح على 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
}

بهذه الطريقة، عندما/إذا اكتشفت ثغرات في منطق فحص المسؤول لديك، يمكنك تصحيح كل شيء في مكان مركزي واحد.

نصائح أخرى

إذا كنت قادرا على استخدام مراقب، فيمكنك تحديدها إلى منطقة الأحداث "adminhtml".

giveacodicetagpre.

إلقاء نظرة على الأساليب في الداخل Mage/Core/Model/Store.php سوف ترغب في استخدام:

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

بالتزامن مع

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

ليكون بمثابة احتياطي حيث لم يتم تعيين معرف المتجر كما تتوقع (اتصال Magento وما إلى ذلك)

تعجبني إجابة beep logic - فهي منطقية في سياق المراقبين.تعجبني أيضًا نقطة آلان القائلة بأنه لا توجد طريقة لمعرفة حالة المسؤول في جميع السياقات، وهي وظيفة "المسؤول" كونها حالة يتم إدخالها بعد تهيئة التطبيق ووحدة التحكم الأمامية.

يتم إنشاء حالة مسؤول 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.

بغض النظر عن كيفية تقسيمه، فإن سلوك المسؤول الذي نعتمد عليه في العديد من السياقات - حتى في شيء رفيع المستوى مثل نظام مراقبة الأحداث - يعتمد على بنية التحكم في الأوامر.

<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
        }
    }
}

ليرة تركية ؛ د:استخدم مراقبًا، حتى استخدم نفس نموذج المراقب، ولكن قم بالتمرير في السياق عن طريق تحديد طريقة اتصال مختلفة.

هث.

يحرر:تمت إضافة رمز المثال باستخدام تكوين beep logic كنقطة بداية

سواء كنت مخطئا أم لا (لكنني اختبرها)، يمكن الكتابة فوق بعض الأحداث (مثل Controller_Front_init_before) فقط داخل العقدة العالمية.نتيجة لذلك، سيؤثر هذا التجاوز على حد سواء الواجهة الواجهة والخارجية.

قد تعال حلا آلان وبينمارك إلى الإنقاذ لتحديد ما إذا كنت ترغب في تطبيق المراقب على الواجهة الأمامية فقط أو الخلفية فقط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top