diff --git a/application/exceptions/CoreTemplateException.php b/application/exceptions/CoreTemplateException.php new file mode 100644 index 000000000..fb016264f --- /dev/null +++ b/application/exceptions/CoreTemplateException.php @@ -0,0 +1,17 @@ +getMessage(); + parent::__construct($sMessage, null, '', $oTwigException); + } +} \ No newline at end of file diff --git a/dictionaries/en.dictionary.itop.ui.php b/dictionaries/en.dictionary.itop.ui.php index 4ee7a9dcb..536bd9efc 100644 --- a/dictionaries/en.dictionary.itop.ui.php +++ b/dictionaries/en.dictionary.itop.ui.php @@ -460,7 +460,6 @@ Dict::Add('EN US', 'English', 'English', array( 'UI:Error:MaintenanceMode' => 'Application is currently in maintenance', 'UI:Error:MaintenanceTitle' => 'Maintenance', 'UI:Error:InvalidToken' => 'Error: the requested operation has already been performed (CSRF token not found)', - 'UI:Error:TemplateRendering' => 'Cannot render template', 'UI:GroupBy:Count' => 'Count', 'UI:GroupBy:Count+' => 'Number of elements', diff --git a/dictionaries/fr.dictionary.itop.ui.php b/dictionaries/fr.dictionary.itop.ui.php index c6d2bd335..6f7be9d14 100644 --- a/dictionaries/fr.dictionary.itop.ui.php +++ b/dictionaries/fr.dictionary.itop.ui.php @@ -456,7 +456,6 @@ Dict::Add('FR FR', 'French', 'Français', array( 'UI:Error:MaintenanceMode' => 'L\'application est en maintenance', 'UI:Error:MaintenanceTitle' => 'Maintenance', 'UI:Error:InvalidToken' => 'Erreur: l\'opération a déjà été effectuée (CSRF token not found)', - 'UI:Error:TemplateRendering' => 'Impossible de rendre le template', 'UI:GroupBy:Count' => 'Nombre', 'UI:GroupBy:Count+' => 'Nombre d\'éléments', diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index 7bb74608b..66d18fae1 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -345,6 +345,7 @@ return array( 'CoreOqlMultipleResultsForbiddenException' => $baseDir . '/application/exceptions/oql/CoreOqlMultipleResultsForbiddenException.php', 'CorePortalInvalidActionRuleException' => $baseDir . '/application/exceptions/CorePortalInvalidActionRuleException.php', 'CoreServices' => $baseDir . '/core/restservices.class.inc.php', + 'CoreTemplateException' => $baseDir . '/application/exceptions/CoreTemplateException.php', 'CoreUnexpectedValue' => $baseDir . '/application/exceptions/CoreUnexpectedValue.php', 'CoreWarning' => $baseDir . '/application/exceptions/CoreWarning.php', 'CryptEngine' => $baseDir . '/core/simplecrypt.class.inc.php', diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index 3a9c831ec..bd5d78469 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -575,6 +575,7 @@ class ComposerStaticInit0018331147de7601e7552f7da8e3bb8b 'CoreOqlMultipleResultsForbiddenException' => __DIR__ . '/../..' . '/application/exceptions/oql/CoreOqlMultipleResultsForbiddenException.php', 'CorePortalInvalidActionRuleException' => __DIR__ . '/../..' . '/application/exceptions/CorePortalInvalidActionRuleException.php', 'CoreServices' => __DIR__ . '/../..' . '/core/restservices.class.inc.php', + 'CoreTemplateException' => __DIR__ . '/../..' . '/application/exceptions/CoreTemplateException.php', 'CoreUnexpectedValue' => __DIR__ . '/../..' . '/application/exceptions/CoreUnexpectedValue.php', 'CoreWarning' => __DIR__ . '/../..' . '/application/exceptions/CoreWarning.php', 'CryptEngine' => __DIR__ . '/../..' . '/core/simplecrypt.class.inc.php', diff --git a/sources/application/TwigBase/Twig/TwigHelper.php b/sources/application/TwigBase/Twig/TwigHelper.php index ee7c60c12..6c4478993 100644 --- a/sources/application/TwigBase/Twig/TwigHelper.php +++ b/sources/application/TwigBase/Twig/TwigHelper.php @@ -7,9 +7,7 @@ namespace Combodo\iTop\Application\TwigBase\Twig; use Combodo\iTop\Application\TwigBase\UI\UIBlockExtension; -use Combodo\iTop\Application\UI\Base\Component\Alert\AlertUIBlockFactory; -use Combodo\iTop\Renderer\BlockRenderer; -use Dict; +use CoreTemplateException; use IssueLog; use Twig\Environment; use Twig\Error\Error; @@ -116,53 +114,37 @@ class TwigHelper * @param bool $bLogMissingFile * * @return string - * @throws \Twig\Error\RuntimeError - * @throws \Twig\Error\SyntaxError - * @throws \Exception + * @throws \CoreTemplateException */ public static function RenderTemplate(Environment $oTwig, array $aParams, string $sName, string $sTemplateFileExtension = self::DEFAULT_FILE_TYPE, bool $bLogMissingFile = true): string { try { return $oTwig->render($sName.'.'.$sTemplateFileExtension.'.twig', $aParams); - } catch (Error $e) { - $sPath = ''; - if ($e->getSourceContext()) { - $sPath = utils::LocalPath($e->getSourceContext()->getPath()).' ('.$e->getLine().') - '; + } + catch (Error $oTwigException) { + $oTwigPreviousException = $oTwigException->getPrevious(); + if (!is_null(($oTwigPreviousException)) && ($oTwigPreviousException instanceof CoreTemplateException)) { + // handles recursive calls : if we're here, an exception was already raised in a child template ! + throw $oTwigPreviousException; } - $sMessage = $sPath.$e->getMessage(); - if (strpos($e->getMessage(), 'Unable to find template') === false) { - IssueLog::Error($sMessage); + $sPath = ''; + if ($oTwigException->getSourceContext()) { + $sPath = utils::LocalPath($oTwigException->getSourceContext()->getPath()).' ('.$oTwigException->getLine().') - '; + } - return static::GenerateEndUserError(Dict::S('UI:Error:TemplateRendering'), $sMessage); + if (strpos($oTwigException->getMessage(), 'Unable to find template') === false) { + //TODO handle ajax ?? + // this will trigger error page, and will log to error.log ! + throw new CoreTemplateException($oTwigException, $sPath); } if ($bLogMissingFile) { - IssueLog::Debug($sMessage); + $sLogMessageMissingFile = "Twig : missing file '$sPath' : ".$oTwigException->getMessage(); + IssueLog::Debug($sLogMessageMissingFile); } } return ''; } - - /** - * @param string $sTitle - * @param string $sMessage - * - * @return string error panel markup - * - * @throws \ReflectionException - * @throws \Twig\Error\LoaderError - * @throws \Twig\Error\RuntimeError - * @throws \Twig\Error\SyntaxError - * @since 3.0.0 N°3522 method creation - */ - protected static function GenerateEndUserError(string $sTitle, string $sMessage): string - { - $oAlert = AlertUIBlockFactory::MakeForFailure($sTitle, $sMessage) - ->SetIsClosable(false) - ->SetIsCollapsible(false); // not rendering JS so... - - return BlockRenderer::RenderBlockTemplates($oAlert); - } }