From f543321ac4fa173d491ed7f7d7c28326c0da9ce3 Mon Sep 17 00:00:00 2001 From: Alexander Fuhr Date: Mon, 20 Apr 2015 17:02:42 +0200 Subject: [PATCH 1/3] Replace MenuItemRenderer interface with a base class MenuItemRenderer refs #7658 --- library/Icinga/Web/Menu/MenuItemRenderer.php | 102 ++++++++++++++++++- 1 file changed, 99 insertions(+), 3 deletions(-) diff --git a/library/Icinga/Web/Menu/MenuItemRenderer.php b/library/Icinga/Web/Menu/MenuItemRenderer.php index 15e6b29305..33c653a7ce 100644 --- a/library/Icinga/Web/Menu/MenuItemRenderer.php +++ b/library/Icinga/Web/Menu/MenuItemRenderer.php @@ -3,11 +3,107 @@ namespace Icinga\Web\Menu; +use Icinga\Application\Icinga; use Icinga\Web\Menu; +use Icinga\Web\View; /** - * Renders the html content of a single menu item + * Default MenuItemRenderer class */ -interface MenuItemRenderer { - public function render(Menu $menu); +class MenuItemRenderer +{ + /** + * Contains element specific attributes + * + * @var array + */ + protected $attributes = array(); + + /** + * View + * + * @var View|null + */ + protected $view; + + /** + * Set the view + * + * @param View $view + * + * @return $this + */ + public function setView(View $view) + { + $this->view = $view; + return $this; + } + + /** + * Get the view + * + * @return View + */ + public function getView() + { + if ($this->view === null) { + $this->view = Icinga::app()->getViewRenderer()->view; + } + return $this->view; + } + + /** + * Renders the html content of a single menu item + * + * @param Menu $menu + * + * @return string + */ + public function render(Menu $menu) + { + return $this->createLink($menu); + } + + /** + * Creates a menu item link element + * + * @param Menu $menu + * + * @return string + */ + public function createLink(Menu $menu) + { + if ($menu->getIcon() && strpos($menu->getIcon(), '.') === false) { + return sprintf( + '%s', + $menu->getUrl() ? : '#', + $this->getAttributes(), + $menu->getIcon(), + $this->getView()->escape($menu->getTitle()) + ); + } + + return sprintf( + '%s%s', + $menu->getUrl() ? : '#', + $this->getAttributes(), + $menu->getIcon() ? ' ' : '', + $this->getView()->escape($menu->getTitle()) + ); + } + + /** + * Returns element specific attributes if present + * + * @return string + */ + protected function getAttributes() + { + $attributes = ''; + $view = $this->getView(); + foreach ($this->attributes as $attribute => $value) { + $attributes .= ' ' . $view->escape($attribute) . '="' . $view->escape($value) . '"'; + } + return $attributes; + } } From 4eb5f75c62056b6c9b19c156c52bac165b1169ba Mon Sep 17 00:00:00 2001 From: Alexander Fuhr Date: Mon, 20 Apr 2015 17:04:46 +0200 Subject: [PATCH 2/3] Use default MenuItemRenderer as renderer if no custom renderer is set refs #7658 --- library/Icinga/Web/MenuRenderer.php | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/library/Icinga/Web/MenuRenderer.php b/library/Icinga/Web/MenuRenderer.php index 7d2cd5ad31..4dec9404e3 100644 --- a/library/Icinga/Web/MenuRenderer.php +++ b/library/Icinga/Web/MenuRenderer.php @@ -4,6 +4,7 @@ namespace Icinga\Web; use Exception; +use Icinga\Web\Menu\MenuItemRenderer; use RecursiveIteratorIterator; use Icinga\Application\Logger; use Icinga\Web\Menu\PermittedMenuItemFilter; @@ -32,6 +33,11 @@ class MenuRenderer extends RecursiveIteratorIterator */ protected $useCustomRenderer = false; + /** + * @var MenuItemRenderer + */ + protected $defaultRenderer; + /** * Create a new MenuRenderer * @@ -45,6 +51,7 @@ public function __construct(Menu $menu, $url = null) } else { $this->url = Url::fromPath($url); } + $this->defaultRenderer = new MenuItemRenderer(); parent::__construct(new PermittedMenuItemFilter($menu), RecursiveIteratorIterator::CHILD_FIRST); } @@ -114,22 +121,8 @@ public function renderChild(Menu $child) Logger::error('Could not invoke custom renderer. Exception: '. $e->getMessage()); } } - if ($child->getIcon() && strpos($child->getIcon(), '.') === false) { - return sprintf( - '%s', - $child->getUrl() ?: '#', - $child->getIcon(), - htmlspecialchars($child->getTitle()) - ); - } - return sprintf( - '%s%s', - $child->getUrl() ?: '#', - $child->getIcon() - ? ' ' - : '', - htmlspecialchars($child->getTitle()) - ); + + return $this->defaultRenderer->render($child); } /** From 9ebf4742de1bfe7484e7b521bd9dff4d52f91eba Mon Sep 17 00:00:00 2001 From: Alexander Fuhr Date: Mon, 20 Apr 2015 17:07:34 +0200 Subject: [PATCH 3/3] Use the MenuItemRenderer render() implemnetations refs #7658 --- .../Web/Menu/ForeignMenuItemRenderer.php | 16 +++------ .../Web/Menu/MonitoringMenuItemRenderer.php | 34 ++++++------------- 2 files changed, 15 insertions(+), 35 deletions(-) diff --git a/library/Icinga/Web/Menu/ForeignMenuItemRenderer.php b/library/Icinga/Web/Menu/ForeignMenuItemRenderer.php index 2ed418bf38..b898b4d088 100644 --- a/library/Icinga/Web/Menu/ForeignMenuItemRenderer.php +++ b/library/Icinga/Web/Menu/ForeignMenuItemRenderer.php @@ -9,15 +9,9 @@ /** * A menu item with a link that surpasses the regular navigation link behavior */ -class ForeignMenuItemRenderer implements MenuItemRenderer { - - public function render(Menu $menu) - { - return sprintf( - '%s%s', - $menu->getUrl() ?: '#', - $menu->getIcon() ? ' ' : '', - htmlspecialchars($menu->getTitle()) - ); - } +class ForeignMenuItemRenderer extends MenuItemRenderer +{ + protected $attributes = array( + 'target' => '_self' + ); } diff --git a/modules/monitoring/library/Monitoring/Web/Menu/MonitoringMenuItemRenderer.php b/modules/monitoring/library/Monitoring/Web/Menu/MonitoringMenuItemRenderer.php index 7df80e0345..80ffb3d9c1 100644 --- a/modules/monitoring/library/Monitoring/Web/Menu/MonitoringMenuItemRenderer.php +++ b/modules/monitoring/library/Monitoring/Web/Menu/MonitoringMenuItemRenderer.php @@ -6,10 +6,9 @@ use Icinga\Web\Menu as Menu; use Icinga\Module\Monitoring\Backend\MonitoringBackend; use Icinga\Web\Menu\MenuItemRenderer; -use Icinga\Web\Url; - -class MonitoringMenuItemRenderer implements MenuItemRenderer { +class MonitoringMenuItemRenderer extends MenuItemRenderer +{ protected static $summary; protected $columns = array(); @@ -70,31 +69,18 @@ protected function countItems() public function render(Menu $menu) { - $count = $this->countItems(); - $badge = ''; - if ($count) { - $badge = sprintf( + return $this->getBadge() . $this->createLink($menu); + } + + protected function getBadge() + { + if ($count = $this->countItems()) { + return sprintf( '
%s
', $this->getBadgeTitle(), $count ); } - if ($menu->getIcon() && strpos($menu->getIcon(), '.') === false) { - return sprintf( - '%s %s', - $badge, - $menu->getUrl() ?: '#', - $menu->getIcon(), - htmlspecialchars($menu->getTitle()) - ); - } - - return sprintf( - '%s%s%s', - $badge, - $menu->getUrl() ?: '#', - $menu->getIcon() ? ' ' : '', - htmlspecialchars($menu->getTitle()) - ); + return ''; } }