123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Framework\View\Layout\Reader;
- use Magento\Framework\View\Layout;
- /**
- * Class Container
- */
- class Container implements Layout\ReaderInterface
- {
- /**#@+
- * Supported types
- */
- const TYPE_CONTAINER = 'container';
- const TYPE_REFERENCE_CONTAINER = 'referenceContainer';
- /**#@-*/
- /**#@+
- * Names of container options in layout
- */
- const CONTAINER_OPT_HTML_TAG = 'htmlTag';
- const CONTAINER_OPT_HTML_CLASS = 'htmlClass';
- const CONTAINER_OPT_HTML_ID = 'htmlId';
- const CONTAINER_OPT_LABEL = 'label';
- const CONTAINER_OPT_DISPLAY = 'display';
- /**#@-*/
- /**#@-*/
- protected $helper;
- /**
- * @var \Magento\Framework\View\Layout\ReaderPool
- */
- protected $readerPool;
- /**
- * Constructor
- *
- * @param Layout\ScheduledStructure\Helper $helper
- * @param Layout\ReaderPool $readerPool
- */
- public function __construct(
- Layout\ScheduledStructure\Helper $helper,
- Layout\ReaderPool $readerPool
- ) {
- $this->helper = $helper;
- $this->readerPool = $readerPool;
- }
- /**
- * @return string[]
- */
- public function getSupportedNodes()
- {
- return [self::TYPE_CONTAINER, self::TYPE_REFERENCE_CONTAINER];
- }
- /**
- * {@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;
- }
- /**
- * Merge Container attributes
- *
- * @param \Magento\Framework\View\Layout\ScheduledStructure $scheduledStructure
- * @param \Magento\Framework\View\Layout\Element $currentElement
- * @return void
- */
- protected function mergeContainerAttributes(
- Layout\ScheduledStructure $scheduledStructure,
- Layout\Element $currentElement
- ) {
- $containerName = $currentElement->getAttribute('name');
- $elementData = $scheduledStructure->getStructureElementData($containerName);
- if (isset($elementData['attributes'])) {
- $keys = array_keys($elementData['attributes']);
- foreach ($keys as $key) {
- if (isset($currentElement[$key])) {
- $elementData['attributes'][$key] = (string)$currentElement[$key];
- }
- }
- } else {
- $elementData['attributes'] = [
- self::CONTAINER_OPT_HTML_TAG => (string)$currentElement[self::CONTAINER_OPT_HTML_TAG],
- self::CONTAINER_OPT_HTML_ID => (string)$currentElement[self::CONTAINER_OPT_HTML_ID],
- self::CONTAINER_OPT_HTML_CLASS => (string)$currentElement[self::CONTAINER_OPT_HTML_CLASS],
- self::CONTAINER_OPT_LABEL => (string)$currentElement[self::CONTAINER_OPT_LABEL],
- self::CONTAINER_OPT_DISPLAY => (string)$currentElement[self::CONTAINER_OPT_DISPLAY],
- ];
- }
- $scheduledStructure->setStructureElementData($containerName, $elementData);
- }
- /**
- * Handling reference of container
- *
- * If attribute remove="true" then add the element to list remove,
- * else merge container attributes
- *
- * @param Layout\ScheduledStructure $scheduledStructure
- * @param Layout\Element $currentElement
- * @return void
- */
- protected function containerReference(
- Layout\ScheduledStructure $scheduledStructure,
- Layout\Element $currentElement
- ) {
- $containerName = $currentElement->getAttribute('name');
- $containerRemove = filter_var($currentElement->getAttribute('remove'), FILTER_VALIDATE_BOOLEAN);
- if ($containerRemove) {
- $scheduledStructure->setElementToRemoveList($containerName);
- return;
- } elseif ($currentElement->getAttribute('remove')) {
- $scheduledStructure->unsetElementFromListToRemove($containerName);
- }
- $this->mergeContainerAttributes($scheduledStructure, $currentElement);
- }
- }
|