Як отримати поточний ідентифікатор веб-сайту на панелі адміністратора?


10

Я працюю зі спеціальним розширенням, пов’язаним із кількома веб-сайтами. Я зіткнувся з проблемою, визначте виконання сценарію коду на панелі адміністратора, отримавши ідентифікатор веб-сайту. Я очікував результат, website_idяк 0 (ідентифікатор за замовчуванням у store_websiteтаблиці). Але коли я використовую цю функцію нижче, вона завжди повертається 1.

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

Моє запитання : Будь-який спосіб отримати поточний website_idна Панелі адміністратора або визначити функцію, що виконується в цій adminhtmlобласті?

Примітка. Ця функція повинна працювати як на фронті, так і на вихідному.

Будь-яка допомога буде вдячна.


перевірте, чи існують у вашому магазині перші веб-сайти, що існують.
Суреш Чікані

Відповіді:


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()повинен бути фактичний (вибраний) ідентифікатор веб-сайту. Але це можна зробити лише в тому випадку, якщо ви використовуєте блок-магазин, який працює аналогічно стандартному блоку магенто (для вибору області зберігання):

селектор магазину

Ось мій результат у прикладі, коли я вибираю перегляд магазину за замовчуванням (id == 1):

Приклад налагодження перегляду в магазині

і ось для глобальної сфери за замовчуванням ( Усі перегляди магазину , ідентифікатор веб-сайту 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. У комплекті із селектором діапазону - вибраний ідентифікатор веб-сайту або 0, якщо нічого не вибрано (Усі перегляди магазину)

    бекенд із селектором магазину

  3. Frontend - поточний ідентифікатор веб-сайту

    фронтенд


Якщо ви шукаєте короткий шлях на передовій:

Для цього ви можете використовувати 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
Тао Фам

Ця функція повинна працювати як на фронті, так і на вихідному.
Тао Фам

@Bill Чи можете ви уточнити, в якому місці ви намагаєтеся отримати ідентифікатор магазину? Це плагін чи, можливо, спостерігач?
Сіархей Учукхлебау

Привіт @Siarhey Uchukhlebau, я хочу отримати його з класу. Цей клас може називатися з будь-якого іншого класу, наприклад: контролер, модель, помічник, блок, ...
Thao Pham

@Bill Я оновив відповідь, перевірте, будь ласка
Siarhey Uchukhlebau
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.