CPdoDataProvider for YII framework
This class place data from SELECT result in CDataProvider
<?php
/*
* CPdoDataProvider class file.
*
* @author Sobol Andrey <andrey.sobol.nn@gmail.com>
* @link http://www.asobol.ru/
* @copyright Copyright © 2010 Sobol Andrey
* @version 1.0
* @license GNU 2.0
*
* Use and sample:
* 1. Place unit in protected/components
* 2. In select result first field need primary key field.
* 3. Sample use. This is function from my class.
*
* public function getSqlProvider($aRubricTr){
* $sql= " select distinct _c.customerid from customer _c, customerinfo _ci, rubric _r";
* $sql.=" where get_root_customerid(_ci.customerid)=_c.rootcustomerid";
* $sql.=" and _ci.isactive and _c.isactive";
* $sql.=" and _r.rubricid=_ci.rubricid";
* $sql.=" and _r.tr <@ '$aRubricTr'";
* $sql.=" and _c.parentid IS NULL"; //collect only root customers
*
* $sqlcount="select count(foo.customerid) from (".$sql.") as foo";
*
* if (!$this->_dpCustomerForRubric){
* $this->_dpCustomerForRubric= new CPdoDataProvider(array(
* 'sql'=>$sql,
* 'sqlcount'=>$sqlcount,
* 'pagination'=>array(
* 'pageSize'=>self::PAGE_CUST_SIZE),
* ));
* }
* return $this->_dpCustomerForRubric;
* }
*/
class CPdoDataProvider extends CDataProvider{
private $_sql;
private $_sqlcount;
private $_id;
private static $_pdoCounter=0;
public function __construct($config)
{
$this->_id='ywPdo'.self::$_pdoCounter++;
$config = new CConfiguration($config);
$config->applyTo($this);
}
public function setSql($sql){
$this->_sql=$sql;
}
public function getSql(){
return $this->_sql;
}
public function setSqlCount($sql){
$this->_sqlcount=$sql;
}
public function getSqlCount(){
return $this->_sqlcount;
}
public function getId()
{
$this->_id;
}
public function setId($value)
{
$this->_id=$value;
}
protected function fetchData() {
$cn=Yii::app()->db;
if(($pagination=$this->getPagination())!==false)
{
$pagination->setItemCount($this->getTotalItemCount());
$limit=$pagination->pageSize;
$offset=$pagination->offset;
$cb=$cn->getCommandBuilder();
$sql_pag=$cb->applyLimit($this->_sql, $limit, $offset);
$cmd=$cn->createCommand($sql_pag);
} else
$cmd=$cn->createCommand($this->_sql);
//if(($sort=$this->getSort())!==false)
// $sort->applyOrder($criteria);
return $cmd->queryAll();
}
public function getSort()
{
/*if(($sort=parent::getSort())!==false)
$sort->modelClass=$this->modelClass;
return $sort;*/
return (parent::getSort());
}
protected function fetchKeys() {
$keys=array();
foreach($this->getData() as $i=>$data){
$r=each($data);
$keys[]=$r[1];
}
return $keys;
}
protected function calculateTotalItemCount() {
//calculate total record count for query
if (isset($this->_sqlcount))
$q_cnt=$this->_sqlcount;
else
$q_cnt="select count(foo.*) from ($this->_sql) as foo";
$cn=Yii::app()->db;
$cmd=$cn->createCommand($q_cnt);
return $cmd->queryScalar();
}
}
?>