123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Framework\View\Layout;
- /**
- * Layout structure model
- *
- * @api
- * @since 100.0.2
- */
- class ScheduledStructure
- {
- /**#@+
- * Keys for array of elements to sort
- */
- const ELEMENT_NAME = 'elementName';
- const ELEMENT_PARENT_NAME = 'parentName';
- const ELEMENT_OFFSET_OR_SIBLING = 'offsetOrSibling';
- const ELEMENT_IS_AFTER = 'isAfter';
- /**#@-*/
- /**#@-*/
- private $serializableProperties = [
- 'scheduledStructure',
- 'scheduledData',
- 'scheduledElements',
- 'scheduledMoves',
- 'scheduledRemoves',
- 'scheduledPaths',
- 'elementsToSort',
- 'brokenParent',
- ];
- /**
- * Information about structural elements, scheduled for creation
- *
- * @var array
- */
- protected $scheduledStructure = [];
- /**
- * Scheduled structure data
- *
- * @var array
- */
- protected $scheduledData = [];
- /**
- * Full information about elements to be populated in the layout structure after generating structure
- *
- * @var array
- */
- protected $scheduledElements = [];
- /**
- * Scheduled structure elements moves
- *
- * @var array
- */
- protected $scheduledMoves = [];
- /**
- * Scheduled structure elements removes
- *
- * @var array
- */
- protected $scheduledRemoves = [];
- /**
- * Materialized paths for overlapping workaround of scheduled structural elements
- *
- * @var array
- */
- protected $scheduledPaths = [];
- /**
- * Elements with reference to non-existing parent element
- *
- * @var array
- */
- protected $brokenParent = [];
- /**
- * Elements that need to sort
- *
- * @var array
- */
- protected $elementsToSort = [];
- /**
- * @param array $data
- */
- public function __construct(array $data = [])
- {
- $this->populateWithArray($data);
- }
- /**
- * Set elements to sort
- *
- * @param string $parentName
- * @param string $elementName
- * @param string|int|null $offsetOrSibling
- * @param bool $isAfter
- * @return void
- */
- public function setElementToSortList($parentName, $elementName, $offsetOrSibling, $isAfter = true)
- {
- $this->elementsToSort[$elementName] = [
- self::ELEMENT_NAME => $elementName,
- self::ELEMENT_PARENT_NAME => $parentName,
- self::ELEMENT_OFFSET_OR_SIBLING => $offsetOrSibling,
- self::ELEMENT_IS_AFTER => $isAfter
- ];
- }
- /**
- * Check if elements list of sorting is empty
- *
- * @return bool
- */
- public function isListToSortEmpty()
- {
- return empty($this->elementsToSort);
- }
- /**
- * Unset specified element from list of sorting
- *
- * @param string $elementName
- * @return void
- */
- public function unsetElementToSort($elementName)
- {
- unset($this->elementsToSort[$elementName]);
- }
- /**
- * Get element to sort by name
- *
- * @param string $elementName
- * @param array $default
- * @return array
- */
- public function getElementToSort($elementName, array $default = [])
- {
- return $this->elementsToSort[$elementName] ?? $default;
- }
- /**
- * Get elements to sort
- *
- * @return array
- */
- public function getListToSort()
- {
- return $this->elementsToSort;
- }
- /**
- * Get elements to move
- *
- * @return array
- */
- public function getListToMove()
- {
- return array_keys(array_intersect_key($this->scheduledElements, $this->scheduledMoves));
- }
- /**
- * Get elements to remove
- *
- * @return array
- */
- public function getListToRemove()
- {
- return array_keys(array_intersect_key(
- $this->scheduledElements,
- array_merge($this->scheduledRemoves, $this->brokenParent)
- ));
- }
- /**
- * Get scheduled elements list
- *
- * @return array
- */
- public function getElements()
- {
- return $this->scheduledElements;
- }
- /**
- * Get element by name
- *
- * @param string $elementName
- * @param array $default
- * @return bool|array
- */
- public function getElement($elementName, $default = [])
- {
- return $this->hasElement($elementName) ? $this->scheduledElements[$elementName] : $default;
- }
- /**
- * Check if scheduled elements list is empty
- *
- * @return bool
- */
- public function isElementsEmpty()
- {
- return empty($this->scheduledElements);
- }
- /**
- * Add element to scheduled elements list
- *
- * @param string $elementName
- * @param array $data
- * @return void
- */
- public function setElement($elementName, array $data)
- {
- $this->scheduledElements[$elementName] = $data;
- }
- /**
- * Check if element present in scheduled elements list
- *
- * @param string $elementName
- * @return bool
- */
- public function hasElement($elementName)
- {
- return isset($this->scheduledElements[$elementName]);
- }
- /**
- * Unset specified element from scheduled elements list
- *
- * @param string $elementName
- * @return void
- */
- public function unsetElement($elementName)
- {
- unset($this->scheduledElements[$elementName]);
- }
- /**
- * Get element to move by name
- *
- * @param string $elementName
- * @param mixed $default
- * @return mixed
- */
- public function getElementToMove($elementName, $default = null)
- {
- return $this->scheduledMoves[$elementName] ?? $default;
- }
- /**
- * Add element to move list
- *
- * @param string $elementName
- * @param array $data
- * @return void
- */
- public function setElementToMove($elementName, array $data)
- {
- $this->scheduledMoves[$elementName] = $data;
- }
- /**
- * Unset removed element by name
- *
- * @param string $elementName
- * @return void
- */
- public function unsetElementFromListToRemove($elementName)
- {
- unset($this->scheduledRemoves[$elementName]);
- }
- /**
- * Set removed element value
- *
- * @param string $elementName
- * @return void
- */
- public function setElementToRemoveList($elementName)
- {
- $this->scheduledRemoves[$elementName] = 1;
- }
- /**
- * Get scheduled structure
- *
- * @return array
- */
- public function getStructure()
- {
- return $this->scheduledStructure;
- }
- /**
- * Get element of scheduled structure
- *
- * @param string $elementName
- * @param mixed|null $default
- * @return mixed
- */
- public function getStructureElement($elementName, $default = null)
- {
- return $this->hasStructureElement($elementName) ? $this->scheduledStructure[$elementName] : $default;
- }
- /**
- * Check if scheduled structure is empty
- *
- * @return bool
- */
- public function isStructureEmpty()
- {
- return empty($this->scheduledStructure);
- }
- /**
- * Check if element present in scheduled structure elements list
- *
- * @param string $elementName
- * @return bool
- */
- public function hasStructureElement($elementName)
- {
- return isset($this->scheduledStructure[$elementName]);
- }
- /**
- * Add element to scheduled structure elements list
- *
- * @param string $elementName
- * @param array $data
- * @return void
- */
- public function setStructureElement($elementName, array $data)
- {
- $this->scheduledStructure[$elementName] = $data;
- }
- /**
- * Unset scheduled structure element by name
- *
- * @param string $elementName
- * @return void
- */
- public function unsetStructureElement($elementName)
- {
- unset($this->scheduledStructure[$elementName]);
- unset($this->scheduledData[$elementName]);
- }
- /**
- * Get scheduled data for element
- *
- * @param string $elementName
- * @param null $default
- * @return null
- */
- public function getStructureElementData($elementName, $default = null)
- {
- return $this->scheduledData[$elementName] ?? $default;
- }
- /**
- * Set scheduled data for element
- *
- * @param string $elementName
- * @param array $data
- * @return void
- */
- public function setStructureElementData($elementName, array $data)
- {
- $this->scheduledData[$elementName] = $data;
- }
- /**
- * Get scheduled paths
- *
- * @return array
- */
- public function getPaths()
- {
- return $this->scheduledPaths;
- }
- /**
- * Get path from paths list
- *
- * @param string $elementName
- * @param mixed $default
- * @return mixed
- */
- public function getPath($elementName, $default = null)
- {
- return $this->hasPath($elementName) ? $this->scheduledPaths[$elementName] : $default;
- }
- /**
- * Check if element present in scheduled paths list
- *
- * @param string $elementName
- * @return bool
- */
- public function hasPath($elementName)
- {
- return isset($this->scheduledPaths[$elementName]);
- }
- /**
- * Add element to scheduled paths elements list
- *
- * @param string $elementName
- * @param string $data
- * @return void
- */
- public function setPathElement($elementName, $data)
- {
- $this->scheduledPaths[$elementName] = $data;
- }
- /**
- * Unset scheduled paths element by name
- *
- * @param string $elementName
- * @return void
- */
- public function unsetPathElement($elementName)
- {
- unset($this->scheduledPaths[$elementName]);
- }
- /**
- * Remove element from broken parent list
- *
- * @param string $elementName
- * @return void
- */
- public function unsetElementFromBrokenParentList($elementName)
- {
- unset($this->brokenParent[$elementName]);
- }
- /**
- * Set element to broken parent list
- *
- * @param string $elementName
- * @return void
- */
- public function setElementToBrokenParentList($elementName)
- {
- $this->brokenParent[$elementName] = 1;
- }
- /**
- * Flush scheduled paths list
- *
- * @return void
- */
- public function flushPaths()
- {
- $this->scheduledPaths = [];
- }
- /**
- * Flush scheduled structure list
- *
- * @return void
- */
- public function flushScheduledStructure()
- {
- $this->flushPaths();
- $this->scheduledElements = [];
- $this->scheduledStructure = [];
- }
- /**
- * Reformat 'Layout scheduled structure' to array.
- *
- * @return array
- * @since 101.0.0
- */
- public function __toArray()
- {
- $result = [];
- foreach ($this->serializableProperties as $property) {
- $result[$property] = $this->{$property};
- }
- return $result;
- }
- /**
- * Update 'Layout scheduled structure' data.
- *
- * @param array $data
- * @return void
- * @since 101.0.0
- */
- public function populateWithArray(array $data)
- {
- foreach ($this->serializableProperties as $property) {
- $this->{$property} = $this->getArrayValueByKey($property, $data);
- }
- }
- /**
- * Get value from array by key.
- *
- * @param string $key
- * @param array $array
- * @return array
- */
- private function getArrayValueByKey($key, array $array)
- {
- return $array[$key] ?? [];
- }
- }
|