[ Index ]

PHP Cross Reference of Limb3

title

Body

[close]

/wact/src/components/iterator/ -> WactBaseIteratorComponent.class.php (source)

   1  <?php
   2  /*
   3   * Limb PHP Framework
   4   *
   5   * @link http://limb-project.com 
   6   * @copyright  Copyright &copy; 2004-2007 BIT(http://bit-creative.com)
   7   * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
   8   */
   9  require_once('limb/wact/src/components/WactClassPath.class.php');
  10  
  11  /**

  12   * abstract class WactBaseIteratorComponent.

  13   *

  14   * @package wact

  15   * @version $Id$

  16   */
  17  abstract class WactBaseIteratorComponent extends WactRuntimeComponent
  18  {
  19    protected $decorators = array();
  20    protected $order_params = array();
  21    protected $targets = array();
  22    protected $navigator_id;
  23    protected $only_first_record;
  24    protected $offset = 0;
  25    protected $limit;
  26  
  27    protected $buffers = array();
  28  
  29    function setOnlyFirstRecord($only_first_record = true)
  30    {
  31      $this->only_first_record = $only_first_record;
  32    }
  33  
  34    function setOffset($offset)
  35    {
  36      $this->offset = $offset;
  37    }
  38  
  39    function setLimit($limit)
  40    {
  41      $this->limit = $limit;
  42    }
  43  
  44    function setNavigator($navigator_id)
  45    {
  46      $this->navigator_id = $navigator_id;
  47    }
  48  
  49    function addDataSetDecorator($class_name, $include_path = '')
  50    {
  51      $this->decorators[$class_name] = array('class_name' => $class_name,
  52                                             'include_path' => $include_path,
  53                                             'params' => array());
  54    }
  55  
  56    function setOrder($order)
  57    {
  58      if(is_array($order))
  59      {
  60        $this->order_params = $order;
  61        return;
  62      }
  63      else
  64        $this->order_params = self :: extractOrderPairsFromString($order);
  65    }
  66  
  67    function addDataSetDecoratorParameter($class_name, $name, $value)
  68    {
  69      $this->decorators[$class_name]['params'][$name] = $value;
  70    }
  71  
  72    function addBuffer($component, $var_name = null)
  73    {
  74      $this->buffers[] = array($component, $var_name);
  75    }
  76  
  77    function process()
  78    {
  79      $dataset = $this->getDataset();
  80  
  81      if(!is_object($dataset))
  82        throw new WactException('Expected a dataset object');
  83  
  84      // process a special case when dataset is not an iterator but some other object

  85      if(!method_exists($dataset, 'count'))
  86      {
  87        $this->_passRecordToBuffer($dataset);
  88        return;
  89      }
  90  
  91      if(is_array($this->order_params) && count($this->order_params) && method_exists($dataset, 'sort'))
  92        $dataset->sort($this->order_params);
  93  
  94      if(($this->offset || $this->limit) && method_exists($dataset, 'paginate'))
  95      {
  96        if(!$this->limit)
  97          $this->limit = $dataset->count();
  98  
  99        $dataset->paginate($this->offset, $this->limit);
 100      }
 101  
 102      if($this->navigator_id)
 103        $this->_applyNavigator($dataset);
 104  
 105      $dataset = $this->_applyDecorators($dataset);
 106  
 107      if($this->only_first_record)
 108        $this->_processForFirstRecord($dataset);
 109      else
 110        $this->_processForFullDataSet($dataset);
 111    }
 112  
 113    abstract function getDataset();
 114  
 115    protected function _processForFirstRecord($dataset)
 116    {
 117      if(method_exists('paginate', $dataset))
 118        $dataset->paginate(0, 1);
 119  
 120      $dataset->rewind();
 121      if($dataset->valid())
 122        $record = $dataset->current();
 123      else
 124        $record = new WactArrayObject();
 125  
 126      $this->_passRecordToBuffer($record);
 127    }
 128  
 129    protected function _passRecordToBuffer($record)
 130    {
 131      foreach($this->buffers as $buffer)
 132      {
 133        list($component, $var_name) = $buffer;
 134  
 135        if($var_name)
 136        {
 137          $component->set($var_name, $record);
 138        }
 139        else
 140        {
 141          if(!method_exists($component, 'registerDatasource'))
 142          {
 143            throw new WactException('Target component does not accept datasource',
 144                                  array('target_component_class' => get_class($component),
 145                                        'target_component_id' => $component->getId()));
 146          }
 147  
 148          $component->registerDatasource($record);
 149        }
 150      }
 151    }
 152  
 153    protected function _processForFullDataSet($dataset)
 154    {
 155      $this->_passDatasetToBuffer($dataset);
 156    }
 157  
 158    protected function _passDatasetToBuffer($dataset)
 159    {
 160      foreach($this->buffers as $buffer)
 161      {
 162        list($component, $var_name) = $buffer;
 163  
 164        if($var_name)
 165        {
 166          $component->set($var_name, $dataset);
 167        }
 168        else
 169        {
 170          if(!method_exists($component, 'registerDataset'))
 171          {
 172            throw new WactException('Target component does not accept dataset',
 173                                  array('target_component_class' => get_class($component),
 174                                        'target_component_id' => $component->getId()));
 175          }
 176  
 177          $component->registerDataset($dataset);
 178        }
 179      }
 180    }
 181  
 182    protected function _applyDecorators($dataset)
 183    {
 184      foreach($this->decorators as $decorator_class => $decorator_info)
 185      {
 186        $class_path = new WactClassPath($decorator_info['class_name'], $decorator_info['include_path']);
 187        $dataset = $class_path->createObject(array($dataset));
 188        $this->_addParamsToDataset($dataset, $decorator_info['params']);
 189      }
 190      return $dataset;
 191    }
 192  
 193    protected function _addParamsToDataset($dataset, $params)
 194    {
 195      foreach($params as $param => $value)
 196      {
 197        $method = WactTemplate :: toStudlyCaps('set_' . $param);
 198        $dataset->$method($value);
 199      }
 200    }
 201  
 202    protected function _applyNavigator($dataset)
 203    {
 204      if(($navigator = $this->_getNavigatorComponent())  && method_exists($dataset, 'paginate'))
 205      {
 206        $navigator->setPagedDataset($dataset);
 207        $dataset->paginate($navigator->getStartingItem(), $navigator->getItemsPerPage());
 208      }
 209    }
 210  
 211    protected function _getNavigatorComponent()
 212    {
 213      if(!$this->navigator_id)
 214        return null;
 215  
 216      if(!$navigator = $this->parent->findChild($this->navigator_id))
 217        throw new WactException('Navigator component not found', array('navigator' => $this->navigator_id));
 218  
 219      return $navigator;
 220    }
 221  
 222    static function extractOrderPairsFromString($order_string)
 223    {
 224      $order_items = explode(',', $order_string);
 225      $order_pairs = array();
 226      foreach($order_items as $order_pair)
 227      {
 228        $arr = explode('=', $order_pair);
 229  
 230        if(isset($arr[1]))
 231        {
 232          if(strtolower($arr[1]) == 'asc' || strtolower($arr[1]) == 'desc'
 233             || strtolower($arr[1]) == 'rand()')
 234            $order_pairs[$arr[0]] = strtoupper($arr[1]);
 235          else
 236            throw new WactException('Wrong order type', array('order' => $arr[1]));
 237        }
 238        else
 239          $order_pairs[$arr[0]] = 'ASC';
 240      }
 241  
 242      return $order_pairs;
 243    }
 244  }
 245  ?>


Generated: Tue Oct 14 04:47:40 2008 Cross-referenced by PHPXref 0.7