Public Member Functions | |
__construct ($connection, $table, $fields) | |
getDbSelect () | |
setDbSelect ($select) | |
load ($parentNode=null, $recursionLevel=0) | |
addChildNodes ($children, $path, $parentNode, $level=0) | |
loadNode ($nodeId) | |
getChildren ($node, $recursive=true, $result=array()) | |
move ($node, $newParent, $prevNode=null) | |
loadEnsuredNodes ($category, $rootNode) | |
Public Attributes | |
const | ID_FIELD = 'id' |
const | PATH_FIELD = 'path' |
const | ORDER_FIELD = 'order' |
const | LEVEL_FIELD = 'level' |
Protected Member Functions | |
_addChildNodes ($children, $path, $parentNode, $withChildren=false, $level=0) | |
Protected Attributes | |
$_conn | |
$_table | |
$_loaded = false | |
$_select | |
$_idField | |
$_pathField | |
$_orderField | |
$_levelField |
Definition at line 38 of file Dbp.php.
__construct | ( | $ | connection, | |
$ | table, | |||
$ | fields | |||
) |
Db tree constructor
$fields = array( Varien_Data_Tree_Dbp.ID_FIELD => string, Varien_Data_Tree_Dbp.PATH_FIELD => string, Varien_Data_Tree_Dbp.ORDER_FIELD => string Varien_Data_Tree_Dbp.LEVEL_FIELD => string )
Zend_Db_Adapter_Abstract | $connection | |
string | $table | |
array | $fields |
Definition at line 93 of file Dbp.php.
00094 { 00095 parent::__construct(); 00096 00097 if (!$connection) { 00098 throw new Exception('Wrong "$connection" parametr'); 00099 } 00100 00101 $this->_conn = $connection; 00102 $this->_table = $table; 00103 00104 if (!isset($fields[self::ID_FIELD]) || 00105 !isset($fields[self::PATH_FIELD]) || 00106 !isset($fields[self::LEVEL_FIELD]) || 00107 !isset($fields[self::ORDER_FIELD])) { 00108 00109 throw new Exception('"$fields" tree configuratin array'); 00110 } 00111 00112 $this->_idField = $fields[self::ID_FIELD]; 00113 $this->_pathField = $fields[self::PATH_FIELD]; 00114 $this->_orderField = $fields[self::ORDER_FIELD]; 00115 $this->_levelField = $fields[self::LEVEL_FIELD]; 00116 00117 $this->_select = $this->_conn->select(); 00118 $this->_select->from($this->_table); 00119 }
_addChildNodes | ( | $ | children, | |
$ | path, | |||
$ | parentNode, | |||
$ | withChildren = false , |
|||
$ | level = 0 | |||
) | [protected] |
Definition at line 346 of file Dbp.php.
00347 { 00348 if (isset($children[$path])) { 00349 foreach ($children[$path] as $child) { 00350 $nodeId = isset($child[$this->_idField])?$child[$this->_idField]:false; 00351 if ($parentNode && $nodeId && $node = $parentNode->getChildren()->searchById($nodeId)) { 00352 $node->addData($child); 00353 } else { 00354 $node = new Varien_Data_Tree_Node($child, $this->_idField, $this, $parentNode); 00355 $node->setLevel($node->getData($this->_levelField)); 00356 $node->setPathId($node->getData($this->_pathField)); 00357 $this->addNode($node, $parentNode); 00358 } 00359 00360 if ($withChildren) { 00361 $this->_loaded = false; 00362 $node->loadChildren(1); 00363 $this->_loaded = false; 00364 } 00365 00366 if ($path) { 00367 $childrenPath = explode('/', $path); 00368 } else { 00369 $childrenPath = array(); 00370 } 00371 $childrenPath[] = $node->getId(); 00372 $childrenPath = implode('/', $childrenPath); 00373 00374 $this->_addChildNodes($children, $childrenPath, $node, $withChildren, $level+1); 00375 } 00376 } 00377 }
addChildNodes | ( | $ | children, | |
$ | path, | |||
$ | parentNode, | |||
$ | level = 0 | |||
) |
Definition at line 189 of file Dbp.php.
00190 { 00191 if (isset($children[$path])) { 00192 foreach ($children[$path] as $child) { 00193 $nodeId = isset($child[$this->_idField])?$child[$this->_idField]:false; 00194 if ($parentNode && $nodeId && $node = $parentNode->getChildren()->searchById($nodeId)) { 00195 $node->addData($child); 00196 } else { 00197 $node = new Varien_Data_Tree_Node($child, $this->_idField, $this, $parentNode); 00198 } 00199 00200 //$node->setLevel(count(explode('/', $node->getData($this->_pathField)))-1); 00201 $node->setLevel($node->getData($this->_levelField)); 00202 $node->setPathId($node->getData($this->_pathField)); 00203 $this->addNode($node, $parentNode); 00204 00205 00206 if ($path) { 00207 $childrenPath = explode('/', $path); 00208 } else { 00209 $childrenPath = array(); 00210 } 00211 $childrenPath[] = $node->getId(); 00212 $childrenPath = implode('/', $childrenPath); 00213 00214 $this->addChildNodes($children, $childrenPath, $node, $level+1); 00215 } 00216 } 00217 }
Definition at line 240 of file Dbp.php.
00240 { 00241 if (is_numeric($node)) { 00242 $node = $this->getNodeById($node); 00243 } 00244 if (!$node) 00245 return $result; 00246 00247 foreach ($node->getChildren() as $child) { 00248 if ($recursive) { 00249 if ($child->getChildren()) { 00250 $result = $this->getChildren($child, $recursive, $result); 00251 } 00252 } 00253 $result[] = $child->getId(); 00254 } 00255 return $result; 00256 }
getDbSelect | ( | ) |
load | ( | $ | parentNode = null , |
|
$ | recursionLevel = 0 | |||
) |
Load tree
int|Varien_Data_Tree_Node | $parentNode |
Definition at line 137 of file Dbp.php.
00138 { 00139 if (!$this->_loaded) { 00140 $startLevel = 1; 00141 $parentPath = ''; 00142 00143 if ($parentNode instanceof Varien_Data_Tree_Node) { 00144 $parentPath = $parentNode->getData($this->_pathField); 00145 $startLevel = $parentNode->getData($this->_levelField); 00146 } elseif (is_numeric($parentNode)) { 00147 $parentNode = null; 00148 $select = $this->_conn->select(); 00149 $select->from($this->_table, array($this->_pathField, $this->_levelField))->where("{$this->_idField} = ?", $parentNode); 00150 $parent = $this->_conn->fetchRow($select); 00151 $startLevel = $parent[$this->_levelField]; 00152 $parentPath = $parent[$this->_pathField]; 00153 } elseif (is_string($parentNode)) { 00154 $parentNode = null; 00155 $parentPath = $parentNode; 00156 $startLevel = count(explode($parentPath))-1; 00157 } 00158 00159 $select = clone $this->_select; 00160 $select->order($this->_table.'.'.$this->_orderField . ' ASC'); 00161 00162 if ($parentPath) { 00163 $condition = $this->_conn->quoteInto("$this->_table.$this->_pathField like ?", "$parentPath/%"); 00164 $select->where($condition); 00165 } 00166 if ($recursionLevel != 0) { 00167 $select->where("$this->_levelField <= ?", $startLevel + $recursionLevel); 00168 } 00169 00170 $arrNodes = $this->_conn->fetchAll($select); 00171 00172 $childrenItems = array(); 00173 00174 foreach ($arrNodes as $nodeInfo) { 00175 $pathToParent = explode('/', $nodeInfo[$this->_pathField]); 00176 array_pop($pathToParent); 00177 $pathToParent = implode('/', $pathToParent); 00178 $childrenItems[$pathToParent][] = $nodeInfo; 00179 } 00180 00181 $this->addChildNodes($childrenItems, $parentPath, $parentNode); 00182 00183 $this->_loaded = true; 00184 } 00185 00186 return $this; 00187 }
loadEnsuredNodes | ( | $ | category, | |
$ | rootNode | |||
) |
Definition at line 312 of file Dbp.php.
00313 { 00314 $pathIds = $category->getPathIds(); 00315 $rootNodeId = $rootNode->getId(); 00316 $rootNodePath = $rootNode->getData($this->_pathField); 00317 00318 $select = clone $this->_select; 00319 $select->order($this->_table.'.'.$this->_orderField . ' ASC'); 00320 00321 if ($pathIds) { 00322 $condition = $this->_conn->quoteInto("$this->_table.$this->_idField in (?)", $pathIds); 00323 $select->where($condition); 00324 } 00325 00326 $arrNodes = $this->_conn->fetchAll($select); 00327 00328 if ($arrNodes) { 00329 $childrenItems = array(); 00330 foreach ($arrNodes as $nodeInfo) { 00331 $nodeId = $nodeInfo[$this->_idField]; 00332 if ($nodeId<=$rootNodeId) { 00333 continue; 00334 } 00335 00336 $pathToParent = explode('/', $nodeInfo[$this->_pathField]); 00337 array_pop($pathToParent); 00338 $pathToParent = implode('/', $pathToParent); 00339 $childrenItems[$pathToParent][] = $nodeInfo; 00340 } 00341 00342 $this->_addChildNodes($childrenItems, $rootNodePath, $rootNode, true); 00343 } 00344 }
loadNode | ( | $ | nodeId | ) |
Enter description here...
unknown_type | $nodeId |
Reimplemented from Varien_Data_Tree.
Definition at line 225 of file Dbp.php.
00226 { 00227 $select = clone $this->_select; 00228 if (is_numeric($nodeId)) 00229 $condition = $this->_conn->quoteInto("$this->_table.$this->_idField=?", $nodeId); 00230 else 00231 $condition = $this->_conn->quoteInto("$this->_table.$this->_pathField=?", $nodeId); 00232 00233 $select->where($condition); 00234 00235 $node = new Varien_Data_Tree_Node($this->_conn->fetchRow($select), $this->_idField, $this); 00236 $this->addNode($node); 00237 return $node; 00238 }
move | ( | $ | node, | |
$ | newParent, | |||
$ | prevNode = null | |||
) |
Move tree node
Varien_Data_Tree_Node | $node | |
Varien_Data_Tree_Node | $newParent | |
Varien_Data_Tree_Node | $prevNode |
Reimplemented in Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Tree.
Definition at line 265 of file Dbp.php.
00266 { 00267 $position = 1; 00268 00269 $oldPath = $node->getData($this->_pathField); 00270 $newPath = $newParent->getData($this->_pathField); 00271 00272 $newPath = $newPath . '/' . $node->getId(); 00273 $oldPathLength = strlen($oldPath); 00274 00275 $newLevel = $newParent->getLevel()+1; 00276 $levelDisposition = $newLevel-$node->getLevel(); 00277 00278 $data = array( 00279 $this->_levelField => new Zend_Db_Expr("{$this->_levelField} + '{$levelDisposition}'"), 00280 $this->_pathField => new Zend_Db_Expr("CONCAT('$newPath', RIGHT($this->_pathField, LENGTH($this->_pathField) - {$oldPathLength}))") 00281 ); 00282 $condition = $this->_conn->quoteInto("$this->_pathField REGEXP ?", "^$oldPath(/|$)"); 00283 00284 $this->_conn->beginTransaction(); 00285 00286 $reorderData = array($this->_orderField => new Zend_Db_Expr("$this->_orderField + 1")); 00287 try { 00288 if ($prevNode && $prevNode->getId()) { 00289 $reorderCondition = "{$this->_orderField} > {$prevNode->getData($this->_orderField)}"; 00290 $position = $prevNode->getData($this->_orderField) + 1; 00291 } else { 00292 $reorderCondition = $this->_conn->quoteInto("{$this->_pathField} REGEXP ?", "^{$newParent->getData($this->_pathField)}/[0-9]+$"); 00293 $select = $this->_conn->select() 00294 ->from($this->_table, new Zend_Db_Expr("MIN({$this->_orderField})")) 00295 ->where($reorderCondition); 00296 00297 $position = (int) $this->_conn->fetchOne($select); 00298 } 00299 $this->_conn->update($this->_table, $reorderData, $reorderCondition); 00300 $this->_conn->update($this->_table, $data, $condition); 00301 $this->_conn->update($this->_table, array($this->_orderField => $position, $this->_levelField=>$newLevel), 00302 $this->_conn->quoteInto("{$this->_idField} = ?", $node->getId()) 00303 ); 00304 00305 $this->_conn->commit(); 00306 } catch (Exception $e){ 00307 $this->_conn->rollBack(); 00308 throw new Exception("Can't move tree node due to error: " . $e->getMessage()); 00309 } 00310 }
setDbSelect | ( | $ | select | ) |
const LEVEL_FIELD = 'level' |
const ORDER_FIELD = 'order' |
const PATH_FIELD = 'path' |