[TASK] Cleanup InfoBoxViewHelper 10/44610/2
authorHelmut Hummel <helmut.hummel@typo3.org>
Sat, 7 Nov 2015 22:09:55 +0000 (23:09 +0100)
committerFrank Nägler <frank.naegler@typo3.org>
Mon, 9 Nov 2015 20:15:08 +0000 (21:15 +0100)
* Encode title and message in case they are provided as vh argument.
* Minor code cleanup

Resolves: #71406
Releases: master
Change-Id: Ice28ed261c294c0164e06f24ed90cca31ddc1707
Reviewed-on: https://review.typo3.org/44610
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Tested-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
Reviewed-by: Frank Nägler <frank.naegler@typo3.org>
Tested-by: Frank Nägler <frank.naegler@typo3.org>
typo3/sysext/core/Documentation/Changelog/7.2/Feature-66077-IntroduceCalloutsToReplaceContentAlerts.rst
typo3/sysext/fluid/Classes/ViewHelpers/Be/InfoboxViewHelper.php
typo3/sysext/scheduler/Resources/Private/Templates/Backend/SchedulerModule/CheckScreen.html
typo3/sysext/scheduler/Resources/Private/Templates/Backend/SchedulerModule/ListTasksNoTasks.html

index 5a8ae4a..6684cfa 100644 (file)
@@ -5,8 +5,8 @@ Feature: #66077 - Introduce callouts to replace content alerts
 Description
 ===========
 
-In several places alerts (flashmessages) were used to display context information.
-We introduce content info boxes and replace all occurrences where flashmessages were used.
+In several places alerts (flash messages) were used to display context information.
+We introduce content info boxes and replace all occurrences where flash messages were used.
 
 
 Impact
@@ -18,14 +18,22 @@ We introduced a new layout for context information and added a ViewHelper to ren
 Examples
 ========
 
-Simple infobox with a title
+Simple info box with a title. Please note that the title will always be HTML encoded by the ViewHelper
 
 .. code-block:: html
 
        <f:be.infobox title="Message title">your box content</f:be.infobox>
 
-All options
+All options of the ViewHelper. If you pass your message as ViewHelper argument, it will also be HTML encoded.
 
 .. code-block:: html
 
-       <f:be.infobox title="Message title" message="your box content" state="-2" iconName="check" disableIcon="TRUE" />
\ No newline at end of file
+       <f:be.infobox title="Message title" message="your box content" state="-2" iconName="check" disableIcon="TRUE" />
+
+If you really need to output HTML in your message, use the closing variant. All children of the ViewHelper will be used as message.
+
+.. code-block:: html
+
+       <f:be.infobox title="Message title" state="-2" iconName="check" disableIcon="TRUE">
+               <h1>{AlertMessage}</h1>
+       </f:be.infobox>
index 2664b4a..cfcd782 100644 (file)
@@ -14,6 +14,7 @@ namespace TYPO3\CMS\Fluid\ViewHelpers\Be;
  * The TYPO3 project - inspiring people to share!
  */
 
+use TYPO3\CMS\Core\Utility\MathUtility;
 use TYPO3\CMS\Fluid\Core\Rendering\RenderingContextInterface;
 use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
 use TYPO3\CMS\Fluid\Core\ViewHelper\Facets\CompilableInterface;
@@ -57,10 +58,10 @@ class InfoboxViewHelper extends AbstractViewHelper implements CompilableInterfac
     const STATE_ERROR = 2;
 
     /**
-     * @param string $title The title of the infobox
-     * @param string $message The message of the infobox, if NULL tag content is used
+     * @param string $title The title of the info box
+     * @param string $message The message of the info box, if NULL tag content is used
      * @param int $state The state of the box, InfoboxViewHelper::STATE_*
-     * @param string $iconName The icon name from fontawsome, NULL sets default icon
+     * @param string $iconName The icon name from font awesome, NULL sets default icon
      * @param bool $disableIcon If set to TRUE, the icon is not rendered.
      *
      * @return string
@@ -68,13 +69,13 @@ class InfoboxViewHelper extends AbstractViewHelper implements CompilableInterfac
     public function render($title = null, $message = null, $state = self::STATE_NOTICE, $iconName = null, $disableIcon = false)
     {
         return static::renderStatic(
-            array(
+            [
                 'title' => $title,
                 'message' => $message,
                 'state' => $state,
                 'iconName' => $iconName,
                 'disableIcon' => $disableIcon
-            ),
+            ],
             $this->buildRenderChildrenClosure(),
             $this->renderingContext
         );
@@ -82,50 +83,41 @@ class InfoboxViewHelper extends AbstractViewHelper implements CompilableInterfac
 
     /**
      * @param array $arguments
-     * @param callable $renderChildrenClosure
+     * @param \Closure $renderChildrenClosure
      * @param RenderingContextInterface $renderingContext
      *
      * @return string
-     * @throws Exception
      */
     public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
     {
         $title = $arguments['title'];
         $message = $arguments['message'];
-        $state = $arguments['state'];
+        $state = MathUtility::forceIntegerInRange($arguments['state'], -2, 2, -2);
         $iconName = $arguments['iconName'];
         $disableIcon = $arguments['disableIcon'];
-
         if ($message === null) {
-            $message = $renderChildrenClosure();
-        }
-        switch ($state) {
-            case self::STATE_NOTICE:
-                $stateClass = 'notice';
-                $icon = 'lightbulb-o';
-                break;
-            case self::STATE_INFO:
-                $stateClass = 'info';
-                $icon = 'info';
-                break;
-            case self::STATE_OK:
-                $stateClass = 'success';
-                $icon = 'check';
-                break;
-            case self::STATE_WARNING:
-                $stateClass = 'warning';
-                $icon = 'exclamation';
-                break;
-            case self::STATE_ERROR:
-                $stateClass = 'danger';
-                $icon = 'times';
-                break;
-            default:
-                $stateClass = 'notice';
-                $icon = 'lightbulb-o';
+            $messageTemplate = $renderChildrenClosure();
+        } else {
+            $messageTemplate = htmlspecialchars($message);
         }
+        $classes = [
+            self::STATE_NOTICE => 'notice',
+            self::STATE_INFO => 'info',
+            self::STATE_OK => 'success',
+            self::STATE_WARNING => 'warning',
+            self::STATE_ERROR => 'danger'
+        ];
+        $icons = [
+            self::STATE_NOTICE => 'lightbulb-o',
+            self::STATE_INFO => 'info',
+            self::STATE_OK => 'check',
+            self::STATE_WARNING => 'exclamation',
+            self::STATE_ERROR => 'times'
+        ];
+        $stateClass = $classes[$state];
+        $icon = $icons[$state];
         if ($iconName !== null) {
-            $icon = htmlspecialchars($iconName);
+            $icon = $iconName;
         }
         $iconTemplate = '';
         if (!$disableIcon) {
@@ -133,20 +125,20 @@ class InfoboxViewHelper extends AbstractViewHelper implements CompilableInterfac
                 '<div class="media-left">' .
                     '<span class="fa-stack fa-lg callout-icon">' .
                         '<i class="fa fa-circle fa-stack-2x"></i>' .
-                        '<i class="fa fa-' . $icon . ' fa-stack-1x"></i>' .
+                        '<i class="fa fa-' . htmlspecialchars($icon) . ' fa-stack-1x"></i>' .
                     '</span>' .
                 '</div>';
         }
         $titleTemplate = '';
         if ($title !== null) {
-            $titleTemplate = '<h4 class="callout-title">' . $title . '</h4>';
+            $titleTemplate = '<h4 class="callout-title">' . htmlspecialchars($title) . '</h4>';
         }
-        return '<div class="callout callout-' . $stateClass . '">' .
+        return '<div class="callout callout-' . htmlspecialchars($stateClass) . '">' .
                 '<div class="media">' .
                     $iconTemplate .
                     '<div class="media-body">' .
                         $titleTemplate .
-                        '<div class="callout-body">' . $message . '</div>' .
+                        '<div class="callout-body">' . $messageTemplate . '</div>' .
                     '</div>' .
                 '</div>' .
             '</div>';
index 6b75758..4dcf3a7 100644 (file)
@@ -11,5 +11,5 @@
 
 <f:be.infobox title="{f:translate(key: 'hdg.cliScript')}" state="{isExecutableSeverity}">
        <p><f:translate key="msg.cliScript" arguments="{0: script}" /></p>
-       <f:format.raw>{isExecutableMessage}</f:format.raw>
+       {isExecutableMessage}
 </f:be.infobox>