You are here

class CSV in Forena Reports 8

Provides CSV file exports

Plugin annotation


@FrxDocument(
  id= "csv",
  name="Comma Separated Values",
  ext="csv"
)

Hierarchy

Expanded class hierarchy of CSV

File

src/FrxPlugin/Document/CSV.php, line 18
Implements \Drupal\forena\FrxPlugin\Document\CSV

Namespace

Drupal\forena\FrxPlugin\Document
View source
class CSV extends DocumentBase {
  public function __construct() {
    $this->content_type = 'application/csv';
  }
  public function flush() {
    $doc = $this->write_buffer;
    $dom = new \DOMDocument();
    $dom->strictErrorChecking = FALSE;
    $xmlBody = '<?xml version="1.0" encoding="UTF-8"?>' . $doc;
    libxml_use_internal_errors(TRUE);
    @$dom
      ->loadHTML($xmlBody);
    libxml_clear_errors();

    /** @var \SimpleXMLElement $xml */
    $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 = '';

        /** @var \SimpleXMLElement $column */
        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 = html_entity_decode($value, ENT_QUOTES, 'UTF-8');
          $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;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
CSV::flush public function Write the output to disk. Overrides DocumentBase::flush
CSV::__construct public function
DocumentBase::$buffer public property
DocumentBase::$charset public property
DocumentBase::$commands protected property
DocumentBase::$content_type public property
DocumentBase::$filename protected property
DocumentBase::$file_name public property
DocumentBase::$format public property
DocumentBase::$headers public property
DocumentBase::$libraries public property
DocumentBase::$parameters_form public property
DocumentBase::$skin protected property
DocumentBase::$skin_name protected property
DocumentBase::$title public property
DocumentBase::$write_buffer protected property
DocumentBase::addAjaxCommand public function
DocumentBase::check_markup public function Wrapper function for check output to default the right type.
DocumentBase::clear public function Clear the buffer Overrides DocumentInterface::clear
DocumentBase::convertCharset public function Perform character set conversion
DocumentBase::footer public function No default footer. Overrides DocumentInterface::footer 1
DocumentBase::getAjaxCommands public function
DocumentBase::header public function Default implementation to put in content type based headers. Overrides DocumentInterface::header 8
DocumentBase::setFilename public function Overrides DocumentInterface::setFilename
DocumentBase::setSkin public function Overrides DocumentInterface::setSkin
DocumentBase::write public function Write Overrides DocumentInterface::write
FrxAPI::app public function Returns containing application service
FrxAPI::currentDataContext public function Get the current data context.
FrxAPI::currentDataContextArray public function
FrxAPI::dataManager public function Returns the data manager service
FrxAPI::dataService public function Return Data Service
FrxAPI::documentManager public function Returns the fornea document manager
FrxAPI::error public function Report an error
FrxAPI::getDataContext public function Get the context of a specific id.
FrxAPI::getDocument public function Get the current document
FrxAPI::getReportFileContents public function Load the contents of a file in the report file system.
FrxAPI::innerXML function Enter description here... 1
FrxAPI::popData public function Pop data off of the stack.
FrxAPI::pushData public function Push data onto the Stack
FrxAPI::report public function Run a report with a particular format. 1
FrxAPI::reportFileSystem public function Get the current report file system.
FrxAPI::setDataContext public function Set Data context by id.
FrxAPI::setDocument public function Change to a specific document type.
FrxAPI::skins public function Get list of skins.