<?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 geral@petala-azul.com 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$ 
 * @author     Bento Vilas Boas <geral@petala-azul.com > 
 */ 
 
class Bvb_Grid_Source_Csv extends Bvb_Grid_Source_Array 
{ 
    /** 
     * Data source 
     * 
     * @var array 
     */ 
    protected $_dataSource; 
 
    /** 
     * Source columns 
     * 
     * @var type 
     */ 
    protected $_columns; 
 
    /** 
     * Source separator 
     * 
     * @var type 
     */ 
    protected $_separator; 
 
    public function __construct ($dataSource, $columns = null, $separator = ',') 
    { 
        $final = array(); 
 
        if (!is_file($dataSource)) { 
            throw new Bvb_Grid_Exception('Could not find file: ' . $dataSource); 
        } 
 
        if (! is_readable($dataSource)) { 
            throw new Bvb_Grid_Exception('Could not read file: ' . $dataSource); 
        } 
 
        $row = 0; 
        $handle = fopen($dataSource, "r"); 
        while (($data = fgetcsv($handle, 1000, $separator)) !== FALSE) { 
            $num = count($data); 
            if (null !== $columns) { 
                $field = $columns; 
 
                for ($c = 0; $c < $num; $c ++) { 
                    if ($c == 0) { 
                        $final[$row]['_zfgId'] = $row; 
                        $final[$row][$columns[$c]] = $data[$c]; 
                    } else { 
                        $final[$row][$columns[$c]] = $data[$c]; 
                    } 
                } 
            } else { 
                if ($row == 0) { 
                    for ($c = 0; $c < $num; $c ++) { 
                        $field[] = $data[$c]; 
                    } 
                } else { 
                    for ($c = 0; $c < $num; $c ++) { 
                        if ($c == 0) { 
                            $final[$row - 1]['_zfgId'] = $row; 
                            $final[$row - 1][$field[$c]] = $data[$c]; 
                        } else { 
                            $final[$row - 1][$field[$c]] = $data[$c]; 
                        } 
                    } 
                } 
            } 
            $row ++; 
        } 
        fclose($handle); 
 
        $this->_dataSource = $dataSource; 
        $this->_columns = $columns; 
        $this->_separator = $separator; 
 
        if ($this->_columns !== null) { 
            array_unshift($this->_columns, 'zfgId'); 
 
            foreach ($final as $key => $value) { 
                $final[$key] = array_combine($this->_columns, $value); 
            } 
        } else { 
            array_unshift($field, '_zfgId'); 
        } 
 
        $this->_fields = $field; 
        $this->_rawResult = $final; 
        $this->_sourceName = 'csv'; 
 
        unset($field); 
        unset($final); 
 
        return true; 
    } 
 
    /** 
     *Insert an array of key=>values in the specified table 
     * @param string $table 
     * @param array $post 
     */ 
    public function insert ($table, array $post) 
    { 
        $fp = fopen($this->_dataSource, 'a'); 
        $result = "\n" . '"' . implode('"' . $this->_separator . '"', $post) . '"'; 
        fwrite($fp, $result); 
        fclose($fp); 
    } 
 
    /** 
     *Update values in a table using the $condition clause 
     * 
     *The condition clause is a $field=>$value array 
     *that should be escaped by YOU (if your class doesn't do that for you) 
     * and using the AND operand 
     * 
     *Ex: array('user_id'=>'1','id_site'=>'12'); 
     * 
     *Raw SQL: * WHERE user_id='1' AND id_site='12' 
     * 
     * @param string $table 
     * @param array $post 
     * @param array $condition 
     */ 
    public function update ($table, array $post, array $condition) 
    { 
        $filename = $this->_dataSource; 
 
        $filesize = filesize($filename); 
 
        $result = '"' . implode('"' . $this->_separator . '"', $post) . '"'; 
        $file = file($this->_dataSource); 
 
        $position = $condition['_zfgId'] - 1; 
 
        if ($this->_columns === null) { 
            $position ++; 
        } 
        $file[$position] = $result . "\n"; 
 
        file_put_contents($this->_dataSource, implode($file, '')); 
    } 
 
    /** 
     * Delete a record from a table 
     * 
     * The condition clause is a $field=>$value array 
     * that should be escaped by YOU (if your class doesn't do that for you) 
     * and using the AND operand 
     * 
     * Ex: array('user_id'=>'1','id_site'=>'12'); 
     * Raw SQL: * WHERE user_id='1' AND id_site='12' 
     * 
     * @param string $table 
     * @param array $condition 
     */ 
    public function delete ($table, array $condition) 
    { 
        $filename = $this->_dataSource; 
 
        $filesize = filesize($filename); 
 
        $file = file($this->_dataSource); 
        $position = $condition['_zfgId'] - 1; 
        if ($this->_columns === null) { 
            $position ++; 
        } 
        unset($file[$position]); 
        file_put_contents($this->_dataSource, implode($file, '')); 
    } 
 
     /** 
     * Returns record details 
     * 
     * @param string $table 
     * @param array  $condition 
     * 
     * @return mixed 
     */ 
    public function getRecord ($table, array $condition) 
    { 
        $position = $condition['_zfgId']; 
        if ($this->_columns === null) { 
            $position--; 
        } 
 
        return $this->_rawResult[$position]; 
    } 
 
    /** 
     * If this adapter supports crud operations 
     * 
     * @return bool 
     */ 
    public function hasCrud () 
    { 
        return is_writable($this->_dataSource) ? true : false; 
    } 
}
 
 |