/** * Render the row * * @param array $columnWidths Width of all columns * @param \Zend\Text\Table\Decorator $decorator Decorator for the row borders * @param integer $padding Padding for the columns * @throws \Zend\Text\Table\Exception\OverflowException When there are too many columns * @return string */ public function render(array $columnWidths, Decorator $decorator, $padding = 0) { // Prepare an array to store all column widths $this->_columnWidths = array(); // If there is no single column, create a column which spans over the // entire row if (count($this->_columns) === 0) { $this->appendColumn(new Column(null, null, count($columnWidths))); } // First we have to render all columns, to get the maximum height $renderedColumns = array(); $maxHeight = 0; $colNum = 0; foreach ($this->_columns as $column) { // Get the colspan of the column $colSpan = $column->getColSpan(); // Verify if there are enough column widths defined if ($colNum + $colSpan > count($columnWidths)) { throw new Exception\OverflowException('Too many columns'); } // Calculate the column width $columnWidth = $colSpan - 1 + array_sum(array_slice($columnWidths, $colNum, $colSpan)); // Render the column and split it's lines into an array $result = explode("\n", $column->render($columnWidth, $padding)); // Store the width of the rendered column $this->_columnWidths[] = $columnWidth; // Store the rendered column and calculate the new max height $renderedColumns[] = $result; $maxHeight = max($maxHeight, count($result)); // Set up the internal column number $colNum += $colSpan; } // If the row doesnt contain enough columns to fill the entire row, fill // it with an empty column if ($colNum < count($columnWidths)) { $remainingWidth = count($columnWidths) - $colNum - 1 + array_sum(array_slice($columnWidths, $colNum)); $renderedColumns[] = array(str_repeat(' ', $remainingWidth)); $this->_columnWidths[] = $remainingWidth; } // Add each single column line to the result $result = ''; for ($line = 0; $line < $maxHeight; $line++) { $result .= $decorator->getVertical(); foreach ($renderedColumns as $renderedColumn) { if (isset($renderedColumn[$line]) === true) { $result .= $renderedColumn[$line]; } else { $result .= str_repeat(' ', strlen($renderedColumn[0])); } $result .= $decorator->getVertical(); } $result .= "\n"; } return $result; }