\n"; $firstRow = true; foreach ($this->getTitles() as $key => $title) { $val = $row->$key; $value = null; if ($firstRow) { if ($val !== null && $url = $this->getActionUrl($row)) { $value = $this->view()->qlink($val, $this->getActionUrl($row)); } $firstRow = false; } if ($value === null) { $value = $val === null ? '-' : $this->view()->escape($val); } $htm .= ' ' . $value . "\n"; } if ($this->hasAdditionalActions()) { $htm .= ' ' . $this->renderAdditionalActions($row) . "\n"; } return $htm . " \n"; } abstract protected function getTitles(); protected function getActionUrl($row) { return false; } public function setConnection(Selectable $connection) { $this->connection = $connection; return $this; } public function hasAdditionalActions() { return method_exists($this, 'renderAdditionalActions'); } protected function connection() { // TODO: Fail if missing? Require connection in constructor? return $this->connection; } protected function renderTitles($row) { $view = $this->view; $htm = "\n \n"; foreach ($row as $title) { $htm .= ' ' . $view->escape($title) . "\n"; } if ($this->hasAdditionalActions()) { $htm .= ' ' . $view->translate('Actions') . "\n"; } return $htm . " \n\n"; } protected function url($url, $params) { return Url::fromPath($url, $params); } public function render() { $data = $this->fetchData(); $htm = '' . "\n" . $this->renderTitles($this->getTitles()) . "\n"; foreach ($data as $row) { $htm .= $this->renderRow($row); } return $htm . "\n
\n"; } protected function view() { if ($this->view === null) { $this->view = Icinga::app()->getViewRenderer()->view; } return $this->view; } public function setView($view) { $this->view = $view; } public function __toString() { return $this->render(); } }