如何在管理面板中获取当前的网站ID?


10

我使用与多个网站相关的自定义扩展程序。我遇到一个问题,通过获取网站ID定义在管理面板中执行的脚本代码。我预期结果website_id为0(store_website表中的默认ID )。但是当我在下面使用此函数时,它总是返回1。

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

我的问题:以任何方式website_id在管理面板中获取最新信息或定义在adminhtml区域中运行的功能?

注意: 此功能需要在前端和后端均起作用。

任何帮助,将不胜感激。


检查您的商店中是否存在第一个多网站。
Suresh Chikani

Answers:


18

一般的想法是通过请求参数传递选择的范围。

我认为您应该在产品编辑操作中使用类似的代码:

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

在这种情况下,$store->getWebsiteId()应该是实际的(选定的)网站ID。但这只能在您使用存储块的情况下进行,该存储块的工作方式与标准magento块相同(选择存储范围):

商店选择器

这是我选择默认商店视图(id == 1)时的示例结果:

1个商店视图调试示例

这是默认的全局范围(“ 所有商店视图 ”的网站ID为0):

全局范围调试示例


更新:

您可以在助手中添加这样的方法,并在需要的地方使用它:

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

结果应该是这样的:

  1. 没有范围选择器的后端-0

    没有商店选择器支持

  2. 具有范围选择器支持- 选定的网站ID;如果未选择则为0(所有商店视图)

    具有商店选择器的后端

  3. 前端- 当前网站ID

    前端


如果您正在寻找前端的短途路线:

您可以Magento\Store\Model\StoreResolver为此目的使用该类:

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

它可以正确检测前端区域上当前选择的商店视图,但对于管理区域没有用。


它正在管理面板中运行。但是,我希望它将在前端获得当前网站。此功能始终会返回website_id = 0
Thao Pham

此功能需要同时在前端和后端工作。
Thao Pham

@Bill您能说明要在哪个位置获取商店ID吗?是插件还是观察者?
Siarhey Uchukhlebau,2016年

@Siarhey Uchukhlebau,您好,我想从课堂上学到它。可以从任何其他类中调用该类,例如:控制器,模型,帮助器,块,...
Thao Pham

@Bill我更新了答案,请检查
Siarhey Uchukhlebau,2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.