Jak uzyskać bieżący identyfikator witryny w panelu administracyjnym?

10

Pracuję z niestandardowym rozszerzeniem związanym z wieloma stronami internetowymi. Mam do czynienia z problemem, określam kod skryptu do wykonania w panelu administracyjnym, uzyskując identyfikator witryny. Oczekiwałem wyniku website_idjak 0 (domyślny identyfikator w store_websitetabeli). Ale kiedy korzystam z tej funkcji poniżej, zawsze zwraca 1.

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

Moje pytanie : Jakikolwiek sposób na uzyskanie website_iddostępu do panelu administracyjnego lub zdefiniowanie funkcji uruchamianej w adminhtmlobszarze?

Uwaga: Ta funkcja musi działać zarówno w interfejsie użytkownika, jak i w interfejsie użytkownika.

Każda pomoc będzie mile widziana.

Thao Pham
źródło
sprawdź, czy pierwsza strona internetowa istnieje lub nie jest w twoim sklepie.
Suresh Chikani,

Odpowiedzi:

18

Ogólna idea polega na przekazaniu wybranego zakresu przez parametr żądania.

Myślę, że powinieneś użyć podobnego kodu jak w akcji edycji produktu:

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

W takim przypadku $store->getWebsiteId()powinien być rzeczywisty (wybrany) identyfikator strony internetowej. Można to jednak zrobić tylko w przypadku użycia bloku sklepu, który działa w taki sam sposób, jak standardowy blok magento (aby wybrać zakres sklepu):

wybór sklepu

Oto mój wynik w przykładzie, gdy wybieram domyślny widok sklepu (id == 1):

Przykład debugowania widoku 1 sklepu

i tutaj jest domyślny zakres globalny ( Wszystkie wyświetlenia sklepu , identyfikator witryny to 0):

przykład debugowania w zakresie globalnym


Aktualizacja:

Możesz dodać taką metodę do pomocnika i użyć jej tam, gdzie chcesz:

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

Wynik powinien wyglądać następująco:

  1. Backend bez selektora zakresu - 0

    wspierane bez wyboru sklepu

  2. Kopia zapasowa z selektorem zakresu - wybrany identyfikator witryny lub 0, jeśli nic nie zostało zaznaczone (Wszystkie wyświetlenia sklepu)

    backend z selektorem sklepu

  3. Frontend - aktualny identyfikator strony internetowej

    frontend


Jeśli szukasz krótkiej drogi na froncie:

Możesz użyć Magento\Store\Model\StoreResolverklasy do tego celu:

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

Prawidłowo wykrywa aktualnie wybrany widok sklepu w obszarze interfejsu użytkownika, ale jest bezużyteczny dla obszaru administratora.

Siarhey Uchukhlebau
źródło
Działa w panelu administracyjnym. Jednak chcę, aby uzyskać bieżącą stronę internetową w interfejsie. Ta funkcja zawsze powracawebsite_id = 0
Thao Pham,
Ta funkcja musi działać zarówno na interfejsie użytkownika, jak i na interfejsie użytkownika.
Thao Pham
@Bill Czy możesz wyjaśnić, w którym miejscu próbujesz uzyskać identyfikator sklepu? Czy to wtyczka, czy może obserwator?
Siarhey Uchukhlebau
Cześć @Siarhey Uchukhlebau, chcę wziąć to z klasy. Tę klasę można wywołać z dowolnej innej klasy, np .: kontroler, model, pomocnik, blok, ...
Thao Pham,
@Bill Zaktualizowałem odpowiedź, sprawdź proszę
Siarhey Uchukhlebau