Wie erhalte ich die aktuelle Website-ID im Admin-Bereich?

10

Ich arbeite mit einer benutzerdefinierten Erweiterung, die sich auf mehrere Websites bezieht. Ich habe ein Problem. Definieren Sie einen Skriptcode, der im Admin-Bereich ausgeführt wird, indem Sie die Website-ID abrufen. Ich habe ein Ergebnis website_idwie 0 erwartet (Standard-ID in der store_websiteTabelle). Wenn ich diese Funktion unten verwende, wird immer 1 zurückgegeben.

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

Meine Frage : Gibt es eine Möglichkeit, website_idim Admin- adminhtmlBereich auf den neuesten Stand zu kommen oder eine Funktion zu definieren, die im Bereich ausgeführt wird?

Hinweis: Diese Funktion muss sowohl im Frontend als auch im Backend funktionieren.

Jede Hilfe wäre dankbar.

Thao Pham
quelle
Überprüfen Sie, ob die erste Multi-Website in Ihrem Shop vorhanden ist oder nicht.
Suresh Chikani

Antworten:

18

Die allgemeine Idee besteht darin, den ausgewählten Bereich über den Anforderungsparameter zu übergeben.

Ich denke, Sie sollten den ähnlichen Code wie in der Produktbearbeitungsaktion verwenden:

/** @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());

In diesem Fall $store->getWebsiteId()sollte die tatsächliche (ausgewählte) Website-ID angegeben werden. Dies ist jedoch nur möglich, wenn Sie den Speicherblock verwenden, der auf die gleiche Weise wie ein Standard-Magento-Block funktioniert (um einen Speicherbereich auszuwählen):

Speicherauswahl

Hier ist mein Ergebnis im Beispiel, wenn ich die Standardspeicheransicht (id == 1) auswähle:

1 Debug-Beispiel für die Speicheransicht

und hier ist für den globalen Standardbereich ( Alle Geschäftsansichten , Website-ID ist 0):

Beispiel für ein globales Scope-Debug


Aktualisieren:

Sie können eine solche Methode in den Helfer einfügen und dort verwenden, wo Sie möchten:

/**
 * @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;
}

Das Ergebnis sollte folgendermaßen aussehen:

  1. Backend ohne Scope Selector - 0

    ohne Store Selector gesichert

  2. Unterstützt mit Scope Selector - ausgewählte Website-ID oder 0, wenn nichts ausgewählt ist (Alle Store-Ansichten)

    Backend mit Store Selector

  3. Frontend - aktuelle Website-ID

    Vorderes Ende


Wenn Sie nach dem Kurzweg im Frontend suchen:

Sie können die Magento\Store\Model\StoreResolverKlasse für diesen Zweck verwenden:

/**
 * @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();
}

Es erkennt die aktuell ausgewählte Store-Ansicht im Frontend-Bereich korrekt, ist jedoch für den Admin-Bereich unbrauchbar.

Siarhey Uchukhlebau
quelle
Es funktioniert im Admin-Bereich. Ich möchte jedoch, dass die aktuelle Website im Frontend angezeigt wird. Diese Funktion kehrt immer zurückwebsite_id = 0
Thao Pham
Diese Funktion muss sowohl im Frontend als auch im Backend funktionieren.
Thao Pham
@ Bill Können Sie klären, an welcher Stelle Sie versuchen, die Geschäfts-ID zu erhalten? Ist es Plugin oder vielleicht Beobachter?
Siarhey Uchukhlebau
Hallo @Siarhey Uchukhlebau, ich möchte es aus einer Klasse bekommen. Diese Klasse kann von jeder anderen Klasse aufgerufen werden, zB: Controller, Model, Helper, Block, ...
Thao Pham
@ Bill Ich habe die Antwort aktualisiert, bitte überprüfen
Siarhey Uchukhlebau