Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
GeneratorPool.php
Go to the documentation of this file.
1 <?php
7 
9 
16 {
20  protected $helper;
21 
25  protected $generators = [];
26 
30  protected $logger;
31 
35  private $conditionFactory;
36 
43  public function __construct(
45  ConditionFactory $conditionFactory,
46  \Psr\Log\LoggerInterface $logger,
47  array $generators = null
48  ) {
49  $this->helper = $helper;
50  $this->conditionFactory = $conditionFactory;
51  $this->logger = $logger;
52  $this->addGenerators($generators);
53  }
54 
62  public function getGenerator($type)
63  {
64  if (!isset($this->generators[$type])) {
65  throw new \InvalidArgumentException("Invalid generator type '{$type}'");
66  }
67  return $this->generators[$type];
68  }
69 
77  public function process(Reader\Context $readerContext, Generator\Context $generatorContext)
78  {
79  $this->buildStructure($readerContext->getScheduledStructure(), $generatorContext->getStructure());
80  foreach ($this->generators as $generator) {
81  $generator->process($readerContext, $generatorContext);
82  }
83  return $this;
84  }
85 
92  protected function addGenerators(array $generators)
93  {
94  foreach ($generators as $generator) {
95  $this->generators[$generator->getType()] = $generator;
96  }
97  }
98 
106  protected function buildStructure(ScheduledStructure $scheduledStructure, Data\Structure $structure)
107  {
108  //Schedule all element into nested structure
109  while (false === $scheduledStructure->isStructureEmpty()) {
110  $this->helper->scheduleElement($scheduledStructure, $structure, key($scheduledStructure->getStructure()));
111  }
112  $scheduledStructure->flushPaths();
113  while (false === $scheduledStructure->isListToSortEmpty()) {
114  $this->reorderElements($scheduledStructure, $structure, key($scheduledStructure->getListToSort()));
115  }
116  foreach ($scheduledStructure->getListToMove() as $elementToMove) {
117  $this->moveElementInStructure($scheduledStructure, $structure, $elementToMove);
118  }
119  foreach ($scheduledStructure->getListToRemove() as $elementToRemove) {
120  $this->removeElement($scheduledStructure, $structure, $elementToRemove);
121  }
122  foreach ($scheduledStructure->getElements() as $name => $data) {
123  list(, $data) = $data;
124  if ($this->visibilityConditionsExistsIn($data)) {
125  $condition = $this->conditionFactory->create($data['attributes']['visibilityConditions']);
126  if (!$condition->isVisible($data['attributes']['visibilityConditions'])) {
127  $this->removeElement($scheduledStructure, $structure, $name);
128  }
129  }
130  }
131  return $this;
132  }
133 
142  protected function reorderElements(
143  ScheduledStructure $scheduledStructure,
144  Data\Structure $structure,
146  ) {
147  $element = $scheduledStructure->getElementToSort($elementName);
149 
151  $siblingElement = $scheduledStructure->getElementToSort(
153  );
154 
155  if (isset($siblingElement[ScheduledStructure::ELEMENT_NAME])
156  && $structure->hasElement($siblingElement[ScheduledStructure::ELEMENT_NAME])
157  ) {
158  $this->reorderElements(
159  $scheduledStructure,
160  $structure,
161  $siblingElement[ScheduledStructure::ELEMENT_NAME]
162  );
163  }
164  }
165 
166  $structure->reorderChildElement(
171  );
172  }
173 
183  protected function removeElement(
184  ScheduledStructure $scheduledStructure,
185  Data\Structure $structure,
186  $elementName,
187  $isChild = false
188  ) {
189  $elementsToRemove = array_keys($structure->getChildren($elementName));
190  $scheduledStructure->unsetElement($elementName);
191  foreach ($elementsToRemove as $element) {
192  $this->removeElement($scheduledStructure, $structure, $element, true);
193  }
194  if (!$isChild) {
195  $structure->unsetElement($elementName);
196  $scheduledStructure->unsetElementFromListToRemove($elementName);
197  }
198  return $this;
199  }
200 
209  protected function moveElementInStructure(
210  ScheduledStructure $scheduledStructure,
211  Data\Structure $structure,
212  $element
213  ) {
214  list($destination, $siblingName, $isAfter, $alias) = $scheduledStructure->getElementToMove($element);
215  $childAlias = $structure->getChildAlias($structure->getParentId($element), $element);
216  if (!$alias && false === $structure->getChildId($destination, $childAlias)) {
217  $alias = $childAlias;
218  }
219  $structure->unsetChild($element, $alias);
220  try {
221  $structure->setAsChild($element, $destination, $alias);
222  $structure->reorderChildElement($destination, $element, $siblingName, $isAfter);
223  } catch (\OutOfBoundsException $e) {
224  $this->logger->warning('Broken reference: ' . $e->getMessage());
225  }
226  $scheduledStructure->unsetElementFromBrokenParentList($element);
227  return $this;
228  }
229 
236  protected function visibilityConditionsExistsIn(array $data)
237  {
238  return isset($data['attributes']) &&
239  array_key_exists('visibilityConditions', $data['attributes']) &&
240  !empty($data['attributes']['visibilityConditions']);
241  }
242 }
removeElement(ScheduledStructure $scheduledStructure, Data\Structure $structure, $elementName, $isChild=false)
moveElementInStructure(ScheduledStructure $scheduledStructure, Data\Structure $structure, $element)
reorderElements(ScheduledStructure $scheduledStructure, Data\Structure $structure, $elementName)
$type
Definition: item.phtml:13
process(Reader\Context $readerContext, Generator\Context $generatorContext)
getElementToSort($elementName, array $default=[])
__construct(ScheduledStructure\Helper $helper, ConditionFactory $conditionFactory, \Psr\Log\LoggerInterface $logger, array $generators=null)
buildStructure(ScheduledStructure $scheduledStructure, Data\Structure $structure)
if(!trim($html)) $alias
Definition: details.phtml:20
$elementName
Definition: gallery.phtml:10
if(!isset($_GET['name'])) $name
Definition: log.php:14
$element
Definition: element.phtml:12