L'idée générale est de passer la portée choisie par le paramètre request.
Je pense que vous devriez utiliser le code similaire comme dans l'action d'édition du produit:
/** @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());
Dans ce cas, l' $store->getWebsiteId()
identifiant du site Web doit être réel (sélectionné). Mais cela ne peut être fait que si vous utilisez le bloc de magasin qui fonctionne de la même manière qu'un bloc magento standard (pour sélectionner une étendue de magasin):
Voici mon résultat dans l'exemple lorsque je sélectionne la vue de magasin par défaut (id == 1):
et voici la portée globale par défaut ( toutes les vues de magasin , l'ID du site Web est 0):
Mettre à jour:
Vous pouvez ajouter une méthode comme celle-ci dans l'assistant et l'utiliser où vous le souhaitez:
/**
* @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;
}
Le résultat devrait être comme ceci:
Backend sans sélecteur de portée - 0
Soutenu avec le sélecteur de portée - ID de site Web sélectionné ou 0 si rien n'est sélectionné (toutes les vues du magasin)
Frontend - identifiant actuel du site Web
Si vous recherchez le raccourci sur le frontend:
Vous pouvez utiliser la Magento\Store\Model\StoreResolver
classe à cette fin:
/**
* @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();
}
Il détecte correctement la vue de magasin actuellement sélectionnée sur la zone frontend, mais inutile pour la zone d'administration.