| [ Index ] |
PHP Cross Reference of Limb3 |
[Summary view] [Print] [Text view]
1 <?php 2 /* 3 * Limb PHP Framework 4 * 5 * @link http://limb-project.com 6 * @copyright Copyright © 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 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Tue Oct 14 04:47:40 2008 | Cross-referenced by PHPXref 0.7 |