mirror of
https://github.com/bdnugget/magento2.git
synced 2026-11-07 17:27:36 +00:00
635 lines
15 KiB
PHP
635 lines
15 KiB
PHP
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
declare(strict_types=1);
|
|
|
|
namespace Magento\Backend\Block\Store;
|
|
|
|
use Magento\Framework\Exception\LocalizedException;
|
|
|
|
/**
|
|
* Store switcher block
|
|
*
|
|
* @api
|
|
* @since 100.0.2
|
|
*/
|
|
class Switcher extends \Magento\Backend\Block\Template
|
|
{
|
|
/**
|
|
* URL for store switcher hint
|
|
*/
|
|
public const HINT_URL = 'https://experienceleague.adobe.com/docs/commerce-admin/start/setup/websites-stores-views.html#scope-settings'; // @codingStandardsIgnoreLine
|
|
|
|
/**
|
|
* Name of website variable
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_defaultWebsiteVarName = 'website';
|
|
|
|
/**
|
|
* Name of store group variable
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_defaultStoreGroupVarName = 'group';
|
|
|
|
/**
|
|
* Name of store variable
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_defaultStoreVarName = 'store';
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
protected $_storeIds;
|
|
|
|
/**
|
|
* Url for store switcher hint
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_hintUrl;
|
|
|
|
/**
|
|
* @var bool
|
|
*/
|
|
protected $_hasDefaultOption = true;
|
|
|
|
/**
|
|
* Block template filename
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_template = 'Magento_Backend::store/switcher.phtml';
|
|
|
|
/**
|
|
* @var \Magento\Store\Model\WebsiteFactory
|
|
*/
|
|
protected $_websiteFactory;
|
|
|
|
/**
|
|
* @var \Magento\Store\Model\GroupFactory
|
|
*/
|
|
protected $_storeGroupFactory;
|
|
|
|
/**
|
|
* @var \Magento\Store\Model\StoreFactory
|
|
*/
|
|
protected $_storeFactory;
|
|
|
|
/**
|
|
* Switcher constructor.
|
|
*
|
|
* @param \Magento\Backend\Block\Template\Context $context
|
|
* @param \Magento\Store\Model\WebsiteFactory $websiteFactory
|
|
* @param \Magento\Store\Model\GroupFactory $storeGroupFactory
|
|
* @param \Magento\Store\Model\StoreFactory $storeFactory
|
|
* @param array $data
|
|
*/
|
|
public function __construct(
|
|
\Magento\Backend\Block\Template\Context $context,
|
|
\Magento\Store\Model\WebsiteFactory $websiteFactory,
|
|
\Magento\Store\Model\GroupFactory $storeGroupFactory,
|
|
\Magento\Store\Model\StoreFactory $storeFactory,
|
|
array $data = []
|
|
) {
|
|
parent::__construct($context, $data);
|
|
$this->_websiteFactory = $websiteFactory;
|
|
$this->_storeGroupFactory = $storeGroupFactory;
|
|
$this->_storeFactory = $storeFactory;
|
|
}
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
protected function _construct()
|
|
{
|
|
parent::_construct();
|
|
|
|
$this->setUseConfirm($this->hasData('use_confirm') ? (bool)$this->getData('use_confirm') : true);
|
|
|
|
$this->setUseAjax(true);
|
|
|
|
$this->setShowManageStoresLink(0);
|
|
|
|
if (!$this->hasData('switch_websites')) {
|
|
$this->setSwitchWebsites(false);
|
|
}
|
|
if (!$this->hasData('switch_store_groups')) {
|
|
$this->setSwitchStoreGroups(false);
|
|
}
|
|
if (!$this->hasData('switch_store_views')) {
|
|
$this->setSwitchStoreViews(true);
|
|
}
|
|
$this->setDefaultSelectionName(__('All Store Views'));
|
|
}
|
|
|
|
/**
|
|
* Get website collection.
|
|
*
|
|
* @return \Magento\Store\Model\ResourceModel\Website\Collection
|
|
*/
|
|
public function getWebsiteCollection()
|
|
{
|
|
$collection = $this->_websiteFactory->create()->getResourceCollection();
|
|
|
|
$websiteIds = $this->getWebsiteIds();
|
|
if ($websiteIds !== null) {
|
|
$collection->addIdFilter($this->getWebsiteIds());
|
|
}
|
|
|
|
return $collection->load();
|
|
}
|
|
|
|
/**
|
|
* Get websites
|
|
*
|
|
* @return \Magento\Store\Model\Website[]
|
|
*/
|
|
public function getWebsites()
|
|
{
|
|
$websites = $this->_storeManager->getWebsites();
|
|
if ($websiteIds = $this->getWebsiteIds()) {
|
|
$websites = array_intersect_key($websites, array_flip($websiteIds));
|
|
}
|
|
return $websites;
|
|
}
|
|
|
|
/**
|
|
* Check if can switch to websites
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isWebsiteSwitchEnabled()
|
|
{
|
|
return (bool)$this->getData('switch_websites');
|
|
}
|
|
|
|
/**
|
|
* Set website variable name.
|
|
*
|
|
* @param string $varName
|
|
* @return $this
|
|
*/
|
|
public function setWebsiteVarName($varName)
|
|
{
|
|
$this->setData('website_var_name', $varName);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get website variable name.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getWebsiteVarName()
|
|
{
|
|
if ($this->hasData('website_var_name')) {
|
|
return (string)$this->getData('website_var_name');
|
|
} else {
|
|
return (string)$this->_defaultWebsiteVarName;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if current website selected.
|
|
*
|
|
* @param \Magento\Store\Model\Website $website
|
|
* @return bool
|
|
*/
|
|
public function isWebsiteSelected(\Magento\Store\Model\Website $website)
|
|
{
|
|
return $this->getWebsiteId() === $website->getId() && $this->getStoreId() === null;
|
|
}
|
|
|
|
/**
|
|
* Return website Id.
|
|
*
|
|
* @return int|null
|
|
*/
|
|
public function getWebsiteId()
|
|
{
|
|
if (!$this->hasData('website_id')) {
|
|
$this->setData('website_id', (int)$this->getRequest()->getParam($this->getWebsiteVarName()));
|
|
}
|
|
return $this->getData('website_id');
|
|
}
|
|
|
|
/**
|
|
* Return group collection provided website.
|
|
*
|
|
* @param int|\Magento\Store\Model\Website $website
|
|
* @return \Magento\Store\Model\ResourceModel\Group\Collection
|
|
*/
|
|
public function getGroupCollection($website)
|
|
{
|
|
if (!$website instanceof \Magento\Store\Model\Website) {
|
|
$website = $this->_websiteFactory->create()->load($website);
|
|
}
|
|
return $website->getGroupCollection();
|
|
}
|
|
|
|
/**
|
|
* Get store groups for specified website
|
|
*
|
|
* @param \Magento\Store\Model\Website|int $website
|
|
* @return array
|
|
*/
|
|
public function getStoreGroups($website)
|
|
{
|
|
if (!$website instanceof \Magento\Store\Model\Website) {
|
|
$website = $this->_storeManager->getWebsite($website);
|
|
}
|
|
return $website->getGroups();
|
|
}
|
|
|
|
/**
|
|
* Check if can switch to store group
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isStoreGroupSwitchEnabled()
|
|
{
|
|
return (bool)$this->getData('switch_store_groups');
|
|
}
|
|
|
|
/**
|
|
* Sets store group variable name.
|
|
*
|
|
* @param string $varName
|
|
* @return $this
|
|
*/
|
|
public function setStoreGroupVarName($varName)
|
|
{
|
|
$this->setData('store_group_var_name', $varName);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Return store group variable name.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getStoreGroupVarName()
|
|
{
|
|
if ($this->hasData('store_group_var_name')) {
|
|
return (string)$this->getData('store_group_var_name');
|
|
} else {
|
|
return (string)$this->_defaultStoreGroupVarName;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Is provided group selected.
|
|
*
|
|
* @param \Magento\Store\Model\Group $group
|
|
* @return bool
|
|
*/
|
|
public function isStoreGroupSelected(\Magento\Store\Model\Group $group)
|
|
{
|
|
return $this->getStoreGroupId() === $group->getId() && $this->getStoreGroupId() === null;
|
|
}
|
|
|
|
/**
|
|
* Return store group Id.
|
|
*
|
|
* @return int|null
|
|
*/
|
|
public function getStoreGroupId()
|
|
{
|
|
if (!$this->hasData('store_group_id')) {
|
|
$this->setData('store_group_id', (int)$this->getRequest()->getParam($this->getStoreGroupVarName()));
|
|
}
|
|
return $this->getData('store_group_id');
|
|
}
|
|
|
|
/**
|
|
* Return store collection.
|
|
*
|
|
* @param \Magento\Store\Model\Group|int $group
|
|
* @return \Magento\Store\Model\ResourceModel\Store\Collection
|
|
*/
|
|
public function getStoreCollection($group)
|
|
{
|
|
if (!$group instanceof \Magento\Store\Model\Group) {
|
|
$group = $this->_storeGroupFactory->create()->load($group);
|
|
}
|
|
$stores = $group->getStoreCollection();
|
|
$_storeIds = $this->getStoreIds();
|
|
if (!empty($_storeIds)) {
|
|
$stores->addIdFilter($_storeIds);
|
|
}
|
|
return $stores;
|
|
}
|
|
|
|
/**
|
|
* Get store views for specified store group
|
|
*
|
|
* @param \Magento\Store\Model\Group|int $group
|
|
* @return \Magento\Store\Model\Store[]
|
|
*/
|
|
public function getStores($group)
|
|
{
|
|
if (!$group instanceof \Magento\Store\Model\Group) {
|
|
$group = $this->_storeManager->getGroup($group);
|
|
}
|
|
$stores = $group->getStores();
|
|
if ($storeIds = $this->getStoreIds()) {
|
|
foreach (array_keys($stores) as $storeId) {
|
|
if (!in_array($storeId, $storeIds)) {
|
|
unset($stores[$storeId]);
|
|
}
|
|
}
|
|
}
|
|
return $stores;
|
|
}
|
|
|
|
/**
|
|
* Return store Id.
|
|
*
|
|
* @return int|null
|
|
*/
|
|
public function getStoreId()
|
|
{
|
|
if (!$this->hasData('store_id')) {
|
|
$this->setData('store_id', (int)$this->getRequest()->getParam($this->getStoreVarName()));
|
|
}
|
|
return $this->getData('store_id');
|
|
}
|
|
|
|
/**
|
|
* Check is provided store selected.
|
|
*
|
|
* @param \Magento\Store\Model\Store $store
|
|
* @return bool
|
|
*/
|
|
public function isStoreSelected(\Magento\Store\Model\Store $store)
|
|
{
|
|
return $this->getStoreId() !== null && (int)$this->getStoreId() === (int)$store->getId();
|
|
}
|
|
|
|
/**
|
|
* Check if can switch to store views
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isStoreSwitchEnabled()
|
|
{
|
|
return (bool)$this->getData('switch_store_views');
|
|
}
|
|
|
|
/**
|
|
* Sets store variable name.
|
|
*
|
|
* @param string $varName
|
|
* @return $this
|
|
*/
|
|
public function setStoreVarName($varName)
|
|
{
|
|
$this->setData('store_var_name', $varName);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Return store variable name.
|
|
*
|
|
* @return mixed|string
|
|
*/
|
|
public function getStoreVarName()
|
|
{
|
|
if ($this->hasData('store_var_name')) {
|
|
return (string)$this->getData('store_var_name');
|
|
} else {
|
|
return (string)$this->_defaultStoreVarName;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return switch url.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getSwitchUrl()
|
|
{
|
|
if ($url = $this->getData('switch_url')) {
|
|
return $url;
|
|
}
|
|
return $this->getUrl(
|
|
'*/*/*',
|
|
[
|
|
'_current' => true,
|
|
$this->getStoreVarName() => null,
|
|
$this->getStoreGroupVarName() => null,
|
|
$this->getWebsiteVarName() => null,
|
|
]
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Checks if scope selected.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function hasScopeSelected()
|
|
{
|
|
return $this->getStoreId() !== null || $this->getStoreGroupId() !== null || $this->getWebsiteId() !== null;
|
|
}
|
|
|
|
/**
|
|
* Get current selection name
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getCurrentSelectionName()
|
|
{
|
|
if ($this->getCurrentStoreName() !== '') {
|
|
return $this->getCurrentStoreName();
|
|
}
|
|
if ($this->getCurrentStoreGroupName() !== '') {
|
|
return $this->getCurrentStoreGroupName();
|
|
}
|
|
|
|
if ($this->getCurrentWebsiteName() !== '') {
|
|
return $this->getCurrentWebsiteName();
|
|
}
|
|
return $this->getDefaultSelectionName();
|
|
}
|
|
|
|
/**
|
|
* Get current website name
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getCurrentWebsiteName()
|
|
{
|
|
$websiteId = $this->getWebsiteId();
|
|
if ($websiteId !== null) {
|
|
if ($this->hasData('get_data_from_request')) {
|
|
$requestedWebsite = $this->getRequest()->getParams('website');
|
|
if (!empty($requestedWebsite)
|
|
&& array_key_exists('website', $requestedWebsite)) {
|
|
$websiteId = $requestedWebsite['website'];
|
|
}
|
|
}
|
|
$website = $this->_websiteFactory->create();
|
|
$website->load($websiteId);
|
|
if ($website->getId()) {
|
|
return $website->getName();
|
|
}
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Get current store group name
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getCurrentStoreGroupName()
|
|
{
|
|
if ($this->getStoreGroupId() !== null) {
|
|
$group = $this->_storeGroupFactory->create();
|
|
$group->load($this->getStoreGroupId());
|
|
if ($group->getId()) {
|
|
return $group->getName();
|
|
}
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Get current store view name
|
|
*
|
|
* @return string
|
|
* @throws LocalizedException
|
|
*/
|
|
public function getCurrentStoreName()
|
|
{
|
|
$storeId = $this->getStoreId();
|
|
if ($storeId !== null) {
|
|
if ($this->hasData('get_data_from_request')) {
|
|
$requestedStore = $this->getRequest()->getParams('store');
|
|
if (!empty($requestedStore)
|
|
&& array_key_exists('store', $requestedStore)) {
|
|
$storeId = $requestedStore['store'];
|
|
}
|
|
}
|
|
$store = $this->_storeFactory->create();
|
|
$store->load($storeId);
|
|
if ($store->getId()) {
|
|
return $store->getName();
|
|
}
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Sets store ids.
|
|
*
|
|
* @param array $storeIds
|
|
* @return $this
|
|
*/
|
|
public function setStoreIds($storeIds)
|
|
{
|
|
$this->_storeIds = $storeIds;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Return store ids.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getStoreIds()
|
|
{
|
|
return $this->_storeIds;
|
|
}
|
|
|
|
/**
|
|
* Check if system is run in the single store mode.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isShow()
|
|
{
|
|
return !$this->_storeManager->isSingleStoreMode();
|
|
}
|
|
|
|
/**
|
|
* Render block.
|
|
*
|
|
* @return string
|
|
*/
|
|
protected function _toHtml()
|
|
{
|
|
if ($this->isShow()) {
|
|
return parent::_toHtml();
|
|
}
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Set/Get whether the switcher should show default option
|
|
*
|
|
* @param bool $hasDefaultOption
|
|
* @return bool
|
|
*/
|
|
public function hasDefaultOption($hasDefaultOption = null)
|
|
{
|
|
if (null !== $hasDefaultOption) {
|
|
$this->_hasDefaultOption = $hasDefaultOption;
|
|
}
|
|
return $this->_hasDefaultOption;
|
|
}
|
|
|
|
/**
|
|
* Return url for store switcher hint
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getHintUrl()
|
|
{
|
|
return self::HINT_URL;
|
|
}
|
|
|
|
/**
|
|
* Return store switcher hint html
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getHintHtml()
|
|
{
|
|
$html = '';
|
|
$url = $this->getHintUrl();
|
|
if ($url) {
|
|
$html = '<div class="admin__field-tooltip tooltip"><a href="%s" onclick="this.target=\'_blank\'" title="%s"
|
|
class="admin__field-tooltip-action action-help"><span>%s</span></a></div>';
|
|
$title = $this->escapeHtmlAttr(__('What is this?'));
|
|
$span = $this->escapeHtml(__('What is this?'));
|
|
$html = sprintf($html, $this->escapeUrl($url), $title, $span);
|
|
}
|
|
return $html;
|
|
}
|
|
|
|
/**
|
|
* Get whether iframe is being used
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function isUsingIframe()
|
|
{
|
|
if ($this->hasData('is_using_iframe')) {
|
|
return (bool)$this->getData('is_using_iframe');
|
|
}
|
|
return false;
|
|
}
|
|
}
|