<?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: Array.php 822 2010-03-03 15:43:07Z [email protected] $
 
 * @author     Bento Vilas Boas <[email protected] >
 
 */
 
 
 
class Bvb_Grid_Source_Array implements Bvb_Grid_Source_Interface
 
{
 
 
    protected $_fields;
 
 
    protected $_rawResult;
 
 
    protected $_offset;
 
 
    protected $_start;
 
 
    protected $_totalRecords = 0;
 
 
    protected $_sourceName;
 
 
    protected $_cache;
 
 
 
    function __construct (array $array, $titles = null)
 
    {
 
        if ( $titles === null || count($titles) != count($array[0]) ) {
 
            $this->_fields = array_keys($array[0]);
 
        } else {
 
            $this->_fields = $titles;
 
            foreach ( $array as $key => $value ) {
 
                $array[$key] = array_combine($titles, $value);
 
            }
 
        }
 
 
 
        $this->_rawResult = $array;
 
        $this->_sourceName = 'array';
 
    }
 
 
 
    function resetOrder ()
 
    {
 
        return true;
 
    }
 
 
 
    function getSourceName ()
 
    {
 
        return $this->_sourceName;
 
    }
 
 
 
    function hasCrud ()
 
    {
 
        return false;
 
    }
 
 
 
    function buildFields ()
 
    {
 
        $fields = $this->_fields;
 
 
        $final = array();
 
 
        foreach ( $fields as $value ) {
 
 
 
            if ( $value == '_zfgId' ) {
 
                $final[$value] = array('title' => ucfirst(str_replace('_', ' ', $value)), 'field' => $value, 'remove' => 1);
 
            } else {
 
                $final[$value] = array('title' => ucfirst(str_replace('_', ' ', $value)), 'field' => $value);
 
            }
 
 
        }
 
 
        return $final;
 
    }
 
 
 
    function buildQueryLimit ($offset, $start)
 
    {
 
        $this->_offset = $offset;
 
        $this->_start = $start;
 
        return true;
 
    }
 
 
 
    function addCondition ($filter, $op, $completeField)
 
    {
 
        $explode = explode('.', $completeField['field']);
 
        $field = end($explode);
 
 
        foreach ( $this->_rawResult as $key => $result ) {
 
 
            foreach ( $result as $fieldKey => $fieldValue ) {
 
                if ( strlen($filter) > 0 && $fieldKey == $field ) {
 
                    if ( ! $this->_applySearchType($fieldValue, $filter, $op) ) {
 
                        unset($this->_rawResult[$key]);
 
                    }
 
                }
 
            }
 
        }
 
 
        return true;
 
    }
 
 
 
    /**
 
     * Apply the search to a give field when the adaptar is an array
 
     */
 
    protected function _applySearchType ($final, $filtro, $op)
 
    {
 
 
        switch ($op) {
 
            case 'equal':
 
            case '=':
 
                if ( $filtro == $final ) return true;
 
                break;
 
            case 'REGEXP':
 
                if ( preg_match($filtro, $final) ) return true;
 
                break;
 
            case 'rlike':
 
                if ( substr($final, 0, strlen($filtro)) == $filtro ) return true;
 
                break;
 
            case 'llike':
 
                if ( substr($final, - strlen($filtro)) == $filtro ) return true;
 
                break;
 
            case '>=':
 
                if ( $final >= $filtro ) return true;
 
                break;
 
            case '>':
 
                if ( $final > $filtro ) return true;
 
                break;
 
            case '<>':
 
            case '!=':
 
                if ( $final != $filtro ) return true;
 
                break;
 
            case '<=':
 
                if ( $final <= $filtro ) return true;
 
                break;
 
            case '<':
 
                if ( $final < $filtro ) return true;
 
                break;
 
            default:
 
                $enc = stripos((string) $final, $filtro);
 
                if ( $enc !== false ) {
 
                    return true;
 
                }
 
                break;
 
        }
 
 
        return false;
 
 
    }
 
 
 
    function getSelectOrder ()
 
    {
 
        return array();
 
    }
 
 
 
    function getDescribeTable ()
 
    {
 
        return false;
 
    }
 
 
 
    function getFilterValuesBasedOnFieldDefinition ($field)
 
    {
 
        return 'text';
 
    }
 
 
 
    function getTotalRecords ()
 
    {
 
        return $this->_totalRecords;
 
    }
 
 
 
    function execute ()
 
    {
 
        $this->_totalRecords = count($this->_rawResult);
 
 
 
        if ( $this->_offset == 0 ) {
 
            return array_slice($this->_rawResult, $this->_start);
 
        }
 
 
 
        return array_slice($this->_rawResult, $this->_start, $this->_offset);
 
 
    }
 
 
 
    function getMainTable ()
 
    {
 
        return true;
 
    }
 
 
 
    function getTableList ()
 
    {
 
        return array();
 
    }
 
 
 
    function buildQueryOrder ($field, $order, $reset = false)
 
    {
 
 
        if ( strtolower($order) == 'desc' ) {
 
            $sort = SORT_DESC;
 
        } else {
 
            $sort = SORT_ASC;
 
        }
 
 
        // Obtain a list of columns
 
        foreach ( $this->_rawResult as $key => $row ) {
 
            $result[$key] = $row[$field];
 
        }
 
 
        array_multisort($result, $sort, $this->_rawResult);
 
 
        unset($result);
 
    }
 
 
 
    protected function _object2array ($data)
 
    {
 
 
        if ( ! is_object($data) && ! is_array($data) ) return $data;
 
 
        if ( is_object($data) ) $data = get_object_vars($data);
 
 
        return array_map(array($this, '_object2array'), $data);
 
 
    }
 
 
 
    function getSqlExp (array $value)
 
    {
 
        if ( is_array($value['functions']) ) {
 
 
            $i = 0;
 
            foreach ( $value['functions'] as $final ) {
 
 
                if ( $i == 0 ) {
 
                    $valor = $this->_applySqlExpToArray($value['value'], $final);
 
                } else {
 
                    $valor = $this->_applySqlExpToArray($value['value'], $final, $valor);
 
                }
 
 
                $i ++;
 
            }
 
 
        } else {
 
            $valor = $this->_applySqlExpToArray($valor['value'], $value['functions']);
 
        }
 
 
        return $valor;
 
    }
 
 
 
    /**
 
     * Applies the SQL EXP options to an array
 
     * @param $field
 
     * @param $operation
 
     * @param $option
 
     */
 
    protected function _applySqlExpToArray ($field, $operation, $value = null)
 
    {
 
        $field = trim($field);
 
 
        if ( null === $value ) {
 
            foreach ( $this->_rawResult as $value ) {
 
                $array[] = $value[$field];
 
            }
 
        } else {
 
            $array = array($value);
 
        }
 
 
        $operation = trim(strtolower($operation));
 
 
        switch ($operation) {
 
            case 'product':
 
                return array_product($array);
 
                break;
 
            case 'sum':
 
                return array_sum($array);
 
                break;
 
            case 'count':
 
                return count($array);
 
                break;
 
            case 'min':
 
                sort($array);
 
                return array_shift($array);
 
                break;
 
            case 'max':
 
                sort($array);
 
                return array_pop($array);
 
                break;
 
            case 'avg':
 
                return round(array_sum($array) / count($array));
 
                break;
 
            default:
 
                throw new Bvb_Grid_Exception('Operation not found');
 
                break;
 
        }
 
    }
 
 
 
    function getDistinctValuesForFilters ($field, $fieldValue)
 
    {
 
 
        $filter = array();
 
        foreach ( $this->_rawResult as $value ) {
 
            $filter[$value[$field]] = $value[$fieldValue];
 
        }
 
 
        return array_unique($filter);
 
    }
 
 
 
    function fetchDetail (array $where)
 
    {
 
 
    }
 
 
 
    function getFieldType ($field)
 
    {
 
 
    }
 
 
 
    function getSelectObject ()
 
    {
 
 
    }
 
 
 
    function addFullTextSearch ($filter, $field)
 
    {
 
 
    }
 
 
 
    function getRecord ($table, array $condition)
 
    {
 
 
    }
 
 
 
    function insert ($table, array $post)
 
    {
 
 
    }
 
 
 
    function update ($table, array $post, array $condition)
 
    {
 
 
    }
 
 
 
    function delete ($table, array $condition)
 
    {
 
 
    }
 
 
 
    function setCache ($cache)
 
    {
 
        if ( ! is_array($cache) ) {
 
            $cache = array('use' => 0);
 
        }
 
 
        $this->_cache = $cache;
 
    }
 
 
 
    function buildForm ()
 
    {
 
 
        $form = array();
 
 
        foreach ($this->_fields as $elements)
 
        {
 
            if($elements =='_zfgId')
 
            continue;
 
 
            $label = ucwords(str_replace('_', ' ', $elements));
 
            $form['elements'][$elements] = array('text', array( 'size' => 10, 'label' => $label));
 
        }
 
 
 
        return $form;
 
    }
 
 
 
    function getPrimaryKey ($table)
 
    {
 
        if ( in_array('_zfgId', $this->_fields) ) {
 
            return array('_zfgId');
 
        }
 
        return false;
 
    }
 
 
}
 
 |