管理者の現在のスコープから現在のストアIDを取得する方法


7

管理で現在のスコープストアのストアIDを取得するにはどうすればよいですか?

たとえば、左上隅のドロップダウンボックスを使用して、スコープをストアビューに変更した場合、現在スコープされているストアビューのストアIDを取得するにはどうすればよいですか。

Global
-> Website
--> Store
---> Store View (This is currently the scope, how do I get this store's id?)

私たちは他の誰かが書いた管理モジュールに取り組んでいます、それは壊れています、モジュールの修正は現在スコープされているストアのストアIDをヘルパーに渡すようです...


もう少しコンテキストが役立ちます。管理者は常にのストアIDで実行され0ますが、ここではそれが問題ではないようです。「現在のスコープストア」は少しあいまいです。
アランストーム

確かに、ストアID 0を探していません=]私の詳細な説明は、探しているものを説明するのに役立ちますか?
ジェフリーLロバーツ

壊れた投稿コードは、より多くの手掛かりを与えるでしょう
アントンS

回答:


11

たとえば、Modelドロップダウンのオプションの場合、次のコードを使用してアクティブレベルを取得できます。

if (strlen($code = Mage::getSingleton('adminhtml/config_data')->getStore())) // store level
{
    $store_id = Mage::getModel('core/store')->load($code)->getId();
}
elseif (strlen($code = Mage::getSingleton('adminhtml/config_data')->getWebsite())) // website level
{
    $website_id = Mage::getModel('core/website')->load($code)->getId();
    $store_id = Mage::app()->getWebsite($website_id)->getDefaultStore()->getId();
}
else // default level
{
    $store_id = 0;
}

これは常にアクティブなストアIDを返します。


好奇心が強い:なぜstrlenチェック?管理ストアが0だからですか?
philwinkle 2013

正直なところ、私がコードを書いたのはしばらく前なので、100%確実ではありませんが、設定されていない場合(つまり、より高いレベルにいる場合)に空の文字列が返されることを覚えています
Sander Mangel

私はMagento 1.8でこの方法を正常に使用していましたが、1.6で試行すると機能しなくなりました。モデルはそこにあり、内部的には同じメソッドを使用していますが、私のコードでは、常にストアID 0のデフォルトレベルを返します。これがなぜ起こっているのか、あなたが提供できるアイデアはありますか?
Prateek、2015

@Prateek hmわからない 確かに機能しているはずです。残念ながら、私はMagento 1.6を持っていないので、あなたを助けるのは難しいです。のファイルを比較して、app/code/core/Mage/Adminhtml何が変更されたかを確認できます。コメントを無視する場合は、リストを長くしすぎないようにしてください(著作権表示のため)
Sander Mangel

1.9ではストアとWebサイトの両方が空白になりましたが、以下のAlanの答えはうまくいきます。
ウィリアムオークリー2017年

7

管理者がどこでこの情報を取得しようとしているのかはまだはっきりしていません。System -> Configurationセクションのリクエストを処理している最中だと思います。うまくいけば、これはあなたを正しい方向に導きます

Magentoのすべてのフォームフィールドと同様に、リクエストオブジェクトからフィールドの値を取得できます。このようなことをする(コントローラーアクションから)

$current = Mage::app()->getRequest()->getParam('section');
$website = Mage::app()->getRequest()->getParam('website');
$store   = Mage::app()->getRequest()->getParam('store');

以下のためにあなたのフィールド値を与えるだろうsectionwebsiteと、storeスイッチャー要素によって渡される要素。store要素に興味があります。残念ながら、このフォームはストアのIDを渡しませんが、代わりにストアの短いコードを渡します

<option value="store_code" url="..." selected="selected" style="">Store View Name</option>

つまり、で短いコード$storeを取得し、それを使用してcore/storeモデルコレクションからストアの情報をフェッチする必要があります。

$store   = Mage::app()->getRequest()->getParam('store');

if($store)
{
    $c = Mage::getModel('core/store')->getCollection()
    ->addFieldToFilter('code', $store);        

    $item = $c->getFirstItem();

    var_dump($item->getData());

    var_dump($item->getStoreId());
}
else
{
    var_dump('Store Value Not Set');
}

5

残念ながら、システム構成ページを除いて、管理ページにスコープを追加する標準的な方法はありません。システム構成内でのみ必要な場合は、前述の回答が役立ちます。

そうでない場合、これは他のコア管理ページで行われる方法です。

製品管理

商品グリッドと商品編集ページにstoreは、ストアIDを含むURLパラメータがあります(商品の「ウェブサイト」スコープはありません)。中央で処理されるのではなく、それを必要とするブロックがパラメータに直接アクセスします。たとえば、製品グリッドのこのメソッド:

protected function _getStore()
{
    $storeId = (int) $this->getRequest()->getParam('store', 0);
    return Mage::app()->getStore($storeId);
}

カテゴリー管理

フォームはAJAXコントローラーアクションで読み込まれるため、ブラウザーのアドレスバーにURLパラメーターが表示されないことは、製品管理の場合と同じです。


これらは、私が知っているシステム構成の他に、スコープを切り替えることができる唯一の管理セクションです。カスタム管理モジュールがカタログ管理に追加される場合は、上記のようにストアパラメータを使用します。これらを例にとると、リクエストパラメータを同じ方法で使用できる場合があります。モジュールの使用中にHTTPリクエストを確認してください。


0

これ-私は信じます-はより良いコードです。例外(try...catch)を処理できますが、このバージョンでは無視され、ストアまたはWebサイトの要求パラメーターが既存のストアまたはWebサイトに対応していない場合のエラーを回避します。

protected function _getConfigScopeStoreId()
{
    $storeId = Mage_Core_Model_App::ADMIN_STORE_ID;
    $storeCode = (string)Mage::getSingleton('adminhtml/config_data')->getStore();
    $websiteCode = (string)Mage::getSingleton('adminhtml/config_data')->getWebsite();
    if ('' !== $storeCode) { // store level
        try {
            $storeId = Mage::getModel('core/store')->load( $storeCode )->getId();
        } catch (Exception $ex) {  }
    } elseif ('' !== $websiteCode) { // website level
        try {
            $storeId = Mage::getModel('core/website')->load( $websiteCode )->getDefaultStore()->getId();
        } catch (Exception $ex) {  }
    }
    return $storeId;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.