管理パネルで現在のWebサイトIDを取得するにはどうすればよいですか?


10

複数のWebサイトに関連するカスタム拡張機能を使用しています。問題が発生しました。ウェブサイトIDを取得して、管理パネルで実行するスクリプトコードを定義します。website_id0のような結果を期待しました(store_website表のデフォルトID )。しかし、以下でこの関数を使用すると、常に1が返されます。

/** @var \Magento\Store\Model\StoreManagerInterface */
$this->_storeManager->getStore()->getWebsiteId(); //return 1, expect 0
$this->_storeManager->getWebsite()->getId(); //return 1

私の質問website_id管理パネルで最新情報を取得したり、adminhtmlエリアで実行される関数を定義したりする方法はありますか?

注: この関数は、フロントエンドとバックエンドの両方で機能する必要があります。

任意の助けいただければ幸いです。


ストアに最初のマルチWebサイトが存在するかどうかを確認してください。
Suresh Chikani 16年

回答:


18

一般的な考え方は、選択されたスコープをリクエストパラメータを通じて渡すことです。

製品の編集アクションと同じようなコードを使用する必要があると思います。

/** @var \Magento\Store\Model\StoreManagerInterface $storeManager */
$storeManager = $this->_objectManager->get('Magento\Store\Model\StoreManagerInterface');
$storeId = (int) $this->getRequest()->getParam('store', 0);
$store = $storeManager->getStore($storeId);
$storeManager->setCurrentStore($store->getCode());

この場合$store->getWebsiteId()、実際の(選択された)WebサイトIDである必要があります。ただし、これは、標準のmagentoブロックと同じように機能するストアブロックを使用する場合にのみ実行できます(ストアスコープを選択するため)。

ストアセレクター

これは、デフォルトのストアビュー(id == 1)を選択した場合の例の結果です。

1ストアビューのデバッグ例

デフォルトのグローバルスコープの場合(すべてのストアビュー、ウェブサイトIDは0):

グローバルスコープのデバッグ例


更新:

このようなメソッドをヘルパーに追加して、必要な場所で使用できます。

/**
 * @var \Magento\Framework\App\State
 */
protected $state;

/**
 * @var \Magento\Store\Model\StoreManagerInterface
 */
protected $storeManager;

/**
 * Data constructor.
 * @param Context $context
 * @param \Magento\Framework\App\State $state
 * @param \Magento\Store\Model\StoreManagerInterface $storeManager
 */
public function __construct(
    Context $context,
    \Magento\Framework\App\State $state,
    \Magento\Store\Model\StoreManagerInterface $storeManager
) {
    parent::__construct($context);
    $this->state = $state;
    $this->storeManager = $storeManager;
}

/**
 * @return int
 */
public function resolveCurrentWebsiteId()
{
    if ($this->state->getAreaCode() == \Magento\Framework\App\Area::AREA_ADMINHTML) {
        // in admin area
        /** @var \Magento\Framework\App\RequestInterface $request */
        $request = $this->_request;
        $storeId = (int) $request->getParam('store', 0);
    } else {
        // frontend area
        $storeId = true; // get current store from the store resolver
    }

    $store = $this->storeManager->getStore($storeId);
    $websiteId = $store->getWebsiteId();

    return $websiteId;
}

結果は次のようになります。

  1. スコープセレクターなしのバックエンド-0

    ストアセレクターなしでバックアップ

  2. スコープセレクターでサポート- 選択したWebサイトID、または何も選択されていない場合は0(すべてのストアビュー)

    ストアセレクターを備えたバックエンド

  3. フロントエンド- 現在のウェブサイトID

    フロントエンド


フロントエンドで短い方法を探している場合:

Magento\Store\Model\StoreResolverそのためにクラスを使用できます。

/**
 * @var \Magento\Store\Model\StoreResolver
 */
private $storeResolver;

/**
 * @param \Magento\Store\Model\StoreResolver $storeResolver
 */
public function __construct(
    \Magento\Store\Model\StoreResolver $storeResolver
) {
    $this->storeResolver = $storeResolver;
}

/**
 * Returns the current store id, if it can be detected or default store id
 * 
 * @return int|string
 */
public function getCurrentStoreId()
{
    return $this->storeResolver->getCurrentStoreId();
}

フロントエンド領域で現在選択されているストアビューを正しく検出しますが、管理領域では役に立ちません。


管理パネルで機能しています。しかし、私はそれがフロントエンドで現在のウェブサイトを取得することを望んでいます。この関数は常に戻りますwebsite_id = 0
Thao Pham

この関数は、フロントエンドとバックエンドの両方で機能する必要があります。
Thao Pham、2016年

@BillストアIDを取得しようとしている場所を明確にできますか?それはプラグインですか、それともオブザーバーですか?
Siarhey Uchukhlebau

こんにちは@Siarhey Uchukhlebau、クラスから取得したいと思います。このクラスは、他のクラスから呼び出すことができます。例:コントローラー、モデル、ヘルパー、ブロックなど
Thao Pham

@Bill回答を更新しました。確認してください
Siarhey Uchukhlebau
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.