From d3e24edf30644a892861481dfc722b570f6e070d Mon Sep 17 00:00:00 2001 From: Dmitruk_S Date: Fri, 23 Mar 2018 17:01:13 +0200 Subject: [PATCH 1/2] Fix bug #1821 Added new attribute 'order' for set loading order . Those attribute resolve issue about render files for some order. --- .../Framework/View/Layout/etc/head.xsd | 1 + .../View/Page/Config/Generator/Head.php | 1 + .../View/Page/Config/Reader/Head.php | 73 +++++++++++-------- .../Unit/Page/Config/Generator/HeadTest.php | 22 +++++- .../Test/Unit/Page/Config/Reader/HeadTest.php | 12 ++- .../Unit/Page/Config/_files/template_head.xml | 4 +- 6 files changed, 79 insertions(+), 34 deletions(-) diff --git a/lib/internal/Magento/Framework/View/Layout/etc/head.xsd b/lib/internal/Magento/Framework/View/Layout/etc/head.xsd index d64270a148eec..a913507ae17b3 100644 --- a/lib/internal/Magento/Framework/View/Layout/etc/head.xsd +++ b/lib/internal/Magento/Framework/View/Layout/etc/head.xsd @@ -18,6 +18,7 @@ + diff --git a/lib/internal/Magento/Framework/View/Page/Config/Generator/Head.php b/lib/internal/Magento/Framework/View/Page/Config/Generator/Head.php index 637d773ddde45..3adcac6187f30 100644 --- a/lib/internal/Magento/Framework/View/Page/Config/Generator/Head.php +++ b/lib/internal/Magento/Framework/View/Page/Config/Generator/Head.php @@ -42,6 +42,7 @@ class Head implements Layout\GeneratorInterface */ protected $assetProperties = [ 'ie_condition', + 'order' ]; /** diff --git a/lib/internal/Magento/Framework/View/Page/Config/Reader/Head.php b/lib/internal/Magento/Framework/View/Page/Config/Reader/Head.php index 71a2951b40420..4b7d82b3b750c 100644 --- a/lib/internal/Magento/Framework/View/Page/Config/Reader/Head.php +++ b/lib/internal/Magento/Framework/View/Page/Config/Reader/Head.php @@ -71,38 +71,49 @@ public function interpret( Layout\Element $headElement ) { $pageConfigStructure = $readerContext->getPageConfigStructure(); - /** @var \Magento\Framework\View\Layout\Element $node */ + + $orderedNodes = []; + 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(new \Magento\Framework\Phrase($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; + $nodeOrder = $node->getAttribute('order') ?: 0; + $orderedNodes[$nodeOrder][] = $node; + } + + ksort($orderedNodes); + foreach ($orderedNodes as $nodes ) { + /** @var \Magento\Framework\View\Layout\Element $node */ + foreach ($nodes 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(new \Magento\Framework\Phrase($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; diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Page/Config/Generator/HeadTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Page/Config/Generator/HeadTest.php index a22689ae7cca4..6f96fa4678da0 100644 --- a/lib/internal/Magento/Framework/View/Test/Unit/Page/Config/Generator/HeadTest.php +++ b/lib/internal/Magento/Framework/View/Test/Unit/Page/Config/Generator/HeadTest.php @@ -82,6 +82,20 @@ public function testProcess() 'content_type' => 'css', 'media' => 'all', ], + 'remoteCssOrderedLast' => [ + 'src' => 'file-url-css-last', + 'src_type' => 'url', + 'content_type' => 'css', + 'media' => 'all', + 'order' => 30, + ], + 'remoteCssOrderedFirst' => [ + 'src' => 'file-url-css-first', + 'src_type' => 'url', + 'content_type' => 'css', + 'media' => 'all', + 'order' => 10, + ], 'remoteLink' => [ 'src' => 'file-url-link', 'src_type' => 'url', @@ -106,8 +120,14 @@ public function testProcess() ->with('file-url-css', 'css', ['attributes' => ['media' => 'all']]); $this->pageConfigMock->expects($this->at(1)) ->method('addRemotePageAsset') - ->with('file-url-link', Head::VIRTUAL_CONTENT_TYPE_LINK, ['attributes' => ['media' => 'all']]); + ->with('file-url-css-last','css', ['attributes' => ['media' => 'all' ] , 'order' => 30]); $this->pageConfigMock->expects($this->at(2)) + ->method('addRemotePageAsset') + ->with('file-url-css-first','css', ['attributes' => ['media' => 'all'] , 'order' => 10]); + $this->pageConfigMock->expects($this->at(3)) + ->method('addRemotePageAsset') + ->with('file-url-link', Head::VIRTUAL_CONTENT_TYPE_LINK, ['attributes' => ['media' => 'all']]); + $this->pageConfigMock->expects($this->at(4)) ->method('addRemotePageAsset') ->with('http://magento.dev/customcss/render/css', 'css', ['attributes' => ['media' => 'all']]); $this->pageConfigMock->expects($this->once()) diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Page/Config/Reader/HeadTest.php b/lib/internal/Magento/Framework/View/Test/Unit/Page/Config/Reader/HeadTest.php index d1717a9f05b42..bf88111b7f9ae 100644 --- a/lib/internal/Magento/Framework/View/Test/Unit/Page/Config/Reader/HeadTest.php +++ b/lib/internal/Magento/Framework/View/Test/Unit/Page/Config/Reader/HeadTest.php @@ -59,7 +59,7 @@ public function testInterpret() $structureMock->expects($this->at(4)) ->method('addAssets') - ->with('path/file.css', ['src' => 'path/file.css', 'media' => 'all', 'content_type' => 'css']) + ->with('path/file-3.css', ['src' => 'path/file-3.css', 'media' => 'all', 'content_type' => 'css']) ->willReturnSelf(); $structureMock->expects($this->at(5)) @@ -82,6 +82,16 @@ public function testInterpret() ->with(Config::ELEMENT_TYPE_HEAD, 'head_attribute_name', 'head_attribute_value') ->willReturnSelf(); + $structureMock->expects($this->at(9)) + ->method('addAssets') + ->with('path/file-1.css', ['src' => 'path/file-1.css', 'media' => 'all', 'content_type' => 'css', 'order' => 10]) + ->willReturnSelf(); + + $structureMock->expects($this->at(10)) + ->method('addAssets') + ->with('path/file-2.css', ['src' => 'path/file-2.css', 'media' => 'all', 'content_type' => 'css', 'order' => 30]) + ->willReturnSelf(); + $this->assertEquals($this->model, $this->model->interpret($readerContextMock, $element->children()[0])); } } diff --git a/lib/internal/Magento/Framework/View/Test/Unit/Page/Config/_files/template_head.xml b/lib/internal/Magento/Framework/View/Test/Unit/Page/Config/_files/template_head.xml index f4f378d735648..4efbef82df441 100644 --- a/lib/internal/Magento/Framework/View/Test/Unit/Page/Config/_files/template_head.xml +++ b/lib/internal/Magento/Framework/View/Test/Unit/Page/Config/_files/template_head.xml @@ -11,7 +11,9 @@ - + + +