[BUGFIX] Correctly handle non-existing level in menu.directory VH
[Packages/TYPO3.CMS.git] / typo3 / sysext / fluid_styled_content / Classes / ViewHelpers / Menu / DirectoryViewHelper.php
1 <?php
2 namespace TYPO3\CMS\FluidStyledContent\ViewHelpers\Menu;
3
4 /*
5 * This file is part of the TYPO3 CMS project.
6 *
7 * It is free software; you can redistribute it and/or modify it under
8 * the terms of the GNU General Public License, either version 2
9 * of the License, or any later version.
10 *
11 * For the full copyright and license information, please read the
12 * LICENSE.txt file that was distributed with this source code.
13 *
14 * The TYPO3 project - inspiring people to share!
15 */
16
17 use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
18
19 /**
20 * A view helper which returns the subpages of the given pages
21 *
22 * = Example =
23 *
24 * <code title="Directory of pages with uid = 1 and uid = 2">
25 * <ce:menu.directory pageUids="{0: 1, 1: 2}" as="pages">
26 * <f:for each="{pages}" as="page">
27 * {page.title}
28 * </f:for>
29 * </ce:menu.directory>
30 * </code>
31 *
32 * <output>
33 * Subpage 1 of page with uid = 1
34 * Subpage 2 of page with uid = 1
35 * Subpage 1 of page with uid = 2
36 * </output>
37 */
38 class DirectoryViewHelper extends AbstractViewHelper
39 {
40 use MenuViewHelperTrait;
41
42 /**
43 * Initialize ViewHelper arguments
44 *
45 * @return void
46 */
47 public function initializeArguments()
48 {
49 $this->registerArgument('as', 'string', 'Name of template variable which will contain selected pages', true);
50 $this->registerArgument('levelAs', 'string', 'Name of template variable which will contain current level', false, null);
51 $this->registerArgument('pageUids', 'array', 'Page UIDs of parent pages', false, []);
52 $this->registerArgument('entryLevel', 'integer', 'The entry level', false, null);
53 $this->registerArgument('maximumLevel', 'integer', 'Maximum level for rendering of nested menus', false, 10);
54 $this->registerArgument('includeNotInMenu', 'boolean', 'Include pages that are marked "hide in menu"?', false, false);
55 $this->registerArgument('includeMenuSeparator', 'boolean', 'Include pages of the type "Menu separator"?', false, false);
56 }
57
58 /**
59 * Render the view helper
60 *
61 * @return string
62 */
63 public function render()
64 {
65 $typoScriptFrontendController = $this->getTypoScriptFrontendController();
66 $as = $this->arguments['as'];
67 $pageUids = (array)$this->arguments['pageUids'];
68 $entryLevel = $this->arguments['entryLevel'];
69 $levelAs = $this->arguments['levelAs'];
70 $maximumLevel = $this->arguments['maximumLevel'];
71 $includeNotInMenu = (bool)$this->arguments['includeNotInMenu'];
72 $includeMenuSeparator = (bool)$this->arguments['includeMenuSeparator'];
73
74 $pageUids = $this->getPageUids($pageUids, $entryLevel);
75 if (empty($pageUids)) {
76 return '';
77 }
78
79 $pages = $typoScriptFrontendController->sys_page->getMenu(
80 $pageUids,
81 '*',
82 'sorting',
83 $this->getPageConstraints($includeNotInMenu, $includeMenuSeparator)
84 );
85
86 $output = '';
87
88 if (!empty($pages)) {
89 if (!$typoScriptFrontendController->register['ceMenuLevel_directory']) {
90 $typoScriptFrontendController->register['ceMenuLevel_directory'] = 1;
91 $typoScriptFrontendController->register['ceMenuMaximumLevel_directory'] = $maximumLevel;
92 } else {
93 $typoScriptFrontendController->register['ceMenuLevel_directory']++;
94 }
95
96 if ($typoScriptFrontendController->register['ceMenuLevel_directory'] > $typoScriptFrontendController->register['ceMenuMaximumLevel_directory']) {
97 return '';
98 }
99
100 $variables = [
101 $as => $pages
102 ];
103 if (!empty($levelAs)) {
104 $variables[$levelAs] = $typoScriptFrontendController->register['ceMenuLevel_directory'];
105 }
106 $output = $this->renderChildrenWithVariables($variables);
107
108 $typoScriptFrontendController->register['ceMenuLevel_directory']--;
109
110 if ($typoScriptFrontendController->register['ceMenuLevel_directory'] === 0) {
111 unset($typoScriptFrontendController->register['ceMenuLevel_directory']);
112 unset($typoScriptFrontendController->register['ceMenuMaximumLevel_directory']);
113 }
114 }
115
116 return $output;
117 }
118 }