From 25d17966451843c0beba052600f4e5a52d663961 Mon Sep 17 00:00:00 2001 From: Maksym Chubin <maksim.chubin@netzlabor.co> Date: Thu, 29 Apr 2021 11:35:34 +0300 Subject: [PATCH] [TASK] NL-3241 Add support TYPO3 v10, add get menu view helper, change TCA, add filtering of menu items by type --- Classes/Domain/Model/Menu.php | 48 ++++++++++++++ Classes/Hooks/ItemsProcFunc.php | 8 +-- Classes/ViewHelpers/GetViewHelper.php | 63 +++++++++++++++++++ ...x_nlmenubuilder_domain_model_menugroup.php | 7 ++- Resources/Private/Partials/MenuItem/Page.html | 2 +- composer.json | 2 +- ext_emconf.php | 2 +- 7 files changed, 123 insertions(+), 9 deletions(-) create mode 100644 Classes/ViewHelpers/GetViewHelper.php diff --git a/Classes/Domain/Model/Menu.php b/Classes/Domain/Model/Menu.php index 7f83e89..323c092 100644 --- a/Classes/Domain/Model/Menu.php +++ b/Classes/Domain/Model/Menu.php @@ -85,6 +85,54 @@ class Menu extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity $this->menuItem = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage(); } + /** + * @return array + */ + public function getMenuItemPages(): array + { + return $this->getMenuItemByType(MenuItem::TYPE_PAGE); + } + + /** + * @return array + */ + public function getMenuItemLinks(): array + { + return $this->getMenuItemByType(MenuItem::TYPE_LINK); + } + + /** + * @return array + */ + public function getMenuItemContents(): array + { + return $this->getMenuItemByType(MenuItem::TYPE_CONTENT); + } + + /** + * @return array + */ + public function getMenuItemSubmenus(): array + { + return $this->getMenuItemByType(MenuItem::TYPE_SUBMENU); + } + + /** + * @param int $type + * @return array + */ + public function getMenuItemByType(int $type): array + { + if ($items = $this->getMenuItem()) { + return array_filter($items->toArray(), function ($item) use ($type) { + /** @var MenuItem $item */ + return $item->getType() === $type; + }); + } + + return []; + } + /** * Returns the menuGroup * diff --git a/Classes/Hooks/ItemsProcFunc.php b/Classes/Hooks/ItemsProcFunc.php index 1ca8bf5..e265887 100644 --- a/Classes/Hooks/ItemsProcFunc.php +++ b/Classes/Hooks/ItemsProcFunc.php @@ -2,10 +2,10 @@ namespace NL\NlMenubuilder\Hooks; +use TYPO3\CMS\Core\Utility\DebugUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Object\ObjectManager; use TYPO3\CMS\Fluid\View\TemplatePaths; -use TYPO3\CMS\Lang\LanguageService; class ItemsProcFunc { @@ -55,7 +55,7 @@ class ItemsProcFunc foreach ($templates as $template) { $template = str_replace('.html', '', $template); $config['items'][] = [ - htmlspecialchars($this->getLanguageService()->sL($this->langPrefix . $template)), + htmlspecialchars($this->getLanguageService()->sL($this->langPrefix . $template)) ?: $template, $template ]; } @@ -64,9 +64,9 @@ class ItemsProcFunc /** * Returns LanguageService * - * @return LanguageService + * @return mixed */ - protected function getLanguageService(): LanguageService + protected function getLanguageService() { return $GLOBALS['LANG']; } diff --git a/Classes/ViewHelpers/GetViewHelper.php b/Classes/ViewHelpers/GetViewHelper.php new file mode 100644 index 0000000..8ad70e6 --- /dev/null +++ b/Classes/ViewHelpers/GetViewHelper.php @@ -0,0 +1,63 @@ +<?php + + +namespace NL\NlMenubuilder\ViewHelpers; + +use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait; +use NL\NlMenubuilder\Domain\Repository\MenuRepository; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Extbase\Object\ObjectManager; +use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface; +use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper; +use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic; + + +class GetViewHelper extends AbstractViewHelper +{ + use CompileWithRenderStatic; + use TemplateVariableViewHelperTrait; + + /** + * @var boolean + */ + protected $escapeChildren = false; + + /** + * @var boolean + */ + protected $escapeOutput = false; + + /** + * @return void + */ + public function initializeArguments(): void + { + $this->registerAsArgument(); + $this->registerArgument('uuid', 'int', 'UUID of the menu', true, 0); + } + + /** + * @param array $arguments + * @param \Closure $renderChildrenClosure + * @param RenderingContextInterface $renderingContext + * @return mixed|string + * @throws \TYPO3\CMS\Extbase\Object\Exception + */ + public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext) + { + /** @var ObjectManager $objectManager */ + $objectManager = GeneralUtility::makeInstance(ObjectManager::class); + + /** @var MenuRepository $menuRepository */ + $menuRepository = $objectManager->get(MenuRepository::class); + + return static::renderChildrenWithVariableOrReturnInputStatic( + $menuRepository->findByUid($arguments['uuid'] ?? 0), + $arguments['as'], + $renderingContext, + $renderChildrenClosure + ); + + + } +} diff --git a/Configuration/TCA/tx_nlmenubuilder_domain_model_menugroup.php b/Configuration/TCA/tx_nlmenubuilder_domain_model_menugroup.php index b940667..016fdad 100644 --- a/Configuration/TCA/tx_nlmenubuilder_domain_model_menugroup.php +++ b/Configuration/TCA/tx_nlmenubuilder_domain_model_menugroup.php @@ -125,7 +125,7 @@ return [ 'config' => [ 'type' => 'input', 'size' => 30, - 'eval' => 'trim' + 'eval' => 'trim,required' ], ], @@ -134,7 +134,10 @@ return [ 'label' => "$ll:tx_nlmenubuilder_domain_model_menugroup.template", 'config' => [ 'type' => 'select', - 'items' => [], + 'renderType' => 'selectSingle', + 'items' => [ + ['-', ''] + ], 'itemsProcFunc' => 'NL\NlMenubuilder\Hooks\ItemsProcFunc->loadMenuGroupTemplates' ], ], diff --git a/Resources/Private/Partials/MenuItem/Page.html b/Resources/Private/Partials/MenuItem/Page.html index b78e6bf..8015bb3 100644 --- a/Resources/Private/Partials/MenuItem/Page.html +++ b/Resources/Private/Partials/MenuItem/Page.html @@ -1,5 +1,5 @@ <html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true"> <div class="menu-builder menu-item-page"> - <f:link.page>{menuItem.page}</f:link.page> + <f:link.page pageUid="{menuItem.page}">{menuItem.title}</f:link.page> </div> diff --git a/composer.json b/composer.json index 3790001..0c3572a 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ ], "require": { "php": "^7.2", - "typo3/cms-core": "^9.5" + "typo3/cms-core": "^9.5 || ^10.4" }, "autoload": { "psr-4": { diff --git a/ext_emconf.php b/ext_emconf.php index 0020851..e732351 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -23,7 +23,7 @@ $EM_CONF[$_EXTKEY] = [ 'version' => '1.0.0', 'constraints' => [ 'depends' => [ - 'typo3' => '9.5.0-9.5.99', + 'typo3' => '9.5.0-10.4.99', ], 'conflicts' => [], 'suggests' => [], -- GitLab