Skip to content

Commit

Permalink
Merge branch 'bugfix/menu-item-renderer-deduplication-7658'
Browse files Browse the repository at this point in the history
fixes #7658
  • Loading branch information
Alexander Fuhr committed Apr 20, 2015
2 parents 1e064a5 + 9ebf474 commit 5f3aafd
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 54 deletions.
16 changes: 5 additions & 11 deletions library/Icinga/Web/Menu/ForeignMenuItemRenderer.php
Expand Up @@ -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(
'<a href="%s" target="_self">%s%s<span></span></a>',
$menu->getUrl() ?: '#',
$menu->getIcon() ? '<img aria-hidden="true" src="' . Url::fromPath($menu->getIcon()) . '" class="icon" /> ' : '',
htmlspecialchars($menu->getTitle())
);
}
class ForeignMenuItemRenderer extends MenuItemRenderer
{
protected $attributes = array(
'target' => '_self'
);
}
102 changes: 99 additions & 3 deletions library/Icinga/Web/Menu/MenuItemRenderer.php
Expand Up @@ -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 <a> 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(
'<a href="%s"%s><i aria-hidden="true" class="icon-%s"></i>%s</a>',
$menu->getUrl() ? : '#',
$this->getAttributes(),
$menu->getIcon(),
$this->getView()->escape($menu->getTitle())
);
}

return sprintf(
'<a href="%s"%s>%s%s<span></span></a>',
$menu->getUrl() ? : '#',
$this->getAttributes(),
$menu->getIcon() ? '<img aria-hidden="true" src="' . Url::fromPath($menu->getIcon()) . '" class="icon" /> ' : '',
$this->getView()->escape($menu->getTitle())
);
}

/**
* Returns <a> 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;
}
}
25 changes: 9 additions & 16 deletions library/Icinga/Web/MenuRenderer.php
Expand Up @@ -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;
Expand Down Expand Up @@ -32,6 +33,11 @@ class MenuRenderer extends RecursiveIteratorIterator
*/
protected $useCustomRenderer = false;

/**
* @var MenuItemRenderer
*/
protected $defaultRenderer;

/**
* Create a new MenuRenderer
*
Expand All @@ -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);
}

Expand Down Expand Up @@ -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(
'<a href="%s"><i aria-hidden="true" class="icon-%s"></i>%s</a>',
$child->getUrl() ?: '#',
$child->getIcon(),
htmlspecialchars($child->getTitle())
);
}
return sprintf(
'<a href="%s">%s%s</a>',
$child->getUrl() ?: '#',
$child->getIcon()
? '<img aria-hidden="true" src="' . Url::fromPath($child->getIcon()) . '" class="icon" /> '
: '',
htmlspecialchars($child->getTitle())
);

return $this->defaultRenderer->render($child);
}

/**
Expand Down
Expand Up @@ -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();
Expand Down Expand Up @@ -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(
'<div title="%s" class="badge-container"><span class="badge badge-critical">%s</span></div>',
$this->getBadgeTitle(),
$count
);
}
if ($menu->getIcon() && strpos($menu->getIcon(), '.') === false) {
return sprintf(
'%s <a href="%s"><i aria-hidden="true" class="icon-%s"></i>%s</a>',
$badge,
$menu->getUrl() ?: '#',
$menu->getIcon(),
htmlspecialchars($menu->getTitle())
);
}

return sprintf(
'%s<a href="%s">%s%s<span></span></a>',
$badge,
$menu->getUrl() ?: '#',
$menu->getIcon() ? '<img aria-hidden="true" src="' . Url::fromPath($menu->getIcon()) . '" class="icon" /> ' : '',
htmlspecialchars($menu->getTitle())
);
return '';
}
}

0 comments on commit 5f3aafd

Please sign in to comment.