Làm cách nào để có được ID trang web hiện tại trong Bảng quản trị?


10

Tôi làm việc với một phần mở rộng tùy chỉnh liên quan đến nhiều trang web. Tôi gặp phải một vấn đề, xác định mã tập lệnh thực thi trong Bảng quản trị bằng cách lấy Id trang web. Tôi mong đợi kết quả website_idnhư 0 (ID mặc định trong store_websitebảng). Nhưng khi tôi sử dụng chức năng này bên dưới thì nó luôn trả về 1.

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

Câu hỏi của tôi : Bất kỳ cách nào để có được hiện tại website_idtrong Bảng quản trị hoặc xác định một chức năng chạy trong adminhtmlkhu vực?

Lưu ý: Chức năng này cần hoạt động trên cả frontend và backend.

Bất kỳ trợ giúp sẽ được đánh giá cao.


kiểm tra nhiều trang web đầu tiên tồn tại hay không trong cửa hàng của bạn.
Suresh Chikani

Câu trả lời:


18

Ý tưởng chung là để vượt qua phạm vi, được chọn, thông qua tham số yêu cầu.

Tôi nghĩ bạn nên sử dụng mã tương tự như trong hành động chỉnh sửa sản phẩm:

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

Trong trường hợp này $store->getWebsiteId()phải là id trang web thực tế (được chọn). Nhưng điều này chỉ có thể được thực hiện trong trường hợp bạn sử dụng khối cửa hàng hoạt động giống như khối magento tiêu chuẩn (để chọn phạm vi cửa hàng):

chọn cửa hàng

Đây là kết quả của tôi trong ví dụ khi tôi chọn chế độ xem cửa hàng mặc định (id == 1):

Ví dụ gỡ lỗi 1 cửa hàng xem

và ở đây dành cho phạm vi toàn cầu mặc định ( Tất cả Lượt xem cửa hàng , id trang web là 0):

ví dụ gỡ lỗi phạm vi toàn cầu


Cập nhật:

Bạn có thể thêm một phương thức như thế này trong trình trợ giúp và sử dụng nó ở nơi bạn muốn:

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

Kết quả sẽ như thế này:

  1. Phần cuối không có bộ chọn phạm vi - 0

    được hỗ trợ mà không có bộ chọn cửa hàng

  2. Được hỗ trợ với bộ chọn phạm vi - id trang web được chọn hoặc 0 nếu không có gì được chọn (Tất cả lượt xem cửa hàng)

    phụ trợ với bộ chọn cửa hàng

  3. Frontend - id trang web hiện tại

    mặt trận


Nếu bạn đang tìm kiếm con đường ngắn trên frontend:

Bạn có thể sử dụng Magento\Store\Model\StoreResolverlớp cho mục đích đó:

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

Nó phát hiện chính xác chế độ xem cửa hàng hiện được chọn trên khu vực lối vào, nhưng vô dụng đối với khu vực quản trị.


Nó hoạt động trong Bảng quản trị. Tuy nhiên, tôi muốn nó sẽ có được trang web hiện tại ở frontend. Chức năng này luôn quay trở lạiwebsite_id = 0
Thảo Phạm

Hàm này cần hoạt động trên cả frontend và backend.
Thảo Phạm

@Bill Bạn có thể làm rõ ở nơi bạn đang cố gắng để có được id cửa hàng không? Nó là plugin hoặc có thể là người quan sát?
Siarhey Uchukhlebau

Xin chào @Siarhey Uchukhlebau, tôi muốn lấy nó từ một lớp học. Lớp này có thể được gọi từ bất kỳ lớp nào khác, ví dụ: Người điều khiển, Người mẫu, Người trợ giúp, Khối, ...
Thảo Phạm

@Bill Tôi đã cập nhật câu trả lời, vui lòng kiểm tra
Siarhey Uchukhlebau
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.