url; } /** * Set the base URL * * @param Url|string $url * * @return $this */ public function setUrl($url) { if (! $url instanceof $url) { $url = Url::fromPath($url); } $this->url = $url; return $this; } /** * Get the base filter * * @return Filter */ public function getBaseFilter() { return $this->baseFilter; } /** * Set the base filter * * @param Filter $baseFilter * * @return $this */ public function setBaseFilter($baseFilter) { $this->baseFilter = $baseFilter; return $this; } /** * Add a state badge * * @param string $state * @param int $count * @param array $filter * @param string $translateSingular * @param string $translatePlural * @param array $translateArgs * * @return $this */ public function add( $state, $count, array $filter, $translateSingular, $translatePlural, array $translateArgs = array() ) { $this->badges[$state] = (object) array( 'count' => (int) $count, 'filter' => $filter, 'translateArgs' => $translateArgs, 'translatePlural' => $translatePlural, 'translateSingular' => $translateSingular ); return $this; } /** * Create a badge * * @param string $state * @param Navigation $badges * * @return $this */ public function createBadge($state, Navigation $badges) { if ($this->has($state)) { $badge = $this->get($state); $url = clone $this->url->setParams($badge->filter); if (isset($this->baseFilter)) { $url->addFilter($this->baseFilter); } $badges->addItem(new NavigationItem($state, array( 'attributes' => array('class' => 'badge ' . $state), 'label' => $badge->count, 'priority' => $this->priority++, 'title' => vsprintf( mtp('monitoring', $badge->translateSingular, $badge->translatePlural, $badge->count), $badge->translateArgs ), 'url' => $url ))); } return $this; } /** * Create a badge group * * @param array $states * @param Navigation $badges * * @return $this */ public function createBadgeGroup(array $states, Navigation $badges) { $group = array_intersect_key($this->badges, array_flip($states)); if (! empty($group)) { $groupItem = new NavigationItem( uniqid(), array( 'cssClass' => 'state-badge-group', 'label' => '', 'priority' => $this->priority++ ) ); $groupBadges = new Navigation(); $groupBadges->setLayout(Navigation::LAYOUT_TABS); foreach (array_keys($group) as $state) { $this->createBadge($state, $groupBadges); } $groupItem->setChildren($groupBadges); $badges->addItem($groupItem); } return $this; } /** * Get whether a badge for the given state has been added * * @param string $state * * @return bool */ public function has($state) { return isset($this->badges[$state]) && $this->badges[$state]->count; } /** * Get the badge for the given state * * @param string $state * * @return object */ public function get($state) { return $this->badges[$state]; } /** * {@inheritdoc} */ public function render() { $badges = new Navigation(); $badges->setLayout(Navigation::LAYOUT_TABS); $this ->createBadgeGroup( array(static::STATE_CRITICAL, static::STATE_CRITICAL_HANDLED), $badges ) ->createBadgeGroup( array(static::STATE_DOWN, static::STATE_DOWN_HANDLED), $badges ) ->createBadgeGroup( array(static::STATE_WARNING, static::STATE_WARNING_HANDLED), $badges ) ->createBadgeGroup( array(static::STATE_UNREACHABLE, static::STATE_UNREACHABLE_HANDLED), $badges ) ->createBadgeGroup( array(static::STATE_UNKNOWN, static::STATE_UNKNOWN_HANDLED), $badges ) ->createBadge(static::STATE_OK, $badges) ->createBadge(static::STATE_UP, $badges) ->createBadge(static::STATE_PENDING, $badges); return $badges ->getRenderer() ->setCssClass(static::CSS_CLASS) ->render(); } }