Come ottenere l'ID sito Web corrente nel Pannello di amministrazione?


10

Sto lavorando con un'estensione personalizzata correlata a più siti Web. Devo affrontare un problema, definire un codice di script da eseguire nel Pannello di amministrazione ottenendo l'ID sito Web. Mi aspettavo risultati website_idcome 0 (ID predefinito nella store_websitetabella). Ma quando utilizzo questa funzione di seguito restituisco sempre 1.

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

La mia domanda : un modo per ottenere corrente website_idnel pannello di amministrazione o definire una funzione eseguita adminhtmlnell'area?

Nota: questa funzione deve funzionare sia sul frontend che sul backend.

Qualsiasi aiuto sarebbe apprezzato.


controlla che il primo sito web sia presente o meno nel tuo negozio.
Suresh Chikani,

Risposte:


18

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

selettore di negozi

Ecco il mio risultato nell'esempio quando seleziono la vista negozio predefinita (id == 1):

1 esempio di debug di visualizzazione negozio

e qui è per l'ambito globale predefinito ( Tutte le visualizzazioni dello store , l'ID del sito Web è 0):

esempio di debug di portata globale


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

  1. Backend senza selettore di ambito - 0

    supportato senza selettore negozio

  2. Supportato con selettore di ambito: ID sito Web selezionato o 0 se non è stato selezionato nulla (Tutte le viste dello store)

    backend con selettore negozio

  3. Frontend: ID sito Web corrente

    fine frontale


Se stai cercando la via breve sul frontend:

È possibile utilizzare la Magento\Store\Model\StoreResolverclasse 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.


Funziona nel Pannello di amministrazione. Tuttavia, voglio che otterrà il sito Web corrente nel frontend. Questa funzione ritorna semprewebsite_id = 0
Thao Pham,

Questa funzione deve funzionare sia sul frontend che sul backend.
Thao Pham,

@Bill Puoi chiarire in quale luogo stai cercando di ottenere l'ID del negozio? È un plugin o forse un osservatore?
Siarhey Uchukhlebau,

Ciao @Siarhey Uchukhlebau, voglio prenderlo da una lezione. Questa classe può essere chiamata da qualsiasi altra classe, ad esempio: Controller, Modello, Helper, Blocco, ...
Thao Pham,

@Bill Ho aggiornato la risposta, controlla per favore
Siarhey Uchukhlebau
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.