วิธีรับรหัสเว็บไซต์ปัจจุบันในแผงการดูแลระบบ


10

ฉันทำงานกับส่วนขยายที่กำหนดเองที่เกี่ยวข้องกับหลายเว็บไซต์ ฉันประสบกับปัญหากำหนดรหัสสคริปต์ดำเนินการในแผงการดูแลระบบโดยรับรหัสเว็บไซต์ ฉันคาดหวังผลลัพธ์website_idเช่น 0 (ID เริ่มต้นในstore_websiteตาราง) แต่เมื่อฉันใช้ฟังก์ชั่นด้านล่างมันจะคืนค่า 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

คำตอบ:


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 == 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

ฟังก์ชั่นนี้ต้องใช้งานได้ทั้งส่วนหน้าและส่วนหลัง
ท้าว Pham

@Bill คุณสามารถอธิบายสถานที่ที่คุณพยายามรับรหัสร้านค้าได้หรือไม่? มันเป็นปลั๊กอินหรืออาจสังเกตการณ์?
Siarhey Uchukhlebau

สวัสดี @Siarhey Uchukhlebau ฉันต้องการได้รับจากชั้นเรียน คลาสนี้อาจถูกเรียกจากคลาสอื่น ๆ เช่น: Controller, Model, Helper, Block, ...
Thao Pham

@Bill ฉันอัปเดตคำตอบโปรดตรวจสอบ
Siarhey Uchukhlebau
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.