[BUGFIX] Use late static binding for compilable viewhelpers
[Packages/TYPO3.CMS.git] / typo3 / sysext / fluid / Classes / ViewHelpers / Be / Buttons / IconViewHelper.php
1 <?php
2 namespace TYPO3\CMS\Fluid\ViewHelpers\Be\Buttons;
3
4 /* *
5 * This script is backported from the TYPO3 Flow package "TYPO3.Fluid". *
6 * *
7 * It is free software; you can redistribute it and/or modify it under *
8 * the terms of the GNU Lesser General Public License, either version 3 *
9 * of the License, or (at your option) any later version. *
10 * *
11 * *
12 * This script is distributed in the hope that it will be useful, but *
13 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- *
14 * TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser *
15 * General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU Lesser General Public *
18 * License along with the script. *
19 * If not, see http://www.gnu.org/licenses/lgpl.html *
20 * *
21 * The TYPO3 project - inspiring people to share! *
22 * */
23
24 use TYPO3\CMS\Backend\Utility\IconUtility;
25 use TYPO3\CMS\Fluid\Core\Rendering\RenderingContextInterface;
26 use TYPO3\CMS\Fluid\Core\ViewHelper\Facets\CompilableInterface;
27 use TYPO3\CMS\Fluid\ViewHelpers\Be\AbstractBackendViewHelper;
28
29 /**
30 * View helper which returns a button icon
31 *
32 * = Examples =
33 *
34 * <code title="Default">
35 * <f:be.buttons.icon uri="{f:uri.action()}" />
36 * </code>
37 * <output>
38 * An icon button as known from the TYPO3 backend, skinned and linked with the default action of the current controller.
39 * Note: By default the "close" icon is used as image
40 * </output>
41 *
42 * <code title="Default">
43 * <f:be.buttons.icon uri="{f:uri.action(action:'new')}" icon="actions-document-new" title="Create new Foo" />
44 * </code>
45 *
46 * <code title="Default">
47 * <f:be.buttons.icon icon="actions-document-new" title="Create new Foo" />
48 * </code>
49 * <output>
50 * Here the "actions-document-new" icon is returned, but without link.
51 * </output>
52 */
53 class IconViewHelper extends AbstractBackendViewHelper implements CompilableInterface {
54
55 /**
56 * Renders a linked icon as known from the TYPO3 backend.
57 *
58 * If the URI is left empty, the icon is rendered without link.
59 *
60 * @param string $uri The target URI for the link. If you want to execute JavaScript here, prefix the URI with
61 * "javascript:". Leave empty to render just an icon.
62 * @param string $icon Icon to be used.
63 * @param string $title Title attribute of the icon construct
64 * @param array $additionalAttributes Additional tag attributes. They will be added directly to the resulting HTML tag.
65 *
66 * @return string The rendered icon with or without link
67 */
68 public function render($uri = '', $icon = 'actions-document-close', $title = '', $additionalAttributes = array()) {
69 return static::renderStatic(
70 array(
71 'uri' => $uri,
72 'icon' => $icon,
73 'title' => $title,
74 'additionalAttributes' => $additionalAttributes
75 ),
76 $this->buildRenderChildrenClosure(),
77 $this->renderingContext
78 );
79 }
80
81 /**
82 * @param array $arguments
83 * @param callable $renderChildrenClosure
84 * @param RenderingContextInterface $renderingContext
85 * @return string
86 */
87 static public function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext) {
88 $uri = $arguments['uri'];
89 $icon = $arguments['icon'];
90 $title = $arguments['title'];
91 $additionalAttributes = $arguments['additionalAttributes'];
92 $additionalTagAttributes = '';
93 $icon = IconUtility::getSpriteIcon($icon, array('title' => $title));
94 if (empty($uri)) {
95 return $icon;
96 }
97
98 if ($additionalAttributes) {
99 foreach ($additionalAttributes as $argumentKey => $argumentValue) {
100 $additionalTagAttributes .= ' ' . $argumentKey . '="' . htmlspecialchars($argumentValue) . '"';
101 }
102 }
103 return '<a href="' . $uri . '"' . $additionalTagAttributes . '>' . $icon . '</a>';
104 }
105
106 }