NavigationItemRenderer: Add support for options

refs #5600
This commit is contained in:
Johannes Meyer 2015-09-03 13:36:13 +02:00
parent c3ad665c15
commit 67dee62c57
2 changed files with 45 additions and 6 deletions

View File

@ -581,17 +581,24 @@ class NavigationItem implements IteratorAggregate
/** /**
* Create and return the given renderer * Create and return the given renderer
* *
* @param string $name * @param string|array $name
* *
* @return NavigationItemRenderer * @return NavigationItemRenderer
*/ */
protected function createRenderer($name) protected function createRenderer($name)
{ {
if (is_array($name)) {
$options = array_splice($name, 1);
$name = $name[0];
} else {
$options = array();
}
$renderer = null; $renderer = null;
foreach (Icinga::app()->getModuleManager()->getLoadedModules() as $module) { foreach (Icinga::app()->getModuleManager()->getLoadedModules() as $module) {
$classPath = 'Icinga\\Module\\' . $module->getName() . '\\' . static::RENDERER_NS . '\\' . $name; $classPath = 'Icinga\\Module\\' . $module->getName() . '\\' . static::RENDERER_NS . '\\' . $name;
if (class_exists($classPath)) { if (class_exists($classPath)) {
$renderer = new $classPath(); $renderer = new $classPath($options);
break; break;
} }
} }
@ -599,7 +606,7 @@ class NavigationItem implements IteratorAggregate
if ($renderer === null) { if ($renderer === null) {
$classPath = 'Icinga\\' . static::RENDERER_NS . '\\' . $name; $classPath = 'Icinga\\' . static::RENDERER_NS . '\\' . $name;
if (class_exists($classPath)) { if (class_exists($classPath)) {
$renderer = new $classPath(); $renderer = new $classPath($options);
} }
} }
@ -619,7 +626,7 @@ class NavigationItem implements IteratorAggregate
/** /**
* Set this item's renderer * Set this item's renderer
* *
* @param string|NavigationItemRenderer $renderer * @param string|array|NavigationItemRenderer $renderer
* *
* @return $this * @return $this
* *
@ -627,10 +634,12 @@ class NavigationItem implements IteratorAggregate
*/ */
public function setRenderer($renderer) public function setRenderer($renderer)
{ {
if (is_string($renderer)) { if (is_string($renderer) || is_array($renderer)) {
$renderer = $this->createRenderer($renderer); $renderer = $this->createRenderer($renderer);
} elseif (! $renderer instanceof NavigationItemRenderer) { } elseif (! $renderer instanceof NavigationItemRenderer) {
throw new InvalidArgumentException('Argument $renderer must be of type string or NavigationItemRenderer'); throw new InvalidArgumentException(
'Argument $renderer must be of type string, array or NavigationItemRenderer'
);
} }
$this->renderer = $renderer; $this->renderer = $renderer;

View File

@ -4,6 +4,7 @@
namespace Icinga\Web\Navigation\Renderer; namespace Icinga\Web\Navigation\Renderer;
use Icinga\Application\Icinga; use Icinga\Application\Icinga;
use Icinga\Util\String;
use Icinga\Web\Navigation\NavigationItem; use Icinga\Web\Navigation\NavigationItem;
use Icinga\Web\View; use Icinga\Web\View;
@ -19,6 +20,35 @@ class NavigationItemRenderer
*/ */
protected $view; protected $view;
/**
* Create a new NavigationItemRenderer
*
* @param array $options
*/
public function __construct(array $options = null)
{
if (! empty($options)) {
$this->setOptions($options);
}
}
/**
* Set the given options
*
* @param array $options
*
* @return $this
*/
public function setOptions(array $options)
{
foreach ($options as $name => $value) {
$setter = 'set' . String::cname($name);
if (method_exists($this, $setter)) {
$this->$setter($value);
}
}
}
/** /**
* Return the view * Return the view
* *