Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Head.php
Go to the documentation of this file.
1 <?php
7 
11 
15 class Head implements Layout\ReaderInterface
16 {
20  const TYPE_HEAD = 'head';
26  const HEAD_CSS = 'css';
27  const HEAD_SCRIPT = 'script';
28  const HEAD_LINK = 'link';
29  const HEAD_REMOVE = 'remove';
30  const HEAD_TITLE = 'title';
31  const HEAD_META = 'meta';
32  const HEAD_ATTRIBUTE = 'attribute';
40  public function getSupportedNodes()
41  {
42  return [self::TYPE_HEAD];
43  }
44 
51  protected function addContentTypeByNodeName(Layout\Element $node)
52  {
53  switch ($node->getName()) {
54  case self::HEAD_CSS:
55  $node->addAttribute('content_type', 'css');
56  break;
57  case self::HEAD_SCRIPT:
58  $node->addAttribute('content_type', 'js');
59  break;
60  }
61  }
62 
70  public function interpret(
71  Layout\Reader\Context $readerContext,
72  Layout\Element $headElement
73  ) {
74  $pageConfigStructure = $readerContext->getPageConfigStructure();
75 
76  $orderedNodes = [];
77 
78  foreach ($headElement as $node) {
79  $nodeOrder = $node->getAttribute('order') ?: 0;
80  $orderedNodes[$nodeOrder][] = $node;
81  }
82 
83  ksort($orderedNodes);
84  foreach ($orderedNodes as $nodes) {
86  foreach ($nodes as $node) {
87  $this->processNode($node, $pageConfigStructure);
88  }
89  }
90  return $this;
91  }
92 
99  protected function getAttributes($element)
100  {
101  $attributes = [];
102  foreach ($element->attributes() as $attrName => $attrValue) {
103  $attributes[$attrName] = (string)$attrValue;
104  }
105  return $attributes;
106  }
107 
115  private function setMetadata($pageConfigStructure, $node)
116  {
117  if (!$node->getAttribute('name') && $node->getAttribute('property')) {
118  $metadataName = $node->getAttribute('property');
119  } else {
120  $metadataName = $node->getAttribute('name');
121  }
122 
123  $pageConfigStructure->setMetadata($metadataName, $node->getAttribute('content'));
124  }
125 
133  private function processNode(Layout\Element $node, Structure $pageConfigStructure)
134  {
135  switch ($node->getName()) {
136  case self::HEAD_CSS:
137  case self::HEAD_SCRIPT:
138  case self::HEAD_LINK:
139  $this->addContentTypeByNodeName($node);
140  $pageConfigStructure->addAssets($node->getAttribute('src'), $this->getAttributes($node));
141  break;
142 
143  case self::HEAD_REMOVE:
144  $pageConfigStructure->removeAssets($node->getAttribute('src'));
145  break;
146 
147  case self::HEAD_TITLE:
148  $pageConfigStructure->setTitle(new \Magento\Framework\Phrase($node));
149  break;
150 
151  case self::HEAD_META:
152  $this->setMetadata($pageConfigStructure, $node);
153  break;
154 
156  $pageConfigStructure->setElementAttribute(
157  PageConfig::ELEMENT_TYPE_HEAD,
158  $node->getAttribute('name'),
159  $node->getAttribute('value')
160  );
161  break;
162 
163  default:
164  break;
165  }
166  }
167 }
interpret(Reader\Context $readerContext, Element $element)
addContentTypeByNodeName(Layout\Element $node)
Definition: Head.php:51
$attributes
Definition: matrix.phtml:13
$element
Definition: element.phtml:12