Загальна ідея полягає у передачі обраної області через параметр запиту.
Я думаю, ви повинні використовувати аналогічний код, як у дії з редагування продукту:
/** @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;
}
Результат повинен бути таким:
Бекенд без вибору діапазону - 0
У комплекті із селектором діапазону - вибраний ідентифікатор веб-сайту або 0, якщо нічого не вибрано (Усі перегляди магазину)
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();
}
Він правильно визначає обраний на даний момент вигляд магазину на фронтальній ділянці, але марний для адміністратора.