/** * @dataProvider processDataProvider */ public function testProcess($xml) { $this->element = new \Magento\Framework\View\Layout\Element($xml); $this->context->expects($this->any())->method('getScheduledStructure')->will($this->returnValue($this->scheduledStructure)); $this->scheduledStructure->expects($this->once())->method('setElementToRemoveList')->with('header'); $this->model->interpret($this->context, $this->element, $this->element); }
/** * {@inheritdoc} * * @param Layout\Reader\Context $readerContext * @param Layout\Element $headElement * @return $this */ public function interpret(Layout\Reader\Context $readerContext, Layout\Element $headElement) { $pageConfigStructure = $readerContext->getPageConfigStructure(); /** @var \Magento\Framework\View\Layout\Element $node */ foreach ($headElement as $node) { switch ($node->getName()) { case self::HEAD_CSS: case self::HEAD_SCRIPT: case self::HEAD_LINK: $this->addContentTypeByNodeName($node); $pageConfigStructure->addAssets($node->getAttribute('src'), $this->getAttributes($node)); break; case self::HEAD_REMOVE: $pageConfigStructure->removeAssets($node->getAttribute('src')); break; case self::HEAD_TITLE: $pageConfigStructure->setTitle($node); break; case self::HEAD_META: $this->setMetadata($pageConfigStructure, $node); break; case self::HEAD_ATTRIBUTE: $pageConfigStructure->setElementAttribute(PageConfig::ELEMENT_TYPE_HEAD, $node->getAttribute('name'), $node->getAttribute('value')); break; default: break; } } return $this; }
protected function setUp() { $this->objectManagerHelper = new ObjectManagerHelper($this); $this->scheduledStructureMock = $this->getMockBuilder('Magento\\Framework\\View\\Layout\\ScheduledStructure')->disableOriginalConstructor()->getMock(); $this->contextMock = $this->getMockBuilder('Magento\\Framework\\View\\Layout\\Reader\\Context')->disableOriginalConstructor()->getMock(); $this->contextMock->expects($this->any())->method('getScheduledStructure')->willReturn($this->scheduledStructureMock); $this->move = $this->objectManagerHelper->getObject('Magento\\Framework\\View\\Layout\\Reader\\Move'); }
/** * Schedule attributes to the page config structure * * @param Layout\Reader\Context $readerContext * @param Layout\Element $element * @return $this */ protected function setBodyAttributeToStructure(Layout\Reader\Context $readerContext, Layout\Element $element) { if ($element->getAttribute('name') == PageConfig::BODY_ATTRIBUTE_CLASS) { $readerContext->getPageConfigStructure()->setBodyClass($element->getAttribute('value')); } else { $readerContext->getPageConfigStructure()->setElementAttribute(PageConfig::ELEMENT_TYPE_BODY, $element->getAttribute('name'), $element->getAttribute('value')); } return $this; }
/** * * @param \Magento\Framework\View\Layout\Element $element * * @dataProvider interpretDataProvider */ public function testInterpret($element) { $scheduleStructure = $this->getMock('\\Magento\\Framework\\View\\Layout\\ScheduledStructure', [], [], '', false); $this->context->expects($this->any())->method('getScheduledStructure')->will($this->returnValue($scheduleStructure)); $this->helper->expects($this->any())->method('scheduleStructure')->with($scheduleStructure, $element, $element->getParent())->willReturn($element->getAttribute('name')); $scheduleStructure->expects($this->once())->method('setStructureElementData')->with($element->getAttribute('name'), ['attributes' => ['group' => '', 'component' => 'listing']]); $scheduleStructure->expects($this->once())->method('setElementToIfconfigList')->with($element->getAttribute('name'), 'config_path', 'scope'); $this->model->interpret($this->context, $element); }
/** * {@inheritdoc} * * @param Layout\Reader\Context $readerContext * @param Layout\Element $htmlElement * @return $this */ public function interpret(Layout\Reader\Context $readerContext, Layout\Element $htmlElement) { /** @var \Magento\Framework\View\Layout\Element $element */ foreach ($htmlElement as $element) { if ($element->getName() === self::HTML_ATTRIBUTE) { $readerContext->getPageConfigStructure()->setElementAttribute(PageConfig::ELEMENT_TYPE_HTML, $element->getAttribute('name'), $element->getAttribute('value')); } } return $this; }
/** * {@inheritdoc} * * @param Layout\Reader\Context $readerContext * @param Layout\Generator\Context $generatorContext * @return $this */ public function process(Layout\Reader\Context $readerContext, Layout\Generator\Context $generatorContext) { $structure = $readerContext->getPageConfigStructure(); $structure->processRemoveAssets(); $structure->processRemoveElementAttributes(); $this->processAssets($structure); $this->processTitle($structure); $this->processMetadata($structure); $this->processElementAttributes($structure); return $this; }
/** * {@inheritdoc} * * @param Context $readerContext * @param Layout\Element $currentElement * @return $this */ public function interpret(Context $readerContext, Layout\Element $currentElement) { $scheduledStructure = $readerContext->getScheduledStructure(); $referenceName = $this->layoutHelper->scheduleStructure($readerContext->getScheduledStructure(), $currentElement, $currentElement->getParent(), ['attributes' => $this->getAttributes($currentElement)]); $scheduledStructure->setStructureElementData($referenceName, ['attributes' => $this->getAttributes($currentElement)]); $configPath = (string) $currentElement->getAttribute('ifconfig'); if (!empty($configPath)) { $scheduledStructure->setElementToIfconfigList($referenceName, $configPath, $this->scopeType); } return $this; }
/** * Process container elements * * @param \Magento\Framework\View\Layout\Reader\Context $readerContext * @param Context $generatorContext * @return $this */ public function process(Layout\Reader\Context $readerContext, Layout\Generator\Context $generatorContext) { $structure = $generatorContext->getStructure(); $scheduledStructure = $readerContext->getScheduledStructure(); foreach ($scheduledStructure->getElements() as $elementName => $element) { list($type, $data) = $element; if ($type === self::TYPE) { $this->generateContainer($structure, $elementName, $data['attributes']); $scheduledStructure->unsetElement($elementName); } } return $this; }
/** * @return void */ protected function setUp() { // ScheduledStructure $this->readerContextMock = $this->getMockBuilder('Magento\\Framework\\View\\Layout\\Reader\\Context')->disableOriginalConstructor()->getMock(); $this->scheduledStructure = new ScheduledStructure(); $this->readerContextMock->expects($this->any())->method('getScheduledStructure')->willReturn($this->scheduledStructure); // DataStructure $this->generatorContextMock = $this->getMockBuilder('Magento\\Framework\\View\\Layout\\Generator\\Context')->disableOriginalConstructor()->getMock(); $this->structureMock = $this->getMockBuilder('Magento\\Framework\\View\\Layout\\Data\\Structure')->disableOriginalConstructor()->setMethods(['reorderChildElement'])->getMock(); $this->generatorContextMock->expects($this->any())->method('getStructure')->willReturn($this->structureMock); $this->helperMock = $this->getMockBuilder('Magento\\Framework\\View\\Layout\\ScheduledStructure\\Helper')->disableOriginalConstructor()->getMock(); $helperObjectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->model = $helperObjectManager->getObject('Magento\\Framework\\View\\Layout\\GeneratorPool', ['helper' => $this->helperMock, 'generators' => $this->getGeneratorsMocks()]); }
/** * {@inheritdoc} * * @param Context $readerContext * @param Layout\Element $currentElement * @param Layout\Element $parentElement * @return $this */ public function interpret(Context $readerContext, Layout\Element $currentElement) { switch ($currentElement->getName()) { case self::TYPE_CONTAINER: $this->helper->scheduleStructure($readerContext->getScheduledStructure(), $currentElement, $currentElement->getParent()); $this->mergeContainerAttributes($readerContext->getScheduledStructure(), $currentElement); break; case self::TYPE_REFERENCE_CONTAINER: $this->containerReference($readerContext->getScheduledStructure(), $currentElement); break; default: break; } $this->readerPool->interpret($readerContext, $currentElement); return $this; }
public function testProcess() { $this->prepareScheduledStructure(); $this->readerContextMock = $this->getMockBuilder('Magento\\Framework\\View\\Layout\\Reader\\Context')->disableOriginalConstructor()->getMock(); $this->readerContextMock->expects($this->any())->method('getScheduledStructure')->willReturn($this->scheduledStructureMock); $generatorContextMock = $this->getMockBuilder('Magento\\Framework\\View\\Layout\\Generator\\Context')->disableOriginalConstructor()->getMock(); $structureMock = $this->getMockBuilder('Magento\\Framework\\View\\Layout\\Data\\Structure')->disableOriginalConstructor()->getMock(); $structureMock->expects($this->once())->method('addToParentGroup')->with(UiComponent::TYPE, 'new_group')->willReturnSelf(); $layoutMock = $this->getMockBuilder('Magento\\Framework\\View\\LayoutInterface')->getMockForAbstractClass(); $generatorContextMock->expects($this->any())->method('getStructure')->willReturn($structureMock); $generatorContextMock->expects($this->any())->method('getLayout')->willReturn($layoutMock); $this->uiComponentFactoryMock->expects($this->any())->method('setLayout')->with($layoutMock)->willReturnSelf(); $blockMock = $this->getMockBuilder('Magento\\Framework\\View\\Element\\AbstractBlock')->disableOriginalConstructor()->getMock(); $this->uiComponentFactoryMock->expects($this->any())->method('createUiComponent')->with('component_name', UiComponent::TYPE, ['attribute_1' => 'value_1', 'attribute_2' => 'value_2'])->willReturn($blockMock); $this->argumentInterpreterMock->expects($this->any())->method('evaluate')->will($this->returnValueMap([[['key_1' => 'value_1'], 'value_1'], [['key_2' => 'value_2'], 'value_2']])); $layoutMock->expects($this->any())->method('setBlock')->with(UiComponent::TYPE, $blockMock)->willReturnSelf(); $this->uiComponent->process($this->readerContextMock, $generatorContextMock); }
/** * @param string $literal * @param \PHPUnit_Framework_MockObject_Matcher_InvokedCount $getCondition * @param \PHPUnit_Framework_MockObject_Matcher_InvokedCount $setCondition * @dataProvider processReferenceDataProvider */ public function testProcessReference($literal, $getCondition, $setCondition) { $this->context->expects($this->once())->method('getScheduledStructure')->will($this->returnValue($this->scheduledStructure)); $this->scheduledStructure->expects($getCondition)->method('getStructureElementData')->with($literal, [])->willReturn(['actions' => [['someMethod', [], 'action_config_path', 'scope']]]); $this->scheduledStructure->expects($setCondition)->method('setStructureElementData')->with($literal, ['actions' => [['someMethod', [], 'action_config_path', 'scope']], 'arguments' => []]); $this->prepareReaderPool('<' . $literal . ' name="' . $literal . '">' . '<action method="someMethod" ifconfig="action_config_path" />' . '</' . $literal . '>', $literal); /** @var \Magento\Framework\View\Layout\Reader\Block $block */ $block = $this->getBlock(['readerPool' => $this->readerPool, 'scopeType' => 'scope']); $block->interpret($this->context, $this->currentElement); }
/** * @covers Magento\Framework\View\Layout\Reader\Block::interpret() */ public function testProcessReference() { $testName = 'test_value'; $literal = 'referenceBlock'; $this->context->expects($this->once())->method('getScheduledStructure')->will($this->returnValue($this->scheduledStructure)); $this->scheduledStructure->expects($this->once())->method('getStructureElementData')->with($testName, [])->will($this->returnValue([])); $this->scheduledStructure->expects($this->once())->method('setStructureElementData')->with($testName, ['actions' => [], 'arguments' => []]); $this->prepareReaderPool('<' . $literal . ' name="' . $testName . '"/>'); /** @var \Magento\Framework\View\Layout\Reader\Block $block */ $block = $this->getBlock(['readerPool' => $this->readerPool]); $block->interpret($this->context, $this->currentElement); }
/** * Creates UI Component object based on scheduled data and add it to the layout * * @param ReaderContext $readerContext * @param GeneratorContext $generatorContext * @return $this */ public function process(ReaderContext $readerContext, GeneratorContext $generatorContext) { $scheduledStructure = $readerContext->getScheduledStructure(); $scheduledElements = $scheduledStructure->getElements(); if (!$scheduledElements) { return $this; } $structure = $generatorContext->getStructure(); $layout = $generatorContext->getLayout(); // Instantiate blocks and collect all actions data /** @var $blocks \Magento\Framework\View\Element\AbstractBlock[] */ $blocks = []; foreach ($scheduledElements as $elementName => $element) { list(, $data) = $element; $block = $this->generateComponent($structure, $elementName, $data, $layout); $blocks[$elementName] = $block; $layout->setBlock($elementName, $block); $scheduledStructure->unsetElement($elementName); } return $this; }
/** * Creates block object based on data and add it to the layout * * @param Layout\Reader\Context $readerContext * @param Context $generatorContext * @return $this */ public function process(Layout\Reader\Context $readerContext, Layout\Generator\Context $generatorContext) { $scheduledStructure = $readerContext->getScheduledStructure(); $layout = $generatorContext->getLayout(); $structure = $generatorContext->getStructure(); /** @var $blocks \Magento\Framework\View\Element\AbstractBlock[] */ $blocks = []; $blockActions = []; // Instantiate blocks and collect all actions data foreach ($scheduledStructure->getElements() as $elementName => $element) { list($type, $data) = $element; if ($type === self::TYPE) { $block = $this->generateBlock($scheduledStructure, $structure, $elementName); $blocks[$elementName] = $block; $layout->setBlock($elementName, $block); if (!empty($data['actions'])) { $blockActions[$elementName] = $data['actions']; } } } // Set layout instance to all generated block (trigger _prepareLayout method) foreach ($blocks as $elementName => $block) { $block->setLayout($layout); $this->eventManager->dispatch('core_layout_block_create_after', ['block' => $block]); $scheduledStructure->unsetElement($elementName); } // Run all actions after layout initialization foreach ($blockActions as $elementName => $actions) { foreach ($actions as $action) { list($methodName, $actionArguments, $configPath, $scopeType) = $action; if (empty($configPath) || $this->scopeConfig->isSetFlag($configPath, $scopeType, $this->scopeResolver->getScope())) { $this->generateAction($blocks[$elementName], $methodName, $actionArguments); } } } return $this; }
/** * {@inheritdoc} * * @param Layout\Reader\Context $readerContext * @param Layout\Generator\Context $generatorContext * @return $this */ public function process(Layout\Reader\Context $readerContext, Layout\Generator\Context $generatorContext) { $structure = $readerContext->getPageConfigStructure(); $this->processBodyClasses($structure); return $this; }
/** * {@inheritdoc} * * @param Context $readerContext * @param Layout\Element $currentElement * @param Layout\Element $parentElement * @return $this */ public function interpret(Context $readerContext, Layout\Element $currentElement) { $scheduledStructure = $readerContext->getScheduledStructure(); $scheduledStructure->setElementToRemoveList((string) $currentElement->getAttribute('name')); return $this; }
/** * {@inheritdoc} * * @param Context $readerContext * @param Layout\Element $currentElement * @param Layout\Element $parentElement * @return $this */ public function interpret(Context $readerContext, Layout\Element $currentElement) { $scheduledStructure = $readerContext->getScheduledStructure(); switch ($currentElement->getName()) { case self::TYPE_BLOCK: $this->scheduleBlock($scheduledStructure, $currentElement); break; case self::TYPE_REFERENCE_BLOCK: $this->scheduleReference($scheduledStructure, $currentElement); break; default: break; } $this->readerPool->interpret($readerContext, $currentElement); return $this; }
/** * {@inheritdoc} * * @param Context $readerContext * @param Layout\Element $currentElement * @return $this */ public function interpret(Context $readerContext, Layout\Element $currentElement) { $this->scheduleMove($readerContext->getScheduledStructure(), $currentElement); return $this; }