[BUGFIX] Module menu clicks with slow connections opens standalone module
[Packages/TYPO3.CMS.git] / typo3 / sysext / fluid / Classes / ViewHelpers / CaseViewHelper.php
1 <?php
2 namespace TYPO3\CMS\Fluid\ViewHelpers;
3
4 /* *
5 * This script is backported from the TYPO3 Flow package "TYPO3.Fluid". *
6 * *
7 * It is free software; you can redistribute it and/or modify it under *
8 * the terms of the GNU Lesser General Public License, either version 3 *
9 * of the License, or (at your option) any later version. *
10 * *
11 * The TYPO3 project - inspiring people to share! *
12 * */
13
14 use TYPO3\CMS\Core\Utility\GeneralUtility;
15 use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
16 use TYPO3\CMS\Fluid\Core\ViewHelper\Exception;
17 use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
18 use TYPO3Fluid\Fluid\ViewHelpers\SwitchViewHelper as OriginalSwitchViewHelper;
19
20 /**
21 * Case view helper that is only usable within the SwitchViewHelper.
22 * @see \TYPO3\CMS\Fluid\ViewHelpers\SwitchViewHelper
23 *
24 * @api
25 */
26 class CaseViewHelper extends AbstractViewHelper
27 {
28 /**
29 * @var bool
30 */
31 protected $escapeOutput = false;
32
33 /**
34 * Initialize ViewHelper arguments
35 */
36 public function initializeArguments()
37 {
38 $this->registerArgument('value', 'mixed', 'The switch value. If it matches, the child will be rendered.', false, null);
39 $this->registerArgument('default', 'bool', 'If this is set, this child will be rendered, if none else matches.', false, false);
40 }
41
42 /***
43 * @return string the contents of this view helper if $value equals the expression of the surrounding switch view helper, or $default is TRUE. otherwise an empty string
44 * @throws Exception
45 *
46 * @api
47 */
48 public function render()
49 {
50 return static::renderStatic(
51 [
52 'value' => $this->arguments['value'],
53 'default' => $this->arguments['default']
54 ],
55 $this->buildRenderChildrenClosure(),
56 $this->renderingContext
57 );
58 }
59
60 /**
61 * @param array $arguments
62 * @param \Closure $renderChildrenClosure
63 * @param RenderingContextInterface $renderingContext
64 *
65 * @return mixed|string
66 * @throws Exception
67 */
68 public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
69 {
70 $value = $arguments['value'];
71 $default = (bool)$arguments['default'];
72 $viewHelperVariableContainer = $renderingContext->getViewHelperVariableContainer();
73 if ($default !== false) {
74 GeneralUtility::logDeprecatedViewHelperAttribute(
75 'default',
76 $renderingContext,
77 'Argument "default" on f:case is deprecated - use f:defaultCase instead'
78 );
79 }
80 if ($value === null && $default === false) {
81 throw new Exception('The case View helper must have either value or default argument', 1382867521);
82 }
83 $expression = $viewHelperVariableContainer->get(OriginalSwitchViewHelper::class, 'switchExpression');
84
85 // non-type-safe comparison by intention
86 if ($default === true || $expression == $value) {
87 $viewHelperVariableContainer->addOrUpdate(OriginalSwitchViewHelper::class, 'break', true);
88 return $renderChildrenClosure();
89 }
90
91 return '';
92 }
93 }