예제 #1
0
 /**
  * @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);
 }
예제 #2
0
 /**
  * {@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;
 }
예제 #3
0
 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');
 }
예제 #4
0
 /**
  * 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;
 }
예제 #5
0
 /**
  *
  * @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);
 }
예제 #6
0
 /**
  * {@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;
 }
예제 #7
0
 /**
  * {@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;
 }
예제 #8
0
 /**
  * {@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;
 }
예제 #9
0
 /**
  * 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;
 }
예제 #10
0
 /**
  * @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()]);
 }
예제 #11
0
 /**
  * {@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;
 }
예제 #12
0
 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);
 }
예제 #13
0
 /**
  * @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);
 }
예제 #14
0
 /**
  * @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);
 }
예제 #15
0
 /**
  * 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;
 }
예제 #16
0
 /**
  * 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;
 }
예제 #17
0
 /**
  * {@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;
 }
예제 #18
0
 /**
  * {@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;
 }
예제 #19
0
 /**
  * {@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;
 }
예제 #20
0
 /**
  * {@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;
 }