‪TYPO3CMS  ‪main
AbstractCompositeRenderable.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
18 /*
19  * Inspired by and partially taken from the Neos.Form package (www.neos.io)
20  */
21 
23 
25 
34 {
40  protected ‪$renderables = [];
41 
52  protected function ‪addRenderable(‪RenderableInterface $renderable)
53  {
54  if ($renderable->‪getParentRenderable() !== null) {
55  throw new ‪FormDefinitionConsistencyException(sprintf('The renderable with identifier "%s" is already added to another element (element identifier: "%s").', $renderable->‪getIdentifier(), $renderable->‪getParentRenderable()->‪getIdentifier()), 1325665144);
56  }
57  $renderable->‪setIndex(count($this->renderables));
58  $renderable->‪setParentRenderable($this);
59  $this->renderables[] = $renderable;
60  }
61 
73  protected function ‪moveRenderableBefore(‪RenderableInterface $renderableToMove, ‪RenderableInterface $referenceRenderable)
74  {
75  if ($renderableToMove->‪getParentRenderable() !== $referenceRenderable->‪getParentRenderable() || $renderableToMove->‪getParentRenderable() !== $this) {
76  throw new ‪FormDefinitionConsistencyException('Moved renderables need to be part of the same parent element.', 1326089744);
77  }
78 
79  $reorderedRenderables = [];
80  $i = 0;
81  foreach ($this->renderables as $renderable) {
82  if ($renderable === $renderableToMove) {
83  continue;
84  }
85 
86  if ($renderable === $referenceRenderable) {
87  $reorderedRenderables[] = $renderableToMove;
88  $renderableToMove->‪setIndex($i);
89  $i++;
90  }
91  $reorderedRenderables[] = $renderable;
92  $renderable->setIndex($i);
93  $i++;
94  }
95  $this->renderables = $reorderedRenderables;
96  }
97 
109  protected function ‪moveRenderableAfter(‪RenderableInterface $renderableToMove, ‪RenderableInterface $referenceRenderable)
110  {
111  if ($renderableToMove->‪getParentRenderable() !== $referenceRenderable->‪getParentRenderable() || $renderableToMove->‪getParentRenderable() !== $this) {
112  throw new ‪FormDefinitionConsistencyException('Moved renderables need to be part of the same parent element.', 1477083145);
113  }
114 
115  $reorderedRenderables = [];
116  $i = 0;
117  foreach ($this->renderables as $renderable) {
118  if ($renderable === $renderableToMove) {
119  continue;
120  }
121 
122  $reorderedRenderables[] = $renderable;
123  $renderable->setIndex($i);
124  $i++;
125 
126  if ($renderable === $referenceRenderable) {
127  $reorderedRenderables[] = $renderableToMove;
128  $renderableToMove->‪setIndex($i);
129  $i++;
130  }
131  }
132  $this->renderables = $reorderedRenderables;
133  }
134 
141  public function ‪getRenderablesRecursively(): array
142  {
143  ‪$renderables = [];
144  foreach ($this->renderables as $renderable) {
145  ‪$renderables[] = $renderable;
146  if ($renderable instanceof ‪CompositeRenderableInterface) {
147  ‪$renderables = array_merge(‪$renderables, $renderable->getRenderablesRecursively());
148  }
149  }
150  return ‪$renderables;
151  }
152 
163  protected function ‪removeRenderable(‪RenderableInterface $renderableToRemove)
164  {
165  if ($renderableToRemove->‪getParentRenderable() !== $this) {
166  throw new ‪FormDefinitionConsistencyException('The renderable to be removed must be part of the calling parent renderable.', 1326090127);
167  }
168 
169  $updatedRenderables = [];
170  foreach ($this->renderables as $renderable) {
171  if ($renderable === $renderableToRemove) {
172  continue;
173  }
174 
175  $updatedRenderables[] = $renderable;
176  }
177  $this->renderables = $updatedRenderables;
178 
179  $renderableToRemove->‪onRemoveFromParentRenderable();
180  }
181 
187  public function ‪registerInFormIfPossible()
188  {
189  parent::registerInFormIfPossible();
190  foreach ($this->renderables as $renderable) {
191  $renderable->registerInFormIfPossible();
192  }
193  }
194 
202  public function ‪onRemoveFromParentRenderable()
203  {
204  foreach ($this->renderables as $renderable) {
205  $renderable->onRemoveFromParentRenderable();
206  }
207  parent::onRemoveFromParentRenderable();
208  }
209 }
‪TYPO3\CMS\Form\Domain\Model\Exception\FormDefinitionConsistencyException
Definition: FormDefinitionConsistencyException.php:26
‪TYPO3\CMS\Form\Domain\Model\Renderable\AbstractCompositeRenderable
Definition: AbstractCompositeRenderable.php:34
‪TYPO3\CMS\Form\Domain\Model\Renderable\AbstractCompositeRenderable\moveRenderableAfter
‪moveRenderableAfter(RenderableInterface $renderableToMove, RenderableInterface $referenceRenderable)
Definition: AbstractCompositeRenderable.php:108
‪TYPO3\CMS\Form\Domain\Model\Renderable\RenderableInterface\setParentRenderable
‪setParentRenderable(CompositeRenderableInterface $renderable)
‪TYPO3\CMS\Form\Domain\Model\Renderable\AbstractCompositeRenderable\removeRenderable
‪removeRenderable(RenderableInterface $renderableToRemove)
Definition: AbstractCompositeRenderable.php:162
‪TYPO3\CMS\Form\Domain\Model\Renderable
Definition: AbstractCompositeRenderable.php:22
‪TYPO3\CMS\Form\Domain\Model\Renderable\AbstractCompositeRenderable\moveRenderableBefore
‪moveRenderableBefore(RenderableInterface $renderableToMove, RenderableInterface $referenceRenderable)
Definition: AbstractCompositeRenderable.php:72
‪TYPO3\CMS\Form\Domain\Model\Renderable\AbstractCompositeRenderable\getRenderablesRecursively
‪RenderableInterface[] getRenderablesRecursively()
Definition: AbstractCompositeRenderable.php:140
‪TYPO3\CMS\Form\Domain\Model\Renderable\AbstractCompositeRenderable\registerInFormIfPossible
‪registerInFormIfPossible()
Definition: AbstractCompositeRenderable.php:186
‪TYPO3\CMS\Form\Domain\Model\Renderable\AbstractRenderable
Definition: AbstractRenderable.php:42
‪TYPO3\CMS\Form\Domain\Model\Renderable\AbstractCompositeRenderable\onRemoveFromParentRenderable
‪onRemoveFromParentRenderable()
Definition: AbstractCompositeRenderable.php:201
‪TYPO3\CMS\Form\Domain\Model\Renderable\RenderableInterface
Definition: RenderableInterface.php:32
‪TYPO3\CMS\Form\Domain\Model\Renderable\RenderableInterface\onRemoveFromParentRenderable
‪onRemoveFromParentRenderable()
‪TYPO3\CMS\Form\Domain\Model\Renderable\AbstractCompositeRenderable\$renderables
‪TYPO3 CMS Form Domain Model Renderable RenderableInterface[] $renderables
Definition: AbstractCompositeRenderable.php:39
‪TYPO3\CMS\Form\Domain\Model\Renderable\RenderableInterface\getParentRenderable
‪CompositeRenderableInterface null getParentRenderable()
‪TYPO3\CMS\Form\Domain\Model\Renderable\RootRenderableInterface\getIdentifier
‪getIdentifier()
‪TYPO3\CMS\Form\Domain\Model\Renderable\RenderableInterface\setIndex
‪setIndex(int $index)
‪TYPO3\CMS\Form\Domain\Model\Renderable\CompositeRenderableInterface
Definition: CompositeRenderableInterface.php:32
‪TYPO3\CMS\Form\Domain\Model\Renderable\AbstractCompositeRenderable\addRenderable
‪addRenderable(RenderableInterface $renderable)
Definition: AbstractCompositeRenderable.php:51