Como obter o ID do site atual no Painel de administração?

10

Estou trabalhando com uma extensão personalizada relacionada a vários sites. Deparo-me com um problema: defino um código de script a ser executado no Painel de Administração, obtendo o ID do site. Eu esperava resultado website_idcomo 0 (ID padrão na store_websitetabela). Mas quando eu uso essa função abaixo, ela sempre retorna 1.

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

Minha pergunta : Alguma maneira de se atualizar website_idno Painel de administração ou definir uma função executada na adminhtmlárea?

Nota: Esta função precisa funcionar no frontend e no backend.

Qualquer ajuda seria apreciada.

Thao Pham
fonte
verifique se o primeiro site múltiplo existe ou não em sua loja.
Suresh Chikani

Respostas:

18

A idéia geral é passar o escopo, escolhido, através do parâmetro request.

Eu acho que você deve usar o código semelhante, como na ação de edição do produto:

/** @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());

Nesse caso, $store->getWebsiteId()deve ser o ID do site real (selecionado). Mas isso pode ser feito apenas se você usar o bloco de loja que funciona da mesma maneira que um bloco magento padrão (para selecionar um escopo de loja):

seletor de loja

Aqui está o meu resultado no exemplo quando eu seleciono a visualização da loja padrão (id == 1):

1 exemplo de depuração da visualização da loja

e aqui está o escopo global padrão ( Todas as visualizações da loja , o ID do site é 0):

exemplo de depuração de escopo global


Atualizar:

Você pode adicionar um método como este no auxiliar e usá-lo onde quiser:

/**
 * @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;
}

O resultado deve ser assim:

  1. Back-end sem seletor de escopo - 0

    apoiado sem seletor de loja

  2. Apoiado com seletor de escopo - ID do site selecionado ou 0 se nada selecionado (Todas as visualizações da loja)

    back-end com seletor de loja

  3. Frontend - ID atual do site

    a parte dianteira


Se você está procurando o caminho mais curto no frontend:

Você pode usar a Magento\Store\Model\StoreResolverclasse para esse fim:

/**
 * @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();
}

Ele detecta corretamente a visualização da loja atualmente selecionada na área de front-end, mas é inútil para a área de administração.

Siarhey Uchukhlebau
fonte
Está funcionando no painel do administrador. No entanto, eu quero que ele obtenha o site atual no frontend. Esta função sempre retornawebsite_id = 0
Thao Pham 29/11
Essa função precisa funcionar no frontend e no backend.
Thao Pham #
@ Bill Você pode esclarecer em que lugar está tentando obter o ID da loja? É plugin ou talvez observador?
Siarhey Uchukhlebau
Olá @Siarhey Uchukhlebau, quero obtê-lo de uma aula. Esta classe pode ser chamado de qualquer outra classe, por exemplo: Controller, Modelo, Helper, Block, ...
Thao Pham
@ Bill Atualizei a resposta, verifique, por favor #
Siarhey Uchukhlebau