Ejemplo n.º 1
0
 /**
  * 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;
 }