From 53adb37f435bf4e5a24138c677858799b3bdabd7 Mon Sep 17 00:00:00 2001 From: Molkobain Date: Thu, 16 Jan 2020 11:28:25 +0100 Subject: [PATCH] =?UTF-8?q?N=C2=B02060=20-=20Fix=20session=20messages=20an?= =?UTF-8?q?d=20SCSS=20compilation=20services=20being=20cached?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/legacy_silex_compat_layer.php | 44 +---------- .../portal/config/routes/session_message.yaml | 21 +++++ .../portal/config/services.yaml | 7 +- .../Controller/SessionMessageController.php | 67 ++++++++++++++++ .../src/EventListener/CssFromSassCompiler.php | 76 +++++++++++++++++++ .../portal/templates/layout.html.twig | 25 +++--- 6 files changed, 184 insertions(+), 56 deletions(-) create mode 100644 datamodels/2.x/itop-portal-base/portal/config/routes/session_message.yaml create mode 100644 datamodels/2.x/itop-portal-base/portal/src/Controller/SessionMessageController.php create mode 100644 datamodels/2.x/itop-portal-base/portal/src/EventListener/CssFromSassCompiler.php diff --git a/datamodels/2.x/itop-portal-base/portal/config/legacy_silex_compat_layer.php b/datamodels/2.x/itop-portal-base/portal/config/legacy_silex_compat_layer.php index f41f971b90..06e69d1d73 100644 --- a/datamodels/2.x/itop-portal-base/portal/config/legacy_silex_compat_layer.php +++ b/datamodels/2.x/itop-portal-base/portal/config/legacy_silex_compat_layer.php @@ -48,6 +48,9 @@ $oListsCompat = new Lists($oModuleDesign); $oListsCompat->Process($container); // Generating CSS files +// Note: We do this here as it is not user dependent and therefore can be cached for everyone. +// A dedicated listener 'CssFromSassCompiler' exists to compile files again when by-passing HTTP cache. +// This is to keep developers comfort when tuning the SCSS files. $aImportPaths = array($_ENV['COMBODO_PORTAL_BASE_ABSOLUTE_PATH'].'css/'); $aPortalConf = $container->getParameter('combodo.portal.instance.conf'); foreach ($aPortalConf['properties']['themes'] as $sKey => $value) @@ -68,43 +71,4 @@ foreach ($aPortalConf['properties']['themes'] as $sKey => $value) $aPortalConf['properties']['themes'][$sKey] = $aValues; } } -$container->setParameter('combodo.portal.instance.conf', $aPortalConf); - -//TODO: The following needs to be refactored -// Session messages -// Note: We keep this system instead of following the Symfony system to make it simpler for extension developers to use them accross the admin. console and the portal. -$aAllMessages = array(); -if ((array_key_exists('obj_messages', $_SESSION)) && (!empty($_SESSION['obj_messages']))) -{ - foreach ($_SESSION['obj_messages'] as $sMessageKey => $aMessageObjectData) - { - $aObjectMessages = array(); - $aRanks = array(); - foreach ($aMessageObjectData as $sMessageId => $aMessageData) - { - $sMsgClass = 'alert alert-dismissible alert-'; - switch ($aMessageData['severity']) - { - case 'info': - $sMsgClass .= 'info'; - break; - case 'error': - $sMsgClass .= 'danger'; - break; - case 'ok': - default: - $sMsgClass .= 'success'; - break; - } - $aObjectMessages[] = array('css_classes' => $sMsgClass, 'message' => $aMessageData['message']); - $aRanks[] = $aMessageData['rank']; - } - //unset($_SESSION['obj_messages'][$sMessageKey]); - array_multisort($aRanks, $aObjectMessages); - foreach ($aObjectMessages as $aObjectMessage) - { - $aAllMessages[] = $aObjectMessage; - } - } -} -$container->setParameter('combodo.current_user.session_messages', $aAllMessages); \ No newline at end of file +$container->setParameter('combodo.portal.instance.conf', $aPortalConf); \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/config/routes/session_message.yaml b/datamodels/2.x/itop-portal-base/portal/config/routes/session_message.yaml new file mode 100644 index 0000000000..347f761bc0 --- /dev/null +++ b/datamodels/2.x/itop-portal-base/portal/config/routes/session_message.yaml @@ -0,0 +1,21 @@ +# Copyright (C) 2010-2020 Combodo SARL +# +# This file is part of iTop. +# +# iTop is free software; you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# iTop is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with iTop. If not, see + +p_session_message_add: + path: '/session-message/add' + defaults: + _controller: 'Combodo\iTop\Portal\Controller\SessionMessageController::AddMessageAction' diff --git a/datamodels/2.x/itop-portal-base/portal/config/services.yaml b/datamodels/2.x/itop-portal-base/portal/config/services.yaml index 2657862b81..a343a9f4c4 100644 --- a/datamodels/2.x/itop-portal-base/portal/config/services.yaml +++ b/datamodels/2.x/itop-portal-base/portal/config/services.yaml @@ -1,4 +1,4 @@ -# Copyright (C) 2010-2018 Combodo SARL +# Copyright (C) 2010-2020 Combodo SARL # # This file is part of iTop. # @@ -74,6 +74,8 @@ services: tags: [{ name: 'kernel.event_listener', event: 'kernel.request', priority: 400 }] Combodo\iTop\Portal\EventListener\ApplicationContextSetPluginPropertyClass: tags: [{ name: 'kernel.event_listener', event: 'kernel.request', priority: 300 }] + Combodo\iTop\Portal\EventListener\CssFromSassCompiler: + tags: [{ name: 'kernel.event_listener', event: 'kernel.request', priority: 200 }] # Add more service definitions when explicit configuration is needed # Please note that last definitions always *replace* previous ones @@ -141,4 +143,7 @@ services: public: true brick_controller_helper: alias: Combodo\iTop\Portal\Helper\BrickControllerHelper + public: true + session_message_helper: + alias: Combodo\iTop\Portal\Helper\SessionMessageHelper public: true \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/src/Controller/SessionMessageController.php b/datamodels/2.x/itop-portal-base/portal/src/Controller/SessionMessageController.php new file mode 100644 index 0000000000..33319523be --- /dev/null +++ b/datamodels/2.x/itop-portal-base/portal/src/Controller/SessionMessageController.php @@ -0,0 +1,67 @@ + + * @package Combodo\iTop\Portal\Controller + * @since 2.7.0 + */ +class SessionMessageController extends AbstractController +{ + /** + * @param \Symfony\Component\HttpFoundation\Request $oRequest + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function AddMessageAction(Request $oRequest) + { + $aData = array(); + + /** @var \Combodo\iTop\Portal\Helper\RequestManipulatorHelper $oRequestManipulator */ + $oRequestManipulator = $this->get('request_manipulator'); + /** @var \Combodo\iTop\Portal\Helper\SessionMessageHelper $oSessionMessageHelper */ + $oSessionMessageHelper = $this->get('session_message_helper'); + + // Retrieve parameters + $sMessageSeverity = $oRequestManipulator->ReadParam('sSeverity'); + $sMessageContent = $oRequestManipulator->ReadParam('sContent'); + + // Check parameters consistency + if (empty($sMessageSeverity) || empty($sMessageContent)) + { + throw new HttpException(Response::HTTP_BAD_REQUEST, 'Message must have a severity and a content, make sure both sSeverity & sContent parameters are sent.'); + } + + // Add message + $oSessionMessageHelper->AddMessage(uniqid(), $sMessageContent, $sMessageSeverity); + + return new JsonResponse($aData); + } + +} diff --git a/datamodels/2.x/itop-portal-base/portal/src/EventListener/CssFromSassCompiler.php b/datamodels/2.x/itop-portal-base/portal/src/EventListener/CssFromSassCompiler.php new file mode 100644 index 0000000000..37b67db385 --- /dev/null +++ b/datamodels/2.x/itop-portal-base/portal/src/EventListener/CssFromSassCompiler.php @@ -0,0 +1,76 @@ +aCombodoPortalInstanceConf = $aCombodoPortalInstanceConf; + } + + /** + * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $oGetResponseEvent + */ + public function onKernelRequest(GetResponseEvent $oGetResponseEvent) + { + // Force compilation need only when by-passing cache to limit server load. + if (isset($_SERVER['HTTP_CACHE_CONTROL']) && ($_SERVER['HTTP_CACHE_CONTROL'] !== 'no-cache')) + { + return; + } + + $aImportPaths = array($_ENV['COMBODO_PORTAL_BASE_ABSOLUTE_PATH'].'css/'); + foreach ($this->aCombodoPortalInstanceConf['properties']['themes'] as $sKey => $value) + { + if (!is_array($value)) + { + utils::GetCSSFromSASS('env-'.utils::GetCurrentEnvironment().'/'.$value, $aImportPaths); + } + else + { + foreach ($value as $sSubValue) + { + utils::GetCSSFromSASS('env-'.utils::GetCurrentEnvironment().'/'.$sSubValue, $aImportPaths); + } + } + } + } +} \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig b/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig index 658f972722..a6f9fcef94 100644 --- a/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig +++ b/datamodels/2.x/itop-portal-base/portal/templates/layout.html.twig @@ -325,25 +325,20 @@
- - {% if app['combodo.current_user.session_messages']|length > 0 %} -
-
- {% for aSessionMessage in app['combodo.current_user.session_messages'] %} -
- - {{ aSessionMessage['message'] }} -
- {% endfor %} -
-
- {% endif %} - +
+
+ {% for aSessionMessage in app['session_message_helper'] %} +
+ + {{ aSessionMessage['message'] }} +
+ {% endfor %} +
+
{% block pMainHeader %} {% endblock %}
-
{% block pMainContent %} {% endblock %}