Magentoリクエスト - フロントエンドまたはバックエンド?
-
13-12-2019 - |
質問
現在の要求がバックエンドまたはフロントエンドページの場合はどうすればわかりますか。このチェックはオブザーバ内で行われますので、それが役立つ場合はリクエストオブジェクトにアクセスできます。
私はMage::getSingleton('admin/session')->getUser()
をチェックすると考えていましたが、それは非常に信頼できる方法だとは思わない。私はより良い解決策を望んでいます。
解決
これは良い答えがない領域の一つです。 Magento自体はこの情報の明示的なメソッド/ APIを提供していません。そのため、環境を調べて物事を推測する必要がある場合は、いかなる解決策も必要です。
私は
を使っていましたMage::app()->getStore()->isAdmin()
.
しばらくの場合がありますが、これが真でない特定の管理ページ(Magento Connect Package Manager)があることがわかります。何らかの理由で、このページは記憶域IDを1に明示的に設定します。これにより、isAdmin
がfalseとして返されます。
#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');
}
.
この動作を備えた他のページがあるかもしれません
もう一つの良い賭けは、デザインパッケージの「Area」プロパティを確認することです。
これは管理領域のデザインテンプレートとレイアウト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」のイベント領域に制限できます。
<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>
. 使用するMage/Core/Model/Store.php
内のメソッドを見てください。
Mage::app()->getStore()->isAdmin()
.
と組み合わせて
Mage::getDesign()->getArea() == 'adminhtml'
.
店舗IDが予想されているとおりに設定されていないフォールバックとして機能する(Magento Connectなど)
ビープ音の論理の答えが好きです - それは観察者の文脈では意味があります。 Alanのポイントは、すべてのコンテキストで管理状態を知る方法がないことがわかります。これは、アプリとフロントコントローラが初期化された後に入力された状態である状態です。
Magentoの管理者状態は、管理ディスパッチングから管理者アクションコントローラへの効果的に作成されます。 Mage_Adminhtml_Controller_Action::preDispatch()
を参照してください。これは、adminhtml_controller_action_predispatch_start
によって消費されるMage_Adminhtml_Model_Observer::bindStore()
イベントを起動する方法です。これは、管理ストアが最初に「Set」の場所です。実際、Main Action Controllerクラスのために、オブザーバ構成領域(AdminHTML vsフロントエンド) "Works" - Mage_Core_Controller_Varien_Action::preDispatch()
、特にMage::app()->loadArea($this->getLayout()->getArea());
を参照してください。
どのようにスライスするだけでなく、イベントオブザーバーシステムと同じようなものとしての何かでさえ、非常に多くのコンテキストに頼っている管理動作 - コマンド制御構造に依存しています。
<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; dr :オブザーバを使用すると、同じオブザーバモデルを使用しても、異なる呼び出し方法を指定してコンテキストを渡します。
hth.
edit :始動点としてのBeep Logicの設定を使用したコード例コード
私が間違っているかどうか(しかし私がそれをテストしました)、いくつかのイベント(controller_front_init_beforeなど)はグローバルノード内でのみ上書きできます。その結果、この上書きはフロントエンドとバックエンドの両方に影響します。
は、フロントエンドのみまたはバックエンドのみでオブザーバを適用するかどうかを指定するように、AlanとBenmarkのソリューションを指定します。