관리자 패널에서 현재 웹 사이트 ID를 얻는 방법은 무엇입니까?


10

여러 웹 사이트와 관련된 사용자 지정 확장 프로그램을 사용하고 있습니다. 문제가 발생했습니다. 웹 사이트 ID를 가져 와서 관리자 패널에서 스크립트 코드 실행을 정의하십시오. 나는 website_id0과 같은 결과를 기대 했다 ( 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

답변:


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 여야합니다. 그러나 이것은 표준 마 젠토 블록과 같은 방식으로 작동하는 상점 블록을 사용하는 경우에만 가능합니다 (점포 범위 선택).

상점 선택기

다음은 기본 상점보기 (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

@Siarhey Uchukhlebau 안녕하세요, 수업에서 가져오고 싶습니다. 이 클래스는 다른 클래스에서 호출 될 수 있습니다. 예 : Controller, Model, Helper, Block, ...
Thao Pham

@Bill 나는 대답을 업데이트하고, 확인하십시오
Siarhey Uchukhlebau
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.