Comment obtenir l'ID de site Web actuel dans le panneau d'administration?

10

Je travaille avec une extension personnalisée liée à plusieurs sites Web. Je suis confronté à un problème, définissez un code de script à exécuter dans le panneau d'administration en obtenant l'ID de site Web. Je m'attendais à un résultat website_idcomme 0 (ID par défaut dans le store_websitetableau). Mais lorsque j'utilise cette fonction ci-dessous, elle renvoie toujours 1.

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

Ma question : Est-il possible de se mettre à jour website_iddans le panneau d'administration ou de définir une fonction exécutée dans la adminhtmlzone?

Remarque: Cette fonction doit fonctionner à la fois sur le frontend et le backend.

Toute aide serait appréciée.

Thao Pham
la source
vérifiez que le premier site Web multi existe ou non dans votre magasin.
Suresh Chikani

Réponses:

18

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):

sélecteur de magasin

Voici mon résultat dans l'exemple lorsque je sélectionne la vue de magasin par défaut (id == 1):

1 exemple de débogage de vue de magasin

et voici la portée globale par défaut ( toutes les vues de magasin , l'ID du site Web est 0):

exemple de débogage de portée globale


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:

  1. Backend sans sélecteur de portée - 0

    soutenu sans sélecteur de magasin

  2. 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)

    backend avec sélecteur de magasin

  3. Frontend - identifiant actuel du site Web

    l'extrémité avant


Si vous recherchez le raccourci sur le frontend:

Vous pouvez utiliser la Magento\Store\Model\StoreResolverclasse à 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.

Siarhey Uchukhlebau
la source
Cela fonctionne dans le panneau d'administration. Cependant, je veux qu'il obtienne le site Web actuel dans le frontend. Cette fonction revient toujourswebsite_id = 0
Thao Pham
Cette fonction doit fonctionner à la fois sur le frontend et le backend.
Thao Pham
@Bill Pouvez-vous préciser à quel endroit vous essayez d'obtenir l'ID du magasin? Est-ce un plugin ou peut-être un observateur?
Siarhey Uchukhlebau
Salut @Siarhey Uchukhlebau, je veux l'obtenir d'une classe. Cette classe peut être appelée depuis n'importe quelle autre classe par exemple: Controller, Model, Helper, Block, ...
Thao Pham
@Bill J'ai mis à jour la réponse, vérifiez s'il vous plaît
Siarhey Uchukhlebau