PHP Classes

File: Grid/Source/Zend/Table.php

Recommend this page to a friend!
  Classes of Filipe Sá   Zend Framework Data Grid   Grid/Source/Zend/Table.php   Download  
File: Grid/Source/Zend/Table.php
Role: Class source
Content type: text/plain
Description: Class source
Class: Zend Framework Data Grid
Display and edit data from a database in a grid
Author: By
Last change:
Date: 13 years ago
Size: 10,257 bytes
 

Contents

Class file image Download
<?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 * @author Bento Vilas Boas <geral@petala-azul.com> * @copyright 2010 ZFDatagrid * @license http://www.petala-azul.com/bsd.txt New BSD License * @version $Id$ * @link http://zfdatagrid.com */ class Bvb_Grid_Source_Zend_Table extends Bvb_Grid_Source_Zend_Select { private $_model; /** * * @var array */ protected $_relationMap = array(); /** * Returns current model * * @return Zend_Db_Table */ public function getModel () { return $this->_model; } /** * Returns current relationmap * * @return array */ public function getRelationMap() { return $this->_relationMap; } /** * Builds form input types * * @param array $inputsType Elements input types * * @return array */ public function buildForm ($inputsType = array()) { $info = $this->getModel()->info(); $cols = $info['metadata']; $form = $this->buildFormElements($cols, $info, $inputsType, $this->_relationMap); return $form; } /** * Creating a query using a Model. * * @param Zend_Db_Table_Abstract $model * @param array $relationmap Relation map for joins * * @return $this */ public function __construct (Zend_Db_Table_Abstract $model,array $relationMap = array()) { $this->_model = $model; $this->_relationMap = $relationMap; $info = $model->info(); $select = $model->select(); $map = $info['referenceMap']; $map = array_merge_recursive($map,$this->_relationMap); $this->_relationMap = $map; if ( is_array($map) && count($map) > 0 ) { $select->setIntegrityCheck(false); /** $columnsToRemove = array(); foreach ( $map as $sel ) { if ( is_array($sel['columns']) ) { $columnsToRemove = array_merge($columnsToRemove, $sel['columns']); } else { $columnsToRemove[] = $sel['columns']; } } $columnsMainTable = array_diff($info['cols'], $columnsToRemove);*/ $columnsMainTable = $info['cols']; $select->from($info['name'], $columnsMainTable, $info['schema']); $tAlias = array($info['name'] => 1); $this->_setJoins($info['name'], $map, $select, $tAlias); }else{ $select->from($info['name'], $info['cols'], $info['schema']); } parent::__construct($select); return $this; } private function _setJoins ($tName, array $map, &$select, array &$tAlias = array()) { foreach ( $map as $sel ) { $class = new $sel['refTableClass'](); $info = $class->info(); if ( ! isset($tAlias[$info['name']]) ) { $tAlias[$info['name']] = 0; } $alias = $tAlias[$info['name']] > 0 ? '_' . $tAlias[$info['name']] : null; if ( is_array($sel['columns']) ) { if ( ! is_array($sel['refColumns']) || (count($sel['columns']) != count($sel['refColumns'])) ) { throw new Bvb_Grid_Exception('Mapping of ' . $sel['refTableClass'] . ' is wrong: columns and refColumns must have same type. In case of arrays, they must have same length.'); } if ( ! array_key_exists('refBvbColumns', $sel) ) { $cols = null; } else { if ( ! is_array($sel['refBvbColumns']) ) { $cols = array($sel['columns'][0] => $sel['refBvbColumns']); } else { $cols = $sel['refBvbColumns']; } } $tFields = array_combine($sel['columns'], $sel['refColumns']); $join = null; foreach ( $tFields as $key => $value ) { if ( ! is_null($join) ) { $join .= ' AND '; } $join .= $info['name'] . $alias . '.' . $value . ' = ' . $tName . '.' . $key; } $select->joinLeft(array($info['name'] . $alias => $info['name']), $join, $cols, $info['schema']); $tAlias[$info['name']] ++; } else { if ( is_array($sel['refColumns']) ) { throw new Bvb_Grid_Exception('Mapping of ' . $sel['refTableClass'] . ' is wrong: columns and refColumns must have same type.'); } if ( array_key_exists('refBvbColumns', $sel) ) { if ( is_array($sel['refBvbColumns']) ) { $cols = $sel['refBvbColumns']; } else { $cols = array_combine((array) $sel['columns'], (array) $sel['refBvbColumns']); } } else { $cols = null; } $select->joinLeft(array($info['name'] . $alias => $info['name']), $info['name'] . $alias . '.' . array_shift($info['primary']) . ' = ' . $tName . '.' . $sel['columns'], $cols, $info['schema']); } $tAlias[$info['name']] ++; if ( ! array_key_exists('refBvbFollow', $sel) ) { $sel['refBvbFollow'] = false; } if ( is_array($info['referenceMap']) && count($info['referenceMap']) > 0 && $sel['refBvbFollow'] ) { $this->_setJoins($info['name'], $info['referenceMap'], $select, $tAlias); } } } public function getRecord ($table, array $condition) { if ( $this->_cache['enable'] == 1 ) { $hash = 'Bvb_Grid_Model' . md5($this->buildWhereCondition($condition)); if ( ! $result = $this->_cache['instance']->load($hash) ) { $result = call_user_func_array(array($this->getModel(),'find'), $condition); $this->_cache['instance']->save($result, $hash, array($this->_cache['tag'])); } } else { $result = call_user_func_array(array($this->getModel(),'find'), $condition); } if($result->current() === null) { return array(); } return $result->current()->toArray(); } /** * Executes the current query and returns an associative array of results * * @return array */ public function execute() { $this->_prepareExecute(); if ($this->_cache['enable'] == 1) { $hash = 'Bvb_Grid' . md5($this->_select->__toString()); if (!$result = $this->_cache['instance']->load($hash)) { $result = $this->getModel()->fetchAll($this->_select); $this->_cache['instance']->save($result, $hash, array($this->_cache['tag'])); } } else { $result = $this->getModel()->fetchAll($this->_select); if ($this->_server == 'mysql') { $this->_totalRecords = $this->_select->getAdapter()->fetchOne('select FOUND_ROWS()'); } } return $result; } public function fetchDetail ( array $where) { if ( $this->_cache['enable'] == 1 ) { $hash = 'Bvb_Grid_Model' . md5($this->buildWhereCondition($where)); if ( ! $result = $this->_cache['instance']->load($hash) ) { $result = call_user_func_array(array($this->getModel(),'find'), $where); $this->_cache['instance']->save($result, $hash, array($this->_cache['tag'])); } } else { $result = call_user_func_array(array($this->getModel(),'find'), $where); } if ( $result === null ) { return false; } $result = $result->toArray(); if (isset($result[0]['ZFG_GHOST'])) { unset($result[0]['ZFG_GHOST']); } return $result[0]; } public function delete ($table, array $condition) { if ( $this->_cache['enable'] == 1 ) { $this->_cache['instance']->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array($this->_cache['tag'])); } $result = call_user_func_array(array($this->getModel(),'find'), $condition); if($result->current() === null) { return array(); } $return = $result->current()->delete(); return $return; } public function update ($table, array $post, array $condition) { if ( $this->_cache['enable'] == 1 ) { $this->_cache['instance']->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array($this->_cache['tag'])); } $result = call_user_func_array(array($this->getModel(),'find'), $condition); $return = $result->current()->setFromArray($post)->save(); return $return; } public function insert ($table, array $post) { if ( $this->_cache['enable'] == 1 ) { $this->_cache['instance']->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array($this->_cache['tag'])); } $return = $this->getModel()->createRow($post)->save(); return $return; } /** * Get the primary table key * This is important because we only allow edit, add or remove records * From tables that have on primary key * * @return array */ public function getIdentifierColumns ($table) { $info = $this->_model->info(); $keys = array(); foreach ( $info['primary'] as $pk ) { $keys[] = $info['metadata'][$pk]['TABLE_NAME'] . '.' . $pk; } return $keys; } }