You are here

class FrxCSVDoc in Forena Reports 7.3

Same name and namespace in other branches
  1. 7.4 docformats/FrxCSVDoc.inc \FrxCSVDoc

@file FrxCSVDoc.inc CSV Document export. @author davidmetzler

Hierarchy

Expanded class hierarchy of FrxCSVDoc

1 string reference to 'FrxCSVDoc'
forena_forena_document_types in ./forena.module
Self register document formats with Forena

File

docformats/FrxCSVDoc.inc, line 8
FrxCSVDoc.inc CSV Document export. @author davidmetzler

View source
class FrxCSVDoc extends FrxDocument {
  public function __construct() {
    $this->content_type = 'application/csv';
  }

  /**
   * Fill columns with rowspan tags.
   * @param unknown_type $colspan
   */
  private function fillColumns($colspan) {
    $f = '';
    for ($i = 2; $i <= $colspan; $i++) {
      $f .= ',';
    }
    return $f;
  }
  public function render($r, $format, $options = array()) {
    $doc = $this
      ->check_markup($r->html);
    $dom = new DOMDocument();
    $dom->strictErrorChecking = FALSE;
    $xmlBody = '<?xml version="1.0" encoding="UTF-8"?>' . $doc;
    @$dom
      ->loadHTML($xmlBody);
    $xml = simplexml_import_dom($dom);
    $output = '';
    $rows = array();
    if (!empty($xml)) {
      $rows = $xml
        ->xpath('//tr');
    }
    $rowspans = array();
    if ($rows) {
      foreach ($rows as $row) {
        $c = 0;
        $line = '';
        foreach ($row as $column) {
          $c++;
          if (@$rowspans[$c]) {
            $cont = TRUE;
            while ($rowspans[$c] && $cont) {
              $rowspans[$c]--;
              $output .= ',';
              $c++;
            }
          }
          $value = $column
            ->asXML();
          $value = strip_tags($value);
          $value = decode_entities($value);
          $value = str_replace('"', '""', $value);
          $value = str_replace(array(
            "\n",
          ), '', $value);
          $value = strpos($value, ',') !== FALSE || strpos($value, '"') !== FALSE ? '"' . $value . '",' : "{$value},";
          $line .= $value;

          // Add Column span elements
          if ((int) $column['colspan'] > 1) {
            for ($i = 2; $i <= (int) $column['colspan']; $i++) {
              $c++;
              $line .= ',';
            }
          }

          // Check to see if we have some rowspans that we need to save
          if ((int) $column['rowspan'] > 1) {
            $rowspans[$c] = (int) $column['rowspan'] - 1;
          }
        }

        // Trim off the last comma so we don't put in an extra null column
        $line = substr($line, 0, -1);
        $output .= "{$line}\n";
      }
    }
    return $output;
  }
  public function output($output) {
    parent::output($this
      ->convertCharset($output));
    return TRUE;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
FrxCSVDoc::fillColumns private function Fill columns with rowspan tags.
FrxCSVDoc::output public function Overrides FrxDocument::output
FrxCSVDoc::render public function Overrides FrxDocument::render
FrxCSVDoc::__construct public function
FrxDocument::$charset public property
FrxDocument::$content_type public property
FrxDocument::$format public property
FrxDocument::check_markup public function Wrapper function for check output to default the right type.
FrxDocument::convertCharset public function
FrxDocument::loadCSSFiles public function