Bagaimana cara mendapatkan ID Situs web saat ini di Panel Admin?

10

Saya bekerja dengan ekstensi khusus yang terkait dengan beberapa situs web. Saya menghadapi masalah, menentukan eksekusi kode skrip di Panel Admin dengan mendapatkan Id Situs Web. Saya mengharapkan hasil website_idseperti 0 (ID default dalam store_websitetabel). Tetapi ketika saya menggunakan fungsi ini di bawah selalu mengembalikan 1.

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

Pertanyaan Saya : Adakah cara untuk mendapatkan arus website_iddi Panel Admin atau menentukan fungsi yang dijalankan di adminhtmlarea?

Catatan: Fungsi ini perlu bekerja di bagian depan dan belakang.

Bantuan apa pun akan dihargai.

Thao Pham
sumber
periksa dulu ada multi situs web di toko Anda.
Suresh Chikani

Jawaban:

18

Gagasan umum adalah untuk melewatkan ruang lingkup, dipilih, melalui parameter permintaan.

Saya pikir Anda harus menggunakan kode yang sama seperti dalam tindakan edit produk:

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

Dalam hal ini $store->getWebsiteId()harus merupakan id situs web yang sebenarnya (dipilih). Tapi ini bisa dilakukan hanya jika Anda menggunakan blok toko yang bekerja dengan cara yang sama seperti blok magento standar (untuk memilih ruang lingkup toko):

pemilih toko

Ini adalah hasil saya dalam contoh ketika saya memilih tampilan store default (id == 1):

1 contoh debug tampilan toko

dan di sini adalah untuk cakupan global default ( Semua Tampilan Toko , id situs web adalah 0):

contoh debug lingkup global


Memperbarui:

Anda dapat menambahkan metode seperti ini di helper dan menggunakannya di tempat yang Anda inginkan:

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

Hasilnya harus seperti ini:

  1. Backend tanpa lingkup pemilih - 0

    didukung tanpa pemilih toko

  2. Didukung dengan lingkup pemilih - id situs web yang dipilih atau 0 jika tidak ada yang dipilih (Semua Tampilan Toko)

    backend dengan pemilih toko

  3. Frontend - id situs web saat ini

    paling depan


Jika Anda mencari jalan pintas di frontend:

Anda dapat menggunakan Magento\Store\Model\StoreResolverkelas untuk tujuan itu:

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

Itu benar mendeteksi tampilan toko yang dipilih saat ini di area frontend, tetapi tidak berguna untuk area admin.

Siarhey Uchukhlebau
sumber
Ini bekerja di Panel Admin. Namun, saya ingin itu akan mendapatkan situs web saat ini di frontend. Fungsi ini selalu kembaliwebsite_id = 0
Thao Pham
Fungsi ini perlu bekerja di bagian depan dan belakang.
Thao Pham
@ Bill Bisakah Anda menjelaskan di mana Anda mencoba mendapatkan id toko? Apakah itu plugin atau mungkin pengamat?
Siarhey Uchukhlebau
Hai @Siarhey Uchukhlebau, saya ingin mendapatkannya dari kelas. Kelas ini dapat dipanggil dari kelas lain misalnya: Controller, Model, Helper, Block, ...
Thao Pham
@Bill Aku memperbarui jawabannya, tolong periksa
Siarhey Uchukhlebau