diff --git a/composer.json b/composer.json index 05354f9..64d742f 100644 --- a/composer.json +++ b/composer.json @@ -18,10 +18,10 @@ } ], "require":{ - "php":">=7.4", + "php":"^7.4 || ^8.0", "ext-json": "*", "ext-dom": "*", - "contao/core-bundle":"^4.13" + "contao/core-bundle":"^4.13 || ^5.1" }, "require-dev": { "contao/manager-plugin": "^2.0" diff --git a/docs/TEMPLATE_VARIABLES.md b/docs/TEMPLATE_VARIABLES.md index 56cddc4..f9bbd1e 100644 --- a/docs/TEMPLATE_VARIABLES.md +++ b/docs/TEMPLATE_VARIABLES.md @@ -8,6 +8,29 @@ --- +### As Twig is not yet fully supported (Contao ^5.1), this feature will only work with Legacy-Templates) +https://docs.contao.org/dev/framework/templates/legacy/ + +> To use legacy-templates (html5) in contao ^5.1, you can force this by overwriting config.php in "/contao/config/config.php". +```php +twig = $twig; $this->requestStack = $requestStack; $this->translator = $translator; + $this->tokenManager = $tokenManager; } public function __invoke(): Response @@ -85,7 +85,7 @@ public function __invoke(): Response $configs = $this->createImportTree(...$configs); } - return new Response($this->twig->render('@ContaoComponentStyleManager/import.html.twig', [ + return $this->render('@ContaoComponentStyleManager/import.html.twig', [ 'headline' => $partial ? $this->translator->trans('tl_style_manager_import.importPartial', [], 'contao_default') : 'Import', 'messages' => Message::generate(), 'useBundleConfig' => System::getContainer()->getParameter('contao_component_style_manager.use_bundle_config'), @@ -94,12 +94,12 @@ public function __invoke(): Response 'configs' => $configs, 'form' => [ 'id' => 'style_manager_import', - 'rt' => System::getContainer()->get('contao.csrf.token_manager')->getDefaultTokenValue(), + 'rt' => $this->tokenManager->getDefaultTokenValue(), 'maxFileSize' => Config::get('maxFileSize'), 'uploadWidget' => $objUploader->generateMarkup() ], 'action' => [ - 'back' => str_replace('/' . self::ROUTE, '', TL_SCRIPT) . '?do=style_manager', + 'back' => str_replace('/' . self::ROUTE, '', $this->generateUrl('contao_backend')) . '?do=style_manager', ], 'label' => [ 'back' => $this->translator->trans('MSC.backBT', [], 'contao_default'), @@ -114,7 +114,7 @@ public function __invoke(): Response 'bundleConfigEmpty' => $this->translator->trans('tl_style_manager_import.bundleConfigEmpty', [], 'contao_default'), 'bundleConfigInactive' => $this->translator->trans('tl_style_manager_import.bundleConfigInactive', [], 'contao_default'), ] - ])); + ]); } /** diff --git a/src/EventListener/DataContainer/StyleManagerArchiveListener.php b/src/EventListener/DataContainer/StyleManagerArchiveListener.php index b800eb8..ed6ed74 100644 --- a/src/EventListener/DataContainer/StyleManagerArchiveListener.php +++ b/src/EventListener/DataContainer/StyleManagerArchiveListener.php @@ -10,9 +10,19 @@ use Oveleon\ContaoComponentStyleManager\Controller\BackendModule\ImportController; use Oveleon\ContaoComponentStyleManager\Model\StyleManagerArchiveModel; use Oveleon\ContaoComponentStyleManager\StyleManager\Config; +use Symfony\Component\Routing\RouterInterface; class StyleManagerArchiveListener { + + private RouterInterface $router; + + + public function __construct(RouterInterface $router) + { + $this->router = $router; + } + /** * @Callback(table="tl_style_manager_archive", target="config.onload") */ @@ -54,7 +64,7 @@ public function importConfigButton(?string $href, string $label, string $title, } return vsprintf('%s ', [ - TL_SCRIPT. '/' . ImportController::ROUTE, + $this->router->generate(ImportController::class), $class, StringUtil::specialchars($title), $attributes, @@ -77,7 +87,7 @@ public function bundleConfigButton(?string $href, string $label, string $title, } return vsprintf('%s: %s', [ - TL_SCRIPT. '/' . ImportController::ROUTE, + $this->router->generate(ImportController::class), $class, $attributes, $label, diff --git a/src/Resources/contao/dca/tl_style_manager.php b/src/Resources/contao/dca/tl_style_manager.php index 8c9219a..7315e18 100644 --- a/src/Resources/contao/dca/tl_style_manager.php +++ b/src/Resources/contao/dca/tl_style_manager.php @@ -5,11 +5,13 @@ * (c) https://www.oveleon.de/ */ +use Contao\DC_Table; + $GLOBALS['TL_DCA']['tl_style_manager'] = [ // Config 'config' => [ - 'dataContainer' => 'Table', + 'dataContainer' => DC_Table::class, 'ptable' => 'tl_style_manager_archive', 'switchToEdit' => true, 'enableVersioning' => true, diff --git a/src/Resources/contao/dca/tl_style_manager_archive.php b/src/Resources/contao/dca/tl_style_manager_archive.php index 92d2e40..904a0c1 100644 --- a/src/Resources/contao/dca/tl_style_manager_archive.php +++ b/src/Resources/contao/dca/tl_style_manager_archive.php @@ -5,10 +5,12 @@ * (c) https://www.oveleon.de/ */ +use Contao\DC_Table; + $GLOBALS['TL_DCA']['tl_style_manager_archive'] = [ // Config 'config' => [ - 'dataContainer' => 'Table', + 'dataContainer' => DC_Table::class, 'ctable' => ['tl_style_manager'], 'switchToEdit' => true, 'enableVersioning' => true, diff --git a/src/Resources/public/icons/about.svg b/src/Resources/public/icons/about.svg new file mode 100644 index 0000000..4aa6a8a --- /dev/null +++ b/src/Resources/public/icons/about.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/Resources/views/import.html.twig b/src/Resources/views/import.html.twig index eb4e146..6a6229c 100644 --- a/src/Resources/views/import.html.twig +++ b/src/Resources/views/import.html.twig @@ -1,12 +1,6 @@ -{% extends "@ContaoCore/Backend/be_page.html.twig" %} +{% extends "@Contao/be_main" %} -{% block headline %} - {{ headline }} -{% endblock %} - -{% block error %}{% endblock %} - -{% block main %} +{% block main_content %} {% if messages %} {{ messages|raw }} {% endif %} @@ -88,7 +82,7 @@

{{ label.bundleUpload }} - +

{% if useBundleConfig %} diff --git a/src/Widget/ComponentStyleSelect.php b/src/Widget/ComponentStyleSelect.php index ca56c17..13cabf4 100644 --- a/src/Widget/ComponentStyleSelect.php +++ b/src/Widget/ComponentStyleSelect.php @@ -8,6 +8,8 @@ namespace Oveleon\ContaoComponentStyleManager\Widget; use Contao\BackendUser; +use Contao\CoreBundle\Csrf\ContaoCsrfTokenManager; +use Contao\CoreBundle\InsertTag\InsertTagParser; use Contao\Database; use Contao\Input; use Contao\StringUtil; @@ -16,6 +18,7 @@ use Oveleon\ContaoComponentStyleManager\Model\StyleManagerArchiveModel; use Oveleon\ContaoComponentStyleManager\Model\StyleManagerModel; use Oveleon\ContaoComponentStyleManager\StyleManager\StyleManager; +use Symfony\Component\HttpFoundation\RequestStack; /** * Provide methods to handle select menus for style manager. @@ -27,33 +30,56 @@ * @property boolean $chosen * * @author Daniele Sciannimanica + * @author Daniel Jahnsmüller */ class ComponentStyleSelect extends Widget { - /** - * Submit user input - * @var boolean - */ - protected $blnSubmitInput = true; - - /** - * Template - * @var string - */ - protected $strTemplate = 'be_widget'; - - /** - * Generate the widget and return it as string - * - * @return string - */ - public function generate() - { + /** + * Submit user input + * @var boolean + */ + protected $blnSubmitInput = true; + + /** + * Template + * @var string + */ + protected $strTemplate = 'be_widget'; + + private ContaoCsrfTokenManager $tokenManager; + + private InsertTagParser $insertTagParser; + + private RequestStack $requestStack; + + private bool $showGroupTitle; + + + public function __construct($arrAttributes = null) + { + parent::__construct($arrAttributes); + + $container = System::getContainer(); + + $this->tokenManager = $container->get('contao.csrf.token_manager'); + $this->insertTagParser = $container->get('contao.insert_tag.parser'); + $this->requestStack = $container->get('request_stack'); + + $this->showGroupTitle = (bool) $container->getParameter('contao_component_style_manager.show_group_title'); + } + + /** + * Generate the widget and return it as string + * + * @return string + */ + public function generate() + { $arrObjStyleArchives = StyleManagerArchiveModel::findAllWithConfiguration(array('order'=>'sorting')); - $arrObjStyleGroups = StyleManagerModel::findByTableAndConfiguration($this->strTable, array('order'=>'pid,sorting')); + $arrObjStyleGroups = StyleManagerModel::findByTableAndConfiguration($this->strTable, array('order'=>'pid,sorting')); - if($arrObjStyleGroups === null || $arrObjStyleArchives === null) + if($arrObjStyleGroups === null || $arrObjStyleArchives === null) { return $this->renderEmptyMessage(); } @@ -64,7 +90,7 @@ public function generate() $arrOrder = array(); // Prepare archives - foreach($arrObjStyleArchives as $objStyleArchive) + foreach($arrObjStyleArchives as $objStyleArchive) { $arrArchives[ $objStyleArchive->id ] = array( 'title' => $objStyleArchive->title, @@ -80,9 +106,6 @@ public function generate() // Restore default values $this->varValue = StyleManager::deserializeValues($this->varValue); - // Show group title - $blnShowGroupTitle = System::getContainer()->getParameter('contao_component_style_manager.show_group_title'); - // Prepare group fields foreach($arrObjStyleGroups as $objStyleGroup) { @@ -227,12 +250,12 @@ public function generate() $isEmpty = false; } - if($isEmpty) - { + if($isEmpty) + { return $this->renderEmptyMessage(); } - $objSession = System::getContainer()->get('session')->getBag('contao_backend'); + $objSession = $this->requestStack->getSession()->getBag('contao_backend'); $arrSession = $objSession->get('stylemanager_section_states'); $arrGroups = array(); @@ -243,7 +266,7 @@ public function generate() return (array_search($key1, $arrOrder) > array_search($key2, $arrOrder)); }); - // collect groups + // collect groups foreach ($arrCollection as $alias => $collection) { $arrGroups[ $collection['group'] ][ $alias ] = $collection; @@ -269,7 +292,7 @@ public function generate() $this->id, $groupAlias, $identifier, - REQUEST_TOKEN + $this->tokenManager->getDefaultTokenValue() ); $arrNavigation[ $index ] = sprintf('', @@ -283,12 +306,12 @@ public function generate() $arrContent[ $index ] = sprintf('
%s%s
', $identifier, - (trim($group['desc']) ? '
' . $this->replaceInsertTags(nl2br($group['desc'])) . '
' : ''), + (trim($group['desc']) ? '
' . $this->insertTagParser->replaceInline(nl2br($group['desc'])) . '
' : ''), implode("", $group['fields']) ); // Set group title if it exists - if ($blnShowGroupTitle && null !== $group['groupTitle']) + if ($this->showGroupTitle && null !== $group['groupTitle']) { $groupTitle = '

' . $group['groupTitle'] . '

'; } @@ -305,8 +328,19 @@ public function generate() $arrSections[] = '
' . $groupTitle . implode("", $arrNavigation) . implode("", $arrContent) . '
'; } - return implode("", $arrSections); - } + return implode("", $arrSections); + } + + /** + * Return the empty message + * + * @return string + */ + private function renderEmptyMessage() + { + System::loadLanguageFile('tl_style_manager'); + return '

' . $GLOBALS['TL_LANG']['tl_style_manager']['noStylesDefined'] . '

'; + } /** * Check for a valid option and prepare template variables @@ -347,14 +381,4 @@ public function validate() } } - /** - * Return the empty message - * - * @return string - */ - private function renderEmptyMessage() - { - System::loadLanguageFile('tl_style_manager'); - return '

' . $GLOBALS['TL_LANG']['tl_style_manager']['noStylesDefined'] . '

'; - } }