Software‎ > ‎

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 &copy; 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();
    }
}
?>


ċ
CPdoDataProvider.php
(4k)
Andrey Sobol,
28 апр. 2010 г., 1:45
Comments