L'idea generale è di passare l'ambito, scelto, attraverso il parametro di richiesta.
Penso che dovresti usare il codice simile come nell'azione di modifica del prodotto:
/** @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());
In questo caso $store->getWebsiteId()
dovrebbe essere l'ID del sito Web effettivo (selezionato). Ma questo può essere fatto solo nel caso in cui utilizzi il blocco negozio che funziona allo stesso modo di un blocco magento standard (per selezionare un ambito negozio):
Ecco il mio risultato nell'esempio quando seleziono la vista negozio predefinita (id == 1):
e qui è per l'ambito globale predefinito ( Tutte le visualizzazioni dello store , l'ID del sito Web è 0):
Aggiornare:
Puoi aggiungere un metodo come questo nell'helper e usarlo dove vuoi:
/**
* @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;
}
Il risultato dovrebbe essere così:
Backend senza selettore di ambito - 0
Supportato con selettore di ambito: ID sito Web selezionato o 0 se non è stato selezionato nulla (Tutte le viste dello store)
Frontend: ID sito Web corrente
Se stai cercando la via breve sul frontend:
È possibile utilizzare la Magento\Store\Model\StoreResolver
classe a tale scopo:
/**
* @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();
}
Rileva correttamente la vista dello store attualmente selezionata nell'area frontend, ma inutile per l'area di amministrazione.