<?php
 
 
/**
 
 *
 
 * LICENSE
 
 *
 
 * This source file is subject to the new BSD license
 
 * It is  available through the world-wide-web at this URL:
 
 * http://www.petala-azul.com/bsd.txt
 
 * If you did not receive a copy of the license and are unable to
 
 * obtain it through the world-wide-web, please send an email
 
 * to [email protected] so we can send you a copy immediately.
 
 *
 
 * @package    Bvb_Grid
 
 * @copyright  Copyright (c)  (http://www.petala-azul.com)
 
 * @license    http://www.petala-azul.com/bsd.txt   New BSD License
 
 * @version    $Id: Csv.php 1011 2010-03-17 16:18:51Z [email protected] $
 
 * @author     Bento Vilas Boas <[email protected] >
 
 */
 
 
class Bvb_Grid_Deploy_Csv extends Bvb_Grid implements Bvb_Grid_Deploy_Interface
 
{
 
 
    protected $dir;
 
 
    const OUTPUT = 'csv';
 
 
    public $deploy;
 
 
    /**
 
     * Set true if data should be downloaded
 
     */
 
    protected $downloadData = null;
 
 
    /**
 
     * Set true if data should be stored
 
     */
 
    protected $storeData = null;
 
 
    /**
 
     * Storing file
 
     */
 
    protected $outFile = null;
 
 
    /*
 
     *
 
     *
 
     * Optimize performance by setting best value for $this->setPagination(?);
 
     * and setting options:
 
     * set_time_limit
 
     * memory_limit
 
     * download: send data to directly to user
 
     * save: save the file
 
     * ?dir:
 
     *
 
     * @param array $data
 
     */
 
    function __construct ($options)
 
    {
 
        $this->setPagination(500);
 
 
        parent::__construct($options);
 
    }
 
 
    /**
 
     * [Para podemros utiliza]
 
     *
 
     * @param string $var
 
     * @param string $value
 
     */
 
 
    function __set ($var, $value)
 
    {
 
 
        parent::__set($var, $value);
 
    }
 
 
    function buildTitltesCsv ($titles)
 
    {
 
 
        $grid = '';
 
        foreach ($titles as $title) {
 
 
            $grid .= '"' . strip_tags($title['value']) . '",';
 
        }
 
 
        return substr($grid, 0, - 1) . "\n";
 
 
    }
 
 
    function buildSqlexpCsv ($sql)
 
    {
 
 
        $grid = '';
 
        if (is_array($sql)) {
 
 
            foreach ($sql as $exp) {
 
                $grid .= '"' . strip_tags($exp['value']) . '",';
 
            }
 
        }
 
 
        return substr($grid, 0, - 1) . " \n";
 
 
    }
 
 
    function buildGridCsv ($grids)
 
    {
 
 
        $grid = '';
 
        foreach ($grids as $value) {
 
 
            foreach ($value as $final) {
 
                $grid .= '"' . strip_tags($final['value']) . '",';
 
            }
 
 
            $grid = substr($grid, 0, - 1) . " \n";
 
        }
 
 
        return $grid;
 
 
    }
 
 
    /**
 
     * Depending on settings store to file and/or directly upload
 
     */
 
    protected function csvAddData ($data)
 
    {
 
        if ($this->downloadData) {
 
            // send first headers
 
            echo $data;
 
            flush();
 
            ob_flush();
 
        }
 
        if ($this->storeData) {
 
            // open file handler
 
            fwrite($this->outFile, $data);
 
        }
 
    }
 
    function deploy ()
 
    {
 
        if (! in_array(self::OUTPUT, $this->_export)) {
 
            echo $this->__("You dont' have permission to export the results to this format");
 
            die();
 
        }
 
        $this->deploy['dir'] = rtrim($this->deploy['dir'], '/') . '/';
 
        // apply options
 
        if (isset($this->deploy['set_time_limit'])) {
 
            // script needs time to proces huge amount of data (important)
 
            set_time_limit($this->deploy['set_time_limit']);
 
        }
 
        if (isset($this->deploy['memory_limit'])) {
 
            // adjust memory_limit if needed (not very important)
 
            ini_set('memory_limit', $this->deploy['memory_limit']);
 
        }
 
 
        if (empty($this->deploy['name'])) {
 
            $this->deploy['name'] = date('H_m_d_H_i_s');
 
        }
 
 
        if (substr($this->deploy['name'], - 4) == '.csv') {
 
            $this->deploy['name'] = substr($this->deploy['name'], 0, - 4);
 
        }
 
 
 
 
        // decide if we should store data to file or send directly to user
 
        $this->downloadData = $this->deploy['download'] == 1 ? 1 : false;
 
        $this->storeData = $this->deploy['save'] == 1 ? 1 : false;
 
 
        // prepare data
 
        parent::deploy();
 
 
 
        if ($this->downloadData) {
 
            // send first headers
 
            header('Content-type: text/plain; charset=' . $this->getCharEncoding());
 
            header('Content-Disposition: attachment; filename="' .$this->deploy['name'] . '.csv"');
 
        }
 
        if ($this->storeData) {
 
            // open file handler
 
            $this->outFile = fopen($this->deploy['dir']. $this->deploy['name']. ".csv", "w");
 
        }
 
 
        // export header
 
        $this->csvAddData(self::buildTitltesCsv(parent::_buildTitles()));
 
        $i = 0;
 
        do {
 
            $i += $this->_pagination;
 
            $this->csvAddData(self::buildGridCsv(parent::_buildGrid()));
 
            $this->csvAddData(self::buildSqlexpCsv(parent::_buildSqlExp()));
 
            // get next data
 
            $this->getSource()->buildQueryLimit($this->_pagination, $i);
 
            $this->_result = $this->getSource()->execute();
 
        } while (count($this->_result));
 
 
        if ($this->storeData) {
 
            // close file handler
 
            fclose($this->outFile);
 
        } else {
 
            die();
 
        }
 
 
        die();
 
        return true;
 
    }
 
 
}
 
 
 |