Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- function generateData ($size, $depth, $parent) {
- $result = array();
- for ($i = 0; $i < $size; $i++) {
- $elem = new Elem;
- $elem->setData ($parent ? $parent->getData() . '.' . ($i+1) : '#'.($i+1));
- $elem->setChildren ($depth ? generateData($size, $depth-1, $elem) : array());
- $elem->setParent ($parent);
- $result[] = $elem;
- }
- return $result;
- }
- function insertTreeRecursive ($tree) {
- $qElem = "INSERT INTO `Elements` (`ID`, `Data`) VALUES (NULL, '%s')";
- $qHier = "INSERT INTO `ElementsHierarchy`(`ElemID`,`ParentID`,`Level`) VALUES (%s)";
- $qParents = "SELECT * FROM `ElementsHierarchy` WHERE `ElemID` = '%d'";
- foreach ($tree as $elem) {
- $query = sprintf($qElem, Db::escape($elem->getData()));
- $elem->setId(Db::execute($query));
- $parents = array();
- if ($elem->getParent()) {
- $parentId = $elem->getParent()->getId();
- $parentParents = Db::select(sprintf($qParents, $parentId));
- foreach ($parentParents as $k => $v) {
- $parents[] = join (',', array ($elem->getId(), $v['ParentID'] ? $v['ParentID'] : 'NULL', $v['Level']+1));
- }
- $parents[] = join (',', array ($elem->getId(), $parentId, 1));
- $parentsString = join ('), (', $parents);
- } else {
- $parentsString = join (',', array($elem->getId(), 'NULL', 1));
- }
- Db::execute(sprintf($qHier, $parentsString));
- if ($elem->getChildren()) {
- insertTreeRecursive($elem->getChildren());
- }
- }
- }
- function getRowsByParent ($id) {
- $id = (int) $id;
- return Db::select("
- SELECT * FROM `Elements`
- INNER JOIN `ElementsHierarchy` as `Hier`
- ON `Hier`.`ElemID` = `Elements`.`ID`
- WHERE
- `Hier`.`ParentID` = '$id' OR
- `Elements`.`Id` = '$id'
- GROUP BY `Elements`.`Id`
- ");
- }
- function getTreeByParent ($id) {
- $where = !is_int($id) ? '' :
- "WHERE `Hier`.`ParentID` = $id OR `Elements`.`Id` = $id";
- $rows = Db::select("
- SELECT `Elements`.*, `Parent`.`ParentID` FROM `Elements`
- INNER JOIN `ElementsHierarchy` as `Hier`
- ON `Hier`.`ElemID` = `Elements`.`ID`
- INNER JOIN `ElementsHierarchy` as `Parent`
- ON (`Parent`.`ElemID` = `Elements`.`ID` AND `Parent`.`Level` = 1)
- " . $where);
- $tree = createElem($id);
- foreach ($rows as $r) {
- $parent = createElem($r['ParentID']);
- $elem = createElem($r['ID']);
- $elem->setData($r['Data']);
- $elem->setParent($parent);
- $parent->addChild($elem);
- }
- return $tree;
- }
- function createElem ($id) {
- static $elements = array ();
- if (empty($elements[$id])) {
- $elem = new Elem;
- $elem->setId($id);
- $elements[$id] = $elem;
- }
- return $elements[$id];
- }
- function markTreeByParent ($id, $value) {
- $value = (int) $value;
- $where = !is_int($id) ? '' :
- "WHERE `Hier`.`ParentID` = $id OR `Elements`.`Id` = $id";
- Db::execute("
- UPDATE `Elements`
- INNER JOIN `ElementsHierarchy` as `Hier`
- ON `Hier`.`ElemID` = `Elements`.`ID`
- SET `Elements`.`Marked` = '$value'
- " . $where);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement