[BUGFIX] Make levelAs of DirectoryViewHelper work
[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, array());
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 $pages = $typoScriptFrontendController->sys_page->getMenu(
76 $pageUids,
77 '*',
78 'sorting',
79 $this->getPageConstraints($includeNotInMenu, $includeMenuSeparator)
80 );
81
82 $output = '';
83
84 if (!empty($pages)) {
85 if (!$typoScriptFrontendController->register['ceMenuLevel_directory']) {
86 $typoScriptFrontendController->register['ceMenuLevel_directory'] = 1;
87 $typoScriptFrontendController->register['ceMenuMaximumLevel_directory'] = $maximumLevel;
88 } else {
89 $typoScriptFrontendController->register['ceMenuLevel_directory']++;
90 }
91
92 if ($typoScriptFrontendController->register['ceMenuLevel_directory'] > $typoScriptFrontendController->register['ceMenuMaximumLevel_directory']) {
93 return '';
94 }
95
96 $variables = array(
97 $as => $pages
98 );
99 if (!empty($levelAs)) {
100 $variables[$levelAs] = $typoScriptFrontendController->register['ceMenuLevel_directory'];
101 }
102 $output = $this->renderChildrenWithVariables($variables);
103
104 $typoScriptFrontendController->register['ceMenuLevel_directory']--;
105
106 if ($typoScriptFrontendController->register['ceMenuLevel_directory'] === 0) {
107 unset($typoScriptFrontendController->register['ceMenuLevel_directory']);
108 unset($typoScriptFrontendController->register['ceMenuMaximumLevel_directory']);
109 }
110 }
111
112 return $output;
113 }
114 }