‪TYPO3CMS  ‪main
RenderFormValueViewHelper.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 
29 use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
30 use TYPO3Fluid\Fluid\Core\Variables\ScopedVariableProvider;
31 use TYPO3Fluid\Fluid\Core\Variables\StandardVariableProvider;
32 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
33 use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
34 
40 final class ‪RenderFormValueViewHelper extends AbstractViewHelper
41 {
42  use CompileWithRenderStatic;
43 
47  protected ‪$escapeOutput = false;
48 
49  public function ‪initializeArguments(): void
50  {
51  $this->registerArgument('renderable', RenderableInterface::class, 'A renderable element', true);
52  $this->registerArgument('as', 'string', 'The name within the template', false, 'formValue');
53  }
54 
58  public static function ‪renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext): string
59  {
60  $element = $arguments['renderable'];
61 
62  if (!$element instanceof ‪FormElementInterface || !self::isEnabled($element)) {
63  return '';
64  }
65 
66  $renderingOptions = $element->getRenderingOptions();
67 
68  if ($renderingOptions['_isSection'] ?? false) {
69  $data = [
70  'element' => $element,
71  'isSection' => true,
72  ];
73  } elseif ($renderingOptions['_isCompositeFormElement'] ?? false) {
74  return '';
75  } else {
76  $formRuntime = $renderingContext
77  ->getViewHelperVariableContainer()
78  ->get(RenderRenderableViewHelper::class, 'formRuntime');
79  $value = $formRuntime[$element->getIdentifier()];
80  $data = [
81  'element' => $element,
82  'value' => $value,
83  'processedValue' => ‪self::processElementValue($element, $value, $renderChildrenClosure, $renderingContext),
84  'isMultiValue' => is_iterable($value),
85  ];
86  }
87 
88  $variableProvider = new ScopedVariableProvider($renderingContext->getVariableProvider(), new StandardVariableProvider([$arguments['as'] => $data]));
89  $renderingContext->setVariableProvider($variableProvider);
90  ‪$output = (string)$renderChildrenClosure();
91  $renderingContext->setVariableProvider($variableProvider->getGlobalVariableProvider());
92 
93  return ‪$output;
94  }
95 
102  protected static function ‪processElementValue(
103  FormElementInterface $element,
104  $value,
105  \Closure $renderChildrenClosure,
106  RenderingContextInterface $renderingContext
107  ) {
108  $properties = $element->getProperties();
109  $options = $properties['options'] ?? null;
110  if (is_array($options)) {
112  ['element' => $element, 'property' => 'options'],
113  $renderChildrenClosure,
114  $renderingContext
115  );
116  if (is_array($value)) {
117  return ‪self::mapValuesToOptions($value, $options);
118  }
119  return ‪self::mapValueToOption($value, $options);
120  }
121  if (is_object($value)) {
122  return ‪self::processObject($element, $value);
123  }
124  return $value;
125  }
126 
132  protected static function ‪mapValuesToOptions(array $value, array $options): array
133  {
134  $result = [];
135  foreach ($value as $key) {
136  $result[] = ‪self::mapValueToOption($key, $options);
137  }
138  return $result;
139  }
140 
148  protected static function ‪mapValueToOption($value, array $options)
149  {
150  return $options[$value] ?? $value;
151  }
152 
158  protected static function ‪processObject(FormElementInterface $element, $object): string
159  {
160  if ($element instanceof StringableFormElementInterface) {
161  return $element->valueToString($object);
162  }
163 
164  if ($object instanceof \DateTime) {
165  return $object->format(\DateTimeInterface::W3C);
166  }
167 
168  if ($object instanceof File || $object instanceof FileReference) {
169  if ($object instanceof FileReference) {
170  $object = $object->getOriginalResource();
171  }
172 
173  return $object->getName();
174  }
175 
176  if (method_exists($object, '__toString')) {
177  return (string)$object;
178  }
179 
180  return 'Object [' . get_class($object) . ']';
181  }
182 
183  protected static function ‪isEnabled(‪RenderableInterface $renderable): bool
184  {
185  if (!$renderable->‪isEnabled()) {
186  return false;
187  }
188  while ($renderable = $renderable->‪getParentRenderable()) {
189  if ($renderable instanceof RenderableInterface && !$renderable->‪isEnabled()) {
190  return false;
191  }
192  }
193  return true;
194  }
195 }
‪TYPO3\CMS\Form\Domain\Model\Renderable\RenderableInterface\isEnabled
‪isEnabled()
‪TYPO3\CMS\Form\ViewHelpers\RenderFormValueViewHelper\initializeArguments
‪initializeArguments()
Definition: RenderFormValueViewHelper.php:47
‪TYPO3\CMS\Form\Domain\Model\FormElements\FormElementInterface\getProperties
‪getProperties()
‪TYPO3\CMS\Form\ViewHelpers\RenderFormValueViewHelper\processElementValue
‪static mixed processElementValue(FormElementInterface $element, $value, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
Definition: RenderFormValueViewHelper.php:100
‪TYPO3\CMS\Form\ViewHelpers\RenderFormValueViewHelper
Definition: RenderFormValueViewHelper.php:41
‪TYPO3\CMS\Form\ViewHelpers\RenderFormValueViewHelper\processObject
‪static processObject(FormElementInterface $element, $object)
Definition: RenderFormValueViewHelper.php:156
‪TYPO3\CMS\Form\ViewHelpers\RenderFormValueViewHelper\$escapeOutput
‪bool $escapeOutput
Definition: RenderFormValueViewHelper.php:45
‪TYPO3\CMS\Form\ViewHelpers\TranslateElementPropertyViewHelper\renderStatic
‪static string array renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
Definition: TranslateElementPropertyViewHelper.php:49
‪TYPO3\CMS\Form\ViewHelpers\RenderFormValueViewHelper\renderStatic
‪static renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
Definition: RenderFormValueViewHelper.php:56
‪TYPO3\CMS\Form\ViewHelpers\RenderFormValueViewHelper\mapValueToOption
‪static mixed mapValueToOption($value, array $options)
Definition: RenderFormValueViewHelper.php:146
‪TYPO3\CMS\Form\Domain\Model\Renderable\RenderableInterface
Definition: RenderableInterface.php:32
‪TYPO3\CMS\Form\Domain\Model\FormElements\FormElementInterface
Definition: FormElementInterface.php:40
‪TYPO3\CMS\Form\ViewHelpers\RenderFormValueViewHelper\mapValuesToOptions
‪static mapValuesToOptions(array $value, array $options)
Definition: RenderFormValueViewHelper.php:130
‪TYPO3\CMS\Core\Resource\File
Definition: File.php:26
‪TYPO3\CMS\Form\Domain\Model\FormElements\StringableFormElementInterface
Definition: StringableFormElementInterface.php:30
‪TYPO3\CMS\Form\Domain\Model\Renderable\RenderableInterface\getParentRenderable
‪CompositeRenderableInterface null getParentRenderable()
‪$output
‪$output
Definition: annotationChecker.php:114
‪TYPO3\CMS\Extbase\Domain\Model\FileReference
Definition: FileReference.php:28
‪TYPO3\CMS\Form\ViewHelpers
‪TYPO3\CMS\Form\ViewHelpers\RenderFormValueViewHelper\isEnabled
‪static isEnabled(RenderableInterface $renderable)
Definition: RenderFormValueViewHelper.php:181