diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/Layout/Reader/BlockTest.php b/dev/tests/integration/testsuite/Magento/Framework/View/Layout/Reader/BlockTest.php new file mode 100644 index 0000000000000000000000000000000000000000..f6cd7b1b6afd985cc84f6fcffc727182d85bee9c --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/View/Layout/Reader/BlockTest.php @@ -0,0 +1,91 @@ +<?php + +namespace Magento\Framework\View\Layout\Reader; + +class BlockTest extends \PHPUnit_Framework_TestCase +{ + const IDX_TYPE = 0; + const IDX_PARENT = 2; + + /** + * @var Block + */ + private $block; + + /** + * @var Context + */ + private $readerContext; + + private $blockName = 'test.block'; + private $childBlockName = 'test.child.block'; + + public function setUp() + { + $this->block = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( + 'Magento\Framework\View\Layout\Reader\Block' + ); + + $this->readerContext = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create( + 'Magento\Framework\View\Layout\Reader\Context' + ); + } + + public function testInterpretBlockDirective() + { + $pageXml = new \Magento\Framework\View\Layout\Element(__DIR__ . '/_files/_layout_update_block.xml', 0, true); + $parentElement = new \Magento\Framework\View\Layout\Element('<page></page>'); + + foreach ($pageXml->xpath('body/block') as $blockElement) { + $this->assertTrue(in_array($blockElement->getName(), $this->block->getSupportedNodes())); + + $this->block->interpret($this->readerContext, $blockElement, $parentElement); + } + + $structure = $this->readerContext->getScheduledStructure(); + $this->assertArrayHasKey($this->blockName, $structure->getStructure()); + $this->assertEquals('block', $structure->getStructure()[$this->blockName][self::IDX_TYPE]); + + $resultElementData = $structure->getStructureElementData($this->blockName); + + $this->assertEquals( + ['group' => 'test.group', 'class' => 'Dummy\Class', 'template' => 'test.phtml', 'ttl' => 3], + $resultElementData['attributes'] + ); + $this->assertEquals( + ['test_arg' => ['name' => 'test_arg', 'xsi:type' => 'string', 'value' => 'test-argument-value']], + $resultElementData['arguments'] + ); + + $this->assertEquals('block', $structure->getStructure()[$this->childBlockName][self::IDX_TYPE]); + $this->assertEquals($this->blockName, $structure->getStructure()[$this->childBlockName][self::IDX_PARENT]); + } + + /** + * @depends testInterpretBlockDirective + */ + public function testInterpretReferenceBlockDirective() + { + $pageXml = new \Magento\Framework\View\Layout\Element( + __DIR__ . '/_files/_layout_update_reference.xml', 0, true + ); + $parentElement = new \Magento\Framework\View\Layout\Element('<page></page>'); + + foreach ($pageXml->xpath('body/*') as $element) { + $this->assertTrue(in_array($element->getName(), $this->block->getSupportedNodes())); + + $this->block->interpret($this->readerContext, $element, $parentElement); + } + + $structure = $this->readerContext->getScheduledStructure(); + $this->assertArrayHasKey($this->blockName, $structure->getStructure()); + $this->assertEquals('block', $structure->getStructure()[$this->blockName][self::IDX_TYPE]); + + $resultElementData = $structure->getStructureElementData($this->blockName); + + $this->assertEquals( + ['test_arg' => ['name' => 'test_arg', 'xsi:type' => 'string', 'value' => 'test-argument-value']], + $resultElementData['arguments'] + ); + } +} diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/Layout/Reader/_files/_layout_update_block.xml b/dev/tests/integration/testsuite/Magento/Framework/View/Layout/Reader/_files/_layout_update_block.xml new file mode 100644 index 0000000000000000000000000000000000000000..0a3c9c962ca552fadab0b3c94d58062fd6894b7a --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/View/Layout/Reader/_files/_layout_update_block.xml @@ -0,0 +1,16 @@ +<?xml version="1.0"?> +<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="../../../../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> + <body> + <block class="Dummy\Class" + name="test.block" + group="test.group" + template="test.phtml" + ttl="3"> + <arguments> + <argument name="test_arg" xsi:type="string">test-argument-value</argument> + </arguments> + <block class="Dummy\Class" name="test.child.block"/> + </block> + </body> +</page> diff --git a/dev/tests/integration/testsuite/Magento/Framework/View/Layout/Reader/_files/_layout_update_reference.xml b/dev/tests/integration/testsuite/Magento/Framework/View/Layout/Reader/_files/_layout_update_reference.xml new file mode 100644 index 0000000000000000000000000000000000000000..36a01a41bffb5046a5f82acab5c279db90a48abc --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Framework/View/Layout/Reader/_files/_layout_update_reference.xml @@ -0,0 +1,12 @@ +<?xml version="1.0"?> +<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="../../../../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd"> + <body> + <block class="Dummy\Class" name="test.block"/> + <referenceBlock name="test.block"> + <arguments> + <argument name="test_arg" xsi:type="string">test-argument-value</argument> + </arguments> + </referenceBlock> + </body> +</page> diff --git a/lib/internal/Magento/Framework/View/Layout/Reader/Block.php b/lib/internal/Magento/Framework/View/Layout/Reader/Block.php index ecc0b9c45405785294cdd89e1135307617391613..40bea712b9d27748e919b487d92389515b281c54 100644 --- a/lib/internal/Magento/Framework/View/Layout/Reader/Block.php +++ b/lib/internal/Magento/Framework/View/Layout/Reader/Block.php @@ -121,7 +121,8 @@ class Block implements Layout\ReaderInterface default: break; } - return $this->readerPool->interpret($readerContext, $currentElement); + $this->readerPool->interpret($readerContext, $currentElement); + return $this; } /** @@ -174,7 +175,7 @@ class Block implements Layout\ReaderInterface * Update data for scheduled element * * @param Layout\Element $currentElement - * @param array $data + * @param array &$data * @return array */ protected function updateScheduledData($currentElement, array &$data)