Как получить текущий идентификатор сайта в панели администратора?

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()должен быть актуальный (выбранный) идентификатор сайта. Но это может быть сделано только в том случае, если вы используете блок хранилища, который работает так же, как стандартный блок magento (для выбора области хранилища):

выбор магазина

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

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
Тао Фам
Эта функция должна работать как на интерфейсе, так и на интерфейсе.
Тао Фам
@ Билл Можете ли вы уточнить, в каком месте вы пытаетесь получить идентификатор магазина? Это плагин или, возможно, наблюдатель?
Сергей Учухлебау
Привет @Siarhey Uchukhlebau, я хочу получить это от класса. Этот класс может быть вызван из любого другого класса, например: Контроллер, Модель, Помощник, Блок, ...
Тао Фам
@ Билл, я обновил ответ, пожалуйста, проверьте
Сергей Учухлебау