¿Cómo obtener la ID del sitio web actual en el Panel de administración?

10

Estoy trabajando con una extensión personalizada relacionada con múltiples sitios web. Me enfrento a un problema, defino un código de script que se ejecuta en el Panel de administración al obtener el Id. Esperaba un resultado website_idcomo 0 (ID predeterminada en la store_websitetabla). Pero cuando uso esta función a continuación, siempre devuelve 1.

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

Mi pregunta : ¿Alguna forma de ponerse al día website_iden el Panel de administración o definir una función ejecutada en el adminhtmlárea?

Nota: Esta función debe funcionar tanto en la interfaz como en el servidor.

Cualquier ayuda sería apreciada.

Thao Pham
fuente
compruebe si el primer sitio web múltiple existe o no en su tienda.
Suresh Chikani el

Respuestas:

18

La idea general es pasar el alcance, elegido, a través del parámetro de solicitud.

Creo que debería usar un código similar al de la acción de edición del producto:

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

En este caso, $store->getWebsiteId()debe ser la identificación real (seleccionada) del sitio web. Pero esto solo se puede hacer en caso de que use el bloque de tienda que funciona de la misma manera que un bloque de magento estándar (para seleccionar un alcance de tienda):

selector de tienda

Aquí está mi resultado en el ejemplo cuando selecciono la vista de tienda predeterminada (id == 1):

1 ejemplo de depuración de vista de tienda

y aquí está el alcance global predeterminado ( Todas las vistas de la tienda , la identificación del sitio web es 0):

ejemplo de depuración de alcance global


Actualizar:

Puede agregar un método como este en el asistente y usarlo donde desee:

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

El resultado debería ser así:

  1. Backend sin selector de alcance - 0

    respaldado sin selector de tienda

  2. Respaldado con selector de alcance: ID del sitio web seleccionado o 0 si no se selecciona nada (Todas las vistas de la tienda)

    backend con selector de tienda

  3. Frontend - ID actual del sitio web

    Interfaz


Si está buscando el camino corto en la interfaz:

Puede usar la Magento\Store\Model\StoreResolverclase para ese propósito:

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

Detecta correctamente la vista de la tienda seleccionada actualmente en el área de la interfaz, pero es inútil para el área de administración.

Siarhey Uchukhlebau
fuente
Está funcionando en el Panel de administración. Sin embargo, quiero que obtenga el sitio web actual en la interfaz. Esta función siempre vuelvewebsite_id = 0
Thao Pham
Esta función debe funcionar tanto en el frontend como en el backend.
Thao Pham
@ Bill ¿Puede aclarar en qué lugar está tratando de obtener la identificación de la tienda? ¿Es un complemento o tal vez un observador?
Siarhey Uchukhlebau
Hola @Siarhey Uchukhlebau, quiero obtenerlo de una clase. Esta clase se puede llamar desde cualquier otra clase, por ejemplo: Controlador, Modelo, Ayudante, Bloque, ...
Thao Pham
@Bill actualicé la respuesta, verifique por favor
Siarhey Uchukhlebau