Skip to main content
Tweeted twitter.com/StackMagento/status/1059007505811038210
edited tags
Source Link

The _configScope_configScope is incorrectly saying it's current scope is adminhtml even with the emulation, I wonder if this is causing the problem but I can't work out how to set it

The _configScope is incorrectly saying it's current scope is adminhtml even with the emulation, I wonder if this is causing the problem but I can't work out how to set it

The _configScope is incorrectly saying it's current scope is adminhtml even with the emulation, I wonder if this is causing the problem but I can't work out how to set it

Source Link
jzahedieh
  • 828
  • 9
  • 20

Magento 2 - Retriving frontend layout blocks from adminhtml

Problem

I need to gain access to the children blocks from the parent block alias of customer_account_navigation from the frontend layout to be used in the adminhtml system configuration.

Current Attempt

As the code is being run in the admin area (adminhtml) I assume emulation is required in order to retrieve anything from the frontend, I have used the $appState->emulateAreaCode method which has a call back and the initialised the ObjectManager as frontend.

class AccountLinks implements \Magento\Framework\Option\ArrayInterface { protected $_options = []; /** * @var \Magento\Framework\ObjectManagerInterface */ protected $_objectManager; /** * @var \Magento\Framework\ObjectManager\ConfigLoaderInterface */ protected $_configLoader; public function __construct( \Magento\Framework\ObjectManagerInterface $objectManager, \Magento\Framework\ObjectManager\ConfigLoaderInterface $configLoader ) { $this->_objectManager = $objectManager; $this->_configLoader = $configLoader; } /** * Retrieve my account menu links. * * @return array */ public function toOptionArray() { if (!$this->_options) { /* @var $appState \Magento\Framework\App\State */ $appState = $this->_objectManager->get('Magento\Framework\App\State'); $appState->emulateAreaCode('frontend', [$this, 'emulateDesignCallback']); } return $this->_options; } public function emulateDesignCallback() { $this->_objectManager->configure($this->_configLoader->load('frontend')); /* @var $layout \Magento\Framework\View\Layout */ $layout = $this->_objectManager->create('\Magento\Framework\View\LayoutInterface'); $layout->getUpdate()->addHandle('default'); $layout->getUpdate()->addHandle('customer_account_index'); $layout->getUpdate()->load(); $layout->generateXml(); $layout->generateElements(); $blocks = $layout->getChildBlocks('customer_account_navigation'); return $this; } } 

Debugging

I can see 2 frontend blocks which seems to imply that using addHandle is not working correctly to generate the correct blocks.

I am also unsure if I am loading the layout after setting the handles correctly.

The _configScope is incorrectly saying it's current scope is adminhtml even with the emulation, I wonder if this is causing the problem but I can't work out how to set it

Debugging

Any ideas? Thanks.