
Public Member Functions | |
| __construct ($connection, $table, $fields) | |
| getDbSelect () | |
| setDbSelect ($select) | |
| load ($parentNode=null, $recursionLevel=100) | |
| loadNode ($nodeId) | |
| appendChild ($data=array(), $parentNode, $prevNode=null) | |
| moveNodeTo ($node, $parentNode, $prevNode=null) | |
| removeNode ($node) | |
Public Attributes | |
| const | ID_FIELD = 'id' |
| const | PARENT_FIELD = 'parent' |
| const | LEVEL_FIELD = 'level' |
| const | ORDER_FIELD = 'order' |
Protected Member Functions | |
| _updateChildLevels ($parentId, $parentLevel) | |
| _loadFullTree () | |
Protected Attributes | |
| $_conn | |
| $_table | |
| $_select | |
| $_idField | |
| $_parentField | |
| $_levelField | |
| $_orderField | |
Definition at line 37 of file Db.php.
| __construct | ( | $ | connection, | |
| $ | table, | |||
| $ | fields | |||
| ) |
Db tree constructor
$fields = array( Varien_Data_Tree_Db.ID_FIELD => string, Varien_Data_Tree_Db.PARENT_FIELD => string, Varien_Data_Tree_Db.LEVEL_FIELD => string Varien_Data_Tree_Db.ORDER_FIELD => string )
| Zend_Db_Adapter_Abstract | $connection | |
| string | $table | |
| array | $fields |
Definition at line 89 of file Db.php.
00090 { 00091 parent::__construct(); 00092 00093 if (!$connection) { 00094 throw new Exception('Wrong "$connection" parametr'); 00095 } 00096 00097 $this->_conn = $connection; 00098 $this->_table = $table; 00099 00100 if (!isset($fields[self::ID_FIELD]) || 00101 !isset($fields[self::PARENT_FIELD]) || 00102 !isset($fields[self::LEVEL_FIELD]) || 00103 !isset($fields[self::ORDER_FIELD])) { 00104 00105 throw new Exception('"$fields" tree configuratin array'); 00106 } 00107 00108 $this->_idField = $fields[self::ID_FIELD]; 00109 $this->_parentField = $fields[self::PARENT_FIELD]; 00110 $this->_levelField = $fields[self::LEVEL_FIELD]; 00111 $this->_orderField = $fields[self::ORDER_FIELD]; 00112 00113 $this->_select = $this->_conn->select(); 00114 $this->_select->from($this->_table, array_values($fields)); 00115 }
| _loadFullTree | ( | ) | [protected] |
Definition at line 264 of file Db.php.
00265 { 00266 $select = clone $this->_select; 00267 $select->order($this->_table . '.' . $this->_levelField) 00268 ->order($this->_table.'.'.$this->_orderField); 00269 00270 $arrNodes = $this->_conn->fetchAll($select); 00271 00272 foreach ($arrNodes as $nodeInfo) { 00273 $node = new Varien_Data_Tree_Node($nodeInfo, $this->_idField, $this); 00274 $parentNode = $this->getNodeById($nodeInfo[$this->_parentField]); 00275 $this->addNode($node, $parentNode); 00276 } 00277 00278 return $this; 00279 }
| _updateChildLevels | ( | $ | parentId, | |
| $ | parentLevel | |||
| ) | [protected] |
Definition at line 246 of file Db.php.
00247 { 00248 $select = $this->_conn->select() 00249 ->from($this->_table, $this->_idField) 00250 ->where($this->_parentField.'=?', $parentId); 00251 $ids = $this->_conn->fetchCol($select); 00252 00253 if (!empty($ids)) { 00254 $this->_conn->update($this->_table, 00255 array($this->_levelField=>$parentLevel+1), 00256 $this->_conn->quoteInto($this->_idField.' IN (?)', $ids)); 00257 foreach ($ids as $id) { 00258 $this->_updateChildLevels($id, $parentLevel+1); 00259 } 00260 } 00261 return $this; 00262 }
| appendChild | ( | $ | data = array(), |
|
| $ | parentNode, | |||
| $ | prevNode = null | |||
| ) |
Enter description here...
| array|Varien_Data_Tree_Node | $data | |
| Varien_Data_Tree_Node | $parentNode | |
| Varien_Data_Tree_Node | $prevNode |
Reimplemented from Varien_Data_Tree.
Definition at line 177 of file Db.php.
00178 { 00179 $orderSelect = $this->_conn->select(); 00180 $orderSelect->from($this->_table, new Zend_Db_Expr('MAX('.$this->_conn->quoteIdentifier($this->_orderField).')')) 00181 ->where($this->_conn->quoteIdentifier($this->_parentField).'='.$parentNode->getId()); 00182 00183 $order = $this->_conn->fetchOne($orderSelect); 00184 $data[$this->_parentField] = $parentNode->getId(); 00185 $data[$this->_levelField] = $parentNode->getData($this->_levelField)+1; 00186 $data[$this->_orderField] = $order+1; 00187 00188 $this->_conn->insert($this->_table, $data); 00189 $data[$this->_idField] = $this->_conn->lastInsertId(); 00190 00191 return parent::appendChild($data, $parentNode, $prevNode); 00192 }
| load | ( | $ | parentNode = null, |
|
| $ | recursionLevel = 100 | |||
| ) |
Load tree
| int | || Varien_Data_Tree_Node $parentNode | |
| int | $recursionLevel recursion level |
Definition at line 134 of file Db.php.
00135 { 00136 if (is_null($parentNode)) { 00137 $this->_loadFullTree(); 00138 return $this; 00139 } 00140 elseif ($parentNode instanceof Varien_Data_Tree_Node) { 00141 $parentId = $parentNode->getId(); 00142 } 00143 elseif (is_numeric($parentNode)) { 00144 $parentId = $parentNode; 00145 $parentNode = null; 00146 } 00147 else { 00148 throw new Exception('root node id is not defined'); 00149 } 00150 00151 $select = clone $this->_select; 00152 $select->order($this->_table.'.'.$this->_orderField . ' ASC'); 00153 $condition = $this->_conn->quoteInto("$this->_table.$this->_parentField=?", $parentId); 00154 $select->where($condition); 00155 $arrNodes = $this->_conn->fetchAll($select); 00156 foreach ($arrNodes as $nodeInfo) { 00157 $node = new Varien_Data_Tree_Node($nodeInfo, $this->_idField, $this, $parentNode); 00158 $this->addNode($node, $parentNode); 00159 00160 if ($recursionLevel) { 00161 $node->loadChildren($recursionLevel-1); 00162 } 00163 } 00164 return $this; 00165 }
| loadNode | ( | $ | nodeId | ) |
Enter description here...
| unknown_type | $nodeId |
Reimplemented from Varien_Data_Tree.
Definition at line 167 of file Db.php.
00168 { 00169 $select = clone $this->_select; 00170 $condition = $this->_conn->quoteInto("$this->_table.$this->_idField=?", $nodeId); 00171 $select->where($condition); 00172 $node = new Varien_Data_Tree_Node($this->_conn->fetchRow($select), $this->_idField, $this); 00173 $this->addNode($node); 00174 return $node; 00175 }
| moveNodeTo | ( | $ | node, | |
| $ | parentNode, | |||
| $ | prevNode = null | |||
| ) |
Move tree node
| Varien_Data_Tree_Node | $node | |
| Varien_Data_Tree_Node | $parentNode | |
| Varien_Data_Tree_Node | $prevNode |
Reimplemented from Varien_Data_Tree.
Definition at line 201 of file Db.php.
00202 { 00203 $data = array(); 00204 $data[$this->_parentField] = $parentNode->getId(); 00205 $data[$this->_levelField] = $parentNode->getData($this->_levelField)+1; 00206 // New node order 00207 if (is_null($prevNode) || is_null($prevNode->getData($this->_orderField))) { 00208 $data[$this->_orderField] = 1; 00209 } 00210 else { 00211 $data[$this->_orderField] = $prevNode->getData($this->_orderField)+1; 00212 } 00213 $condition = $this->_conn->quoteInto("$this->_idField=?", $node->getId()); 00214 00215 // For reorder new node branch 00216 $dataReorderNew = array( 00217 $this->_orderField => new Zend_Db_Expr($this->_conn->quoteIdentifier($this->_orderField).'+1') 00218 ); 00219 $conditionReorderNew = $this->_conn->quoteIdentifier($this->_parentField).'='.$parentNode->getId(). 00220 ' AND '.$this->_conn->quoteIdentifier($this->_orderField).'>='. $data[$this->_orderField]; 00221 00222 // For reorder old node branch 00223 $dataReorderOld = array( 00224 $this->_orderField => new Zend_Db_Expr($this->_conn->quoteIdentifier($this->_orderField).'-1') 00225 ); 00226 $conditionReorderOld = $this->_conn->quoteIdentifier($this->_parentField).'='.$node->getData($this->_parentField). 00227 ' AND '.$this->_conn->quoteIdentifier($this->_orderField).'>'.$node->getData($this->_orderField); 00228 00229 $this->_conn->beginTransaction(); 00230 try { 00231 // Prepare new node branch 00232 $this->_conn->update($this->_table, $dataReorderNew, $conditionReorderNew); 00233 // Move node 00234 $this->_conn->update($this->_table, $data, $condition); 00235 // Update old node branch 00236 $this->_conn->update($this->_table, $dataReorderOld, $conditionReorderOld); 00237 $this->_updateChildLevels($node->getId(), $data[$this->_levelField]); 00238 $this->_conn->commit(); 00239 } 00240 catch (Exception $e){ 00241 $this->_conn->rollBack(); 00242 throw new Exception('Can\'t move tree node'); 00243 } 00244 }
| removeNode | ( | $ | node | ) |
Enter description here...
| Varien_Data_Tree_Node | $node |
Reimplemented from Varien_Data_Tree.
Definition at line 281 of file Db.php.
00282 { 00283 // For reorder old node branch 00284 $dataReorderOld = array( 00285 $this->_orderField => new Zend_Db_Expr($this->_conn->quoteIdentifier($this->_orderField).'-1') 00286 ); 00287 $conditionReorderOld = $this->_conn->quoteIdentifier($this->_parentField).'='.$node->getData($this->_parentField). 00288 ' AND '.$this->_conn->quoteIdentifier($this->_orderField).'>'.$node->getData($this->_orderField); 00289 00290 $this->_conn->beginTransaction(); 00291 try { 00292 $condition = $this->_conn->quoteInto("$this->_idField=?", $node->getId()); 00293 $this->_conn->delete($this->_table, $condition); 00294 // Update old node branch 00295 $this->_conn->update($this->_table, $dataReorderOld, $conditionReorderOld); 00296 $this->_conn->commit(); 00297 } 00298 catch (Exception $e){ 00299 $this->_conn->rollBack(); 00300 throw new Exception('Can\'t remove tree node'); 00301 } 00302 parent::removeNode($node); 00303 return $this; 00304 }
| setDbSelect | ( | $ | select | ) |
| const LEVEL_FIELD = 'level' |
| const ORDER_FIELD = 'order' |
| const PARENT_FIELD = 'parent' |
1.5.8