Вход Регистрация
Файл: system/core/nestedsets.php
Строк: 189
<?php

class cmsNestedsets {

    private 
$TableName '';
    private 
$FieldID;
    private 
$FieldIDParent;
    private 
$FieldLeft;
    private 
$FieldRight;
    private 
$FieldDiffer;
    private 
$FieldLevel;
    private 
$FieldOrder;
    private 
$FieldIgnore;
    private 
$db;

    public function 
__construct($db) {

        
$this->FieldID       'id';
        
$this->FieldIDParent 'parent_id';
        
$this->FieldOrder    'ordering';
        
$this->FieldLeft     'ns_left';
        
$this->FieldRight    'ns_right';
        
$this->FieldDiffer   'ns_differ';
        
$this->FieldLevel    'ns_level';
        
$this->FieldIgnore   'ns_ignore';

        
$this->db $db;

    }

    public function 
setTable($table) {
        
$this->TableName "{#}$table";
    }

    public function 
_safe_set(&$var_true$var_false '') {
        if (!isset(
$var_true)) {
            
$var_true $var_false;
        }
    }

    public function 
_safe_query($query) {
        if (empty(
$query)) {
            return 
false;
        }
        return 
$this->db->query($query);
    }

    public function 
ClearNodes($Differ '') {
        
$sql_delete 'DELETE FROM ' $this->TableName ' WHERE ' $this->FieldDiffer " = '" $Differ "'";
        
$this->_safe_query($sql_delete);
    }

    public function 
DeleteNode($IDNode = -1$Differ '') {
        
$sql_select 'SELECT * FROM ' $this->TableName ' WHERE ' $this->FieldID ' = ' $IDNode ' AND ' $this->FieldDiffer " = '" $Differ "'";
        
$rs_select  $this->_safe_query($sql_select);
        if (
$rs_select && ($row_select $this->db->fetchAssoc($rs_select))) {

            
$this->_safe_set($row_select[$this->FieldID], -1);
            
$this->_safe_set($row_select[$this->FieldLeft], -1);
            
$this->_safe_set($row_select[$this->FieldRight], -1);
            
$delete_offset $row_select[$this->FieldRight] - $row_select[$this->FieldLeft];

            
// Delete sub nodes
            
$sql_delete 'DELETE FROM ' $this->TableName .
                    
' WHERE ' $this->FieldLeft ' >= ' $row_select[$this->FieldLeft] .
                    
' AND ' $this->FieldLeft ' <= ' $row_select[$this->FieldRight] .
                    
' AND ' $this->FieldDiffer " = '" $Differ "'";
            
$this->_safe_query($sql_delete);

            
// Update FieldLeft
            
$sql_update 'UPDATE ' $this->TableName .
                    
' SET ' $this->FieldLeft ' = ' $this->FieldLeft ' - ' . ($delete_offset 1) .
                    
' WHERE ' $this->FieldLeft ' > ' $row_select[$this->FieldRight] .
                    
' AND ' $this->FieldDiffer " = '" $Differ "'";
            
$this->_safe_query($sql_update);

            
// Update FieldRight
            
$sql_update 'UPDATE ' $this->TableName .
                    
' SET ' $this->FieldRight ' = ' $this->FieldRight ' - ' . ($delete_offset 1) .
                    
' WHERE ' $this->FieldRight ' > ' $row_select[$this->FieldRight] .
                    
' AND ' $this->FieldDiffer " = '" $Differ "'";
            
$this->_safe_query($sql_update);

            
// Update Ordering
            
$sql_update 'UPDATE ' $this->TableName .
                    
' SET ' $this->FieldOrder ' = ' $this->FieldOrder ' - 1' .
                    
' WHERE ' $this->FieldOrder ' > ' $row_select[$this->FieldOrder] .
                    
' AND ' $this->FieldLevel ' = ' $row_select[$this->FieldLevel] .
                    
' AND ' $this->FieldDiffer " = '" $Differ "'";
            
$this->_safe_query($sql_update);

            
$this->db->freeResult($rs_select);

            return 
true;
        } else {
            return 
false;
        }
    }

    public function 
AddRootNode($Differ '') {
        
$sql_insert 'INSERT INTO ' $this->TableName .
                
' (title, ' $this->FieldIDParent ', ' $this->FieldLeft ', ' $this->FieldRight .
                
', ' $this->FieldLevel ', ' $this->FieldOrder ', ' $this->FieldDiffer ') ' .
                
" VALUES ('---', 0, 1, 2, 0, 1, '" $Differ "')";
        
$this->_safe_query($sql_insert);
        return 
$this->db->lastId();
    }

    public function 
AddNode($IDParent = -1$Order = -1$Differ '') {

        
$sql_select 'SELECT * FROM ' $this->TableName ' WHERE ' $this->FieldID ' = ' $IDParent ' AND ' $this->FieldDiffer " = '" $Differ "'";
        
$rs_select  $this->_safe_query($sql_select);
        if ((
$rs_select) && ($row_select $this->db->fetchAssoc($rs_select))) {
            
$this->_safe_set($row_select[$this->FieldID], -1);
            
$this->_safe_set($row_select[$this->FieldLeft], -1);
            
$this->_safe_set($row_select[$this->FieldRight], -1);
            
$this->_safe_set($row_select[$this->FieldLevel], -1);

            
$left $row_select[$this->FieldLeft] + 1;

            
// Update Order (set order = order +1 where order>$Order)
            
if ($Order == -1) {
                
$sql_order 'SELECT * FROM ' $this->TableName .
                        
' WHERE ' $this->FieldIDParent ' = ' $IDParent .
                        
' AND ' $this->FieldDiffer " = '" $Differ "'" .
                        
' ORDER BY ' $this->FieldOrder ' DESC ' .
                        
' LIMIT 0,1';
                
$rs_order  $this->_safe_query($sql_order);
                if ((
$rs_order) && ($row_order $this->db->fetchAssoc($rs_order))) {
                    
$this->_safe_set($row_order[$this->FieldOrder], 0);
                    
$Order $row_order[$this->FieldOrder] + 1;
                    
$this->db->freeResult($rs_order);
                } else {
                    
$Order 1;
                }
            }

            
$sql_update 'UPDATE ' $this->TableName .
                    
' SET ' $this->FieldOrder ' = ' $this->FieldOrder ' + 1' .
                    
' WHERE ' $this->FieldIDParent ' = ' $IDParent .
                    
' AND ' $this->FieldOrder ' >= ' $Order .
                    
' AND ' $this->FieldDiffer " = '" $Differ "'";
            
$this->_safe_query($sql_update);

            
$sql_order 'SELECT * FROM ' $this->TableName .
                    
' WHERE ' $this->FieldIDParent ' = ' $IDParent .
                    
' AND ' $this->FieldOrder ' <= ' $Order .
                    
' AND ' $this->FieldDiffer " = '" $Differ "'" .
                    
' ORDER BY ' $this->FieldOrder ' DESC ' .
                    
' LIMIT 0,1';
            
$rs_order  $this->_safe_query($sql_order);
            if ((
$rs_order) && ($row_order $this->db->fetchAssoc($rs_order))) {
                
$this->_safe_set($row_order[$this->FieldRight], -1);
                
$left $row_order[$this->FieldRight] + 1;
                
$this->db->freeResult($rs_order);
            }

            
$right $left 1;

            
// Update FieldLeft
            
$sql_update 'UPDATE ' $this->TableName .
                    
' SET ' $this->FieldLeft ' = ' $this->FieldLeft ' + 2' .
                    
' WHERE ' $this->FieldLeft ' >= ' $left .
                    
' AND ' $this->FieldDiffer " = '" $Differ "'";
            
$this->_safe_query($sql_update);

            
// Update FieldRight
            
$sql_update 'UPDATE ' $this->TableName .
                    
' SET ' $this->FieldRight ' = ' $this->FieldRight ' + 2' .
                    
' WHERE ' $this->FieldRight ' >= ' $left .
                    
' AND ' $this->FieldDiffer " = '" $Differ "'";
            
$this->_safe_query($sql_update);

            
// Insert
            
$sql_insert 'INSERT INTO ' $this->TableName .
                    
' (' $this->FieldIDParent ', ' $this->FieldLeft ', ' $this->FieldRight .
                    
', ' $this->FieldLevel ', ' $this->FieldOrder ', ' $this->FieldDiffer ') ' .
                    
' VALUES (' $IDParent ', ' $left ', ' $right .
                    
', ' . ($row_select[$this->FieldLevel] + 1) . ', ' $Order ", '" $Differ "')";
            
$this->_safe_query($sql_insert);

            
$this->db->freeResult($rs_select);

            return 
$this->db->lastId();
        } else {
            return 
false;
        }
    }

    public function 
MoveOrdering($IDNode$dir 1) {

        
$sql      "SELECT * FROM {$this->TableName} WHERE {$this->FieldID}='{$IDNode}'";
        
$res      $this->_safe_query($sql);
        
$move_row $this->db->fetchAssoc($res);
        
$this->db->freeResult($res);

        if (
$move_row[$this->FieldDiffer]){
            
$Differ 'AND ' $this->FieldDiffer ' = ' $move_row[$this->FieldDiffer];
        } else {
            
$Differ '';
        }

        
// максимальное значение сортировки
        
$sql "SELECT MAX({$this->FieldOrder}) FROM {$this->TableName} WHERE {$this->FieldIDParent}={$move_row[$this->FieldIDParent]}";
        
$res $this->_safe_query($sql);
        list(
$maxordering) = $this->db->fetchRow($res);
        if (!
$maxordering){
            
$maxordering 1;
        }
        
// минимальное значение сортировки
        
$sql_min     "SELECT MIN({$this->FieldOrder}) FROM {$this->TableName} WHERE {$this->FieldIDParent}={$move_row[$this->FieldIDParent]}";
        
$res_min     $this->_safe_query($sql_min);
        list(
$minordering) = $this->db->fetchRow($res_min);
        if (!
$minordering){
            
$minordering 1;
        }
        
$this->db->freeResult($res);

        if (
$dir == -&& $move_row[$this->FieldOrder] == $minordering){
            return;
        }
        if (
$dir == && $move_row[$this->FieldOrder] == $maxordering){
            return;
        }

        if (
$dir == -1) {

            
$sql   "UPDATE {$this->TableName} SET {$this->FieldIgnore} = 1
                    WHERE 
{$this->FieldLeft} >= {$move_row[$this->FieldLeft]} AND {$this->FieldRight} <= {$move_row[$this->FieldRight]} {$Differ}";
            
$this->_safe_query($sql);
            
$count $this->db->affectedRows() * 2;

            
$sql  "SELECT * FROM {$this->TableName}
                    WHERE 
{$this->FieldIDParent} = {$move_row[$this->FieldIDParent]} AND {$this->FieldOrder} = " . ($move_row[$this->FieldOrder] - 1);
            
$res  $this->_safe_query($sql);
            
$near $this->db->fetchAssoc($res);
            
$this->db->freeResult($res);

            
$sql "UPDATE {$this->TableName}
                    SET 
{$this->FieldLeft} = {$this->FieldLeft} + {$count},
                        
{$this->FieldRight} = {$this->FieldRight} + {$count}
                    WHERE 
{$this->FieldLeft} >= {$near[$this->FieldLeft]} AND {$this->FieldRight} <= {$near[$this->FieldRight]}
                    
{$Differ}";

            
$this->_safe_query($sql);
            
$count2 $this->db->affectedRows() * 2;

            
$sql "UPDATE {$this->TableName}
                    SET 
{$this->FieldLeft} = {$this->FieldLeft} - {$count2},
                        
{$this->FieldRight} = {$this->FieldRight} - {$count2},
                        
{$this->FieldIgnore} = 0
                    WHERE 
{$this->FieldIgnore} = 1
                    
{$Differ}";
            
$this->_safe_query($sql);

            
$sql "UPDATE {$this->TableName} SET {$this->FieldOrder} = {$this->FieldOrder} - 1
                    WHERE 
{$this->FieldID} = {$IDNode}";
            
$this->_safe_query($sql);

            
$sql "UPDATE {$this->TableName} SET {$this->FieldOrder} = {$this->FieldOrder} + 1
                    WHERE 
{$this->FieldID} = {$near[$this->FieldID]}";
            
$this->_safe_query($sql);
        }

        if (
$dir == 1) {

            
$sql   "UPDATE {$this->TableName} SET {$this->FieldIgnore} = 1
                    WHERE 
{$this->FieldLeft} >= {$move_row[$this->FieldLeft]} AND {$this->FieldRight} <= {$move_row[$this->FieldRight]} {$Differ}";
            
$this->_safe_query($sql);
            
$count $this->db->affectedRows() * 2;

            
$sql  "SELECT * FROM {$this->TableName}
                    WHERE 
{$this->FieldIDParent} = {$move_row[$this->FieldIDParent]} AND {$this->FieldOrder} = " . ($move_row[$this->FieldOrder] + 1);
            
$res  $this->_safe_query($sql);
            
$near $this->db->fetchAssoc($res);
            
$this->db->freeResult($res);

            
$sql "UPDATE {$this->TableName}
                    SET 
{$this->FieldLeft} = {$this->FieldLeft} - {$count},
                        
{$this->FieldRight} = {$this->FieldRight} - {$count}
                    WHERE 
{$this->FieldLeft} >= {$near[$this->FieldLeft]} AND {$this->FieldRight} <= {$near[$this->FieldRight]}
                    
{$Differ}";

            
$this->_safe_query($sql);
            
$count2 $this->db->affectedRows() * 2;

            
$sql "UPDATE {$this->TableName}
                    SET 
{$this->FieldLeft} = {$this->FieldLeft} + {$count2},
                        
{$this->FieldRight} = {$this->FieldRight} + {$count2},
                        
{$this->FieldIgnore} = 0
                    WHERE 
{$this->FieldIgnore} = 1
                    
{$Differ}";
            
$this->_safe_query($sql);

            
$sql "UPDATE {$this->TableName} SET {$this->FieldOrder} = {$this->FieldOrder} + 1
                    WHERE 
{$this->FieldID} = {$IDNode}";
            
$this->_safe_query($sql);

            
$sql "UPDATE {$this->TableName} SET {$this->FieldOrder} = {$this->FieldOrder} - 1
                    WHERE 
{$this->FieldID} = {$near[$this->FieldID]}";
            
$this->_safe_query($sql);
        }

        return 
true;

    }

    public function 
MoveNode($IDNode = -1$IDParent = -1$Order = -1$Differ '') {

        
$sql_select 'SELECT * FROM ' $this->TableName .
                
' WHERE ' $this->FieldID ' = ' $IDNode .
                
' AND ' $this->FieldDiffer " = '" $Differ "'";

        
$rs_select  $this->_safe_query($sql_select);

        if ((
$rs_select) && ($row_select $this->db->fetchAssoc($rs_select))) {

            
$this->_safe_set($row_select[$this->FieldID], -1);
            
$this->_safe_set($row_select[$this->FieldLeft], -1);
            
$this->_safe_set($row_select[$this->FieldRight], -1);
            
$this->_safe_set($row_select[$this->FieldLevel], -1);

            
$sql_select_parent 'SELECT * FROM ' $this->TableName .
                    
' WHERE ' $this->FieldID ' = ' $IDParent .
                    
' AND ' $this->FieldDiffer " = '" $Differ "'";

            
$rs_select_parent  $this->_safe_query($sql_select_parent);

            if ((
$rs_select_parent) && ($row_select_parent $this->db->fetchAssoc($rs_select_parent))) {

                
$this->_safe_set($row_select_parent[$this->FieldID], -1);
                
$this->_safe_set($row_select_parent[$this->FieldLeft], -1);
                
$this->_safe_set($row_select_parent[$this->FieldRight], -1);
                
$this->_safe_set($row_select_parent[$this->FieldLevel], -1);

                
$left $row_select_parent[$this->FieldLeft] + 1;

                
//Set node tree as ignore
                
$sql_ignore 'UPDATE ' $this->TableName .
                        
' SET ' $this->FieldIgnore ' = 1' .
                        
' WHERE ' $this->FieldLeft ' >= ' $row_select[$this->FieldLeft] .
                        
' AND ' $this->FieldRight ' <= ' $row_select[$this->FieldRight] .
                        
' AND ' $this->FieldDiffer " = '" $Differ "'";
                
$this->_safe_query($sql_ignore);

                
// Update Order (set order = order +1 where order>$Order)
                
if ($Order == -1) {
                    
$sql_order 'SELECT * FROM ' $this->TableName .
                            
' WHERE ' $this->FieldIDParent ' = ' $IDParent .
                            
' AND ' $this->FieldDiffer " = '" $Differ "'" .
                            
' ORDER BY ' $this->FieldOrder ' DESC ' .
                            
' LIMIT 0,1';
                    
$rs_order  $this->_safe_query($sql_order);
                    if ((
$rs_order) && ($row_order $this->db->fetchAssoc($rs_order))) {
                        
$this->_safe_set($row_order[$this->FieldOrder], 0);
                        
$Order $row_order[$this->FieldOrder] + 1;
                        
$this->db->freeResult($rs_order);
                    } else {
                        
$Order 1;
                    }
                }

                
$sql_update 'UPDATE ' $this->TableName .
                        
' SET ' $this->FieldOrder ' = ' $this->FieldOrder ' + 1' .
                        
' WHERE ' $this->FieldIDParent ' = ' $IDParent .
                        
' AND ' $this->FieldOrder ' >= ' $Order .
                        
' AND ' $this->FieldDiffer " = '" $Differ "'";
                
$this->_safe_query($sql_update);

                
$sql_order 'SELECT * FROM ' $this->TableName .
                        
' WHERE ' $this->FieldIDParent ' = ' $IDParent .
                        
' AND ' $this->FieldOrder ' <= ' $Order .
                        
' AND ' $this->FieldDiffer " = '" $Differ "'" .
                        
' ORDER BY ' $this->FieldOrder ' DESC ' .
                        
' LIMIT 0,1';
                
$rs_order  $this->_safe_query($sql_order);

                if ((
$rs_order) && ($row_order $this->db->fetchAssoc($rs_order))) {
                    
$this->_safe_set($row_order[$this->FieldRight], -1);
                    
$left $row_order[$this->FieldRight] + 1;
                    
$this->db->freeResult($rs_order);
                }

                
$child_offset $row_select[$this->FieldRight] - $row_select[$this->FieldLeft] + 1;

                
// Update FieldLeft
                
if ($left $row_select[$this->FieldLeft]) { // Move to left
                    
$sql_update 'UPDATE ' $this->TableName .
                            
' SET ' $this->FieldLeft ' = ' $this->FieldLeft ' + (' $child_offset ')' .
                            
' WHERE ' $this->FieldLeft ' >= ' $left .
                            
' AND ' $this->FieldLeft ' <= ' $row_select[$this->FieldLeft] .
                            
' AND ' $this->FieldIgnore ' = 0' .
                            
' AND ' $this->FieldDiffer " = '" $Differ "'";
                } else { 
// Move to right
                    
$sql_update 'UPDATE ' $this->TableName .
                            
' SET ' $this->FieldLeft ' = ' $this->FieldLeft ' - ' $child_offset .
                            
' WHERE ' $this->FieldLeft ' <= ' $left .
                            
' AND ' $this->FieldLeft ' >= ' $row_select[$this->FieldLeft] .
                            
' AND ' $this->FieldIgnore ' = 0' .
                            
' AND ' $this->FieldDiffer " = '" $Differ "'";
                }
                
$this->_safe_query($sql_update);

                
// Update FieldRight
                
if ($left $row_select[$this->FieldLeft]) { // Move to left
                    
$sql_update 'UPDATE ' $this->TableName .
                            
' SET ' $this->FieldRight ' = ' $this->FieldRight ' + (' $child_offset ')' .
                            
' WHERE ' $this->FieldRight ' >= ' $left .
                            
' AND ' $this->FieldRight ' <= ' $row_select[$this->FieldRight] .
                            
' AND ' $this->FieldIgnore ' = 0' .
                            
' AND ' $this->FieldDiffer " = '" $Differ "'";
                } else { 
// Move to right
                    
$sql_update 'UPDATE ' $this->TableName .
                            
' SET ' $this->FieldRight ' = ' $this->FieldRight ' - ' $child_offset .
                            
' WHERE ' $this->FieldRight ' < ' $left .
                            
' AND ' $this->FieldRight ' >= ' $row_select[$this->FieldRight] .
                            
' AND ' $this->FieldIgnore ' = 0' .
                            
' AND ' $this->FieldDiffer " = '" $Differ "'";
                }
                
$this->_safe_query($sql_update);

                
$level_difference $row_select_parent[$this->FieldLevel] - $row_select[$this->FieldLevel] + 1;
                
$new_offset       $row_select[$this->FieldLeft] - $left;
                if (
$left $row_select[$this->FieldLeft]) { // i.e. move to right
                    
$new_offset += $child_offset;
                }

                
//Update new tree left
                
$sql_update 'UPDATE ' $this->TableName .
                        
' SET ' $this->FieldLeft ' = ' $this->FieldLeft ' - (' $new_offset '), ' .
                        
$this->FieldRight ' = ' $this->FieldRight ' - (' $new_offset '),' .
                        
"{$this->FieldLevel} = {$this->FieldLevel} + {$level_difference}.
                        
' WHERE ' $this->FieldLeft ' >= ' $row_select[$this->FieldLeft] .
                        
' AND ' $this->FieldRight ' <= ' $row_select[$this->FieldRight] .
                        
' AND ' $this->FieldIgnore ' = 1' .
                        
' AND ' $this->FieldDiffer " = '" $Differ "'";
                
$this->_safe_query($sql_update);

                
//Remove ignore statis from node tree
                
$sql_ignore 'UPDATE ' $this->TableName .
                        
' SET ' $this->FieldIgnore ' = 0' .
                        
' WHERE ' $this->FieldLeft ' >= ' . ($row_select[$this->FieldLeft] - $new_offset) .
                        
' AND ' $this->FieldRight ' <= ' . ($row_select[$this->FieldRight] - $new_offset) .
                        
' AND ' $this->FieldIgnore ' = 1' .
                        
' AND ' $this->FieldDiffer " = '" $Differ "'";
                
$this->_safe_query($sql_ignore);

                
//Update insert root field
                
$sql_update 'UPDATE ' $this->TableName ' SET ' $this->FieldIDParent ' = ' $IDParent ', ' .
                        
$this->FieldOrder ' = ' $Order ' WHERE ' $this->FieldID ' = ' $IDNode;
                
$this->_safe_query($sql_update);

                
$this->db->freeResult($rs_select_parent);
                return 
true;
            } else {
                return 
false;
            }

            
$this->db->freeResult($rs_select);
            return 
true;
        } else {
            return 
false;
        }
    }

    public function 
SelectPath($IDNode = -1$Differ '') {
        
$sql_select 'SELECT * FROM ' $this->TableName ' WHERE ' $this->FieldID ' = ' $IDNode ' AND ' $this->FieldDiffer " = '" $Differ "'";
        
$rs_select  $this->_safe_query($sql_select);
        if ((
$rs_select) && ($row_select $this->db->fetchAssoc($rs_select))) {
            
$this->_safe_set($row_select[$this->FieldID], -1);
            
$this->_safe_set($row_select[$this->FieldLeft], -1);
            
$this->_safe_set($row_select[$this->FieldRight], -1);
            
$sql_result 'SELECT * FROM ' $this->TableName .
                    
' WHERE ' $this->FieldLeft ' <= ' $row_select[$this->FieldLeft] .
                    
' AND ' $this->FieldRight ' >= ' $row_select[$this->FieldRight] .
                    
' AND ' $this->FieldDiffer " = '" $Differ "'" .
                    
' ORDER BY ' $this->FieldLeft;
            
$this->db->freeResult($rs_select);
            return 
$this->_safe_query($sql_result); // Remember to free result
        
} else {
            return 
false;
        }
    }

    public function 
SelectSubNodes($IDNode = -1$Level = -1$Differ '') {
        
$sql_select 'SELECT * FROM ' $this->TableName ' WHERE ' $this->FieldID ' = ' $IDNode ' AND ' $this->FieldDiffer " = '" $Differ "'";
        
$rs_select  $this->_safe_query($sql_select);
        if ((
$rs_select) && ($row_select $this->db->fetchAssoc($rs_select))) {
            
$this->_safe_set($row_select[$this->FieldID], -1);
            
$this->_safe_set($row_select[$this->FieldLeft], -1);
            
$this->_safe_set($row_select[$this->FieldRight], -1);
            
$this->_safe_set($row_select[$this->FieldLevel], -1);
            if (
$Level == -1) { // All child nodes
                
$sql_result 'SELECT * FROM ' $this->TableName .
                        
' WHERE ' $this->FieldLeft ' > ' $row_select[$this->FieldLeft] .
                        
' AND ' $this->FieldRight ' < ' $row_select[$this->FieldRight] .
                        
' AND ' $this->FieldDiffer " = '" $Differ "'" .
                        
' ORDER BY ' $this->FieldLeft ',' $this->FieldOrder;
            } else { 
// Only $Level child nodes
                
$sql_result 'SELECT * FROM ' $this->TableName .
                        
' WHERE ' $this->FieldLeft ' > ' $row_select[$this->FieldLeft] .
                        
' AND ' $this->FieldRight ' < ' $row_select[$this->FieldRight] .
                        
' AND ' $this->FieldLevel ' <= ' . ($Level $row_select[$this->FieldLevel]) .
                        
' AND ' $this->FieldDiffer " = '" $Differ "'" .
                        
' ORDER BY ' $this->FieldLeft ',' $this->FieldOrder;
            }
            
$this->db->freeResult($rs_select);
            return 
$this->_safe_query($sql_result); // Remember to free result
        
} else {
            return 
false;
        }

    }

    public function 
SelectCountSubNodes($IDNode = -1$Level = -1$Differ '') {
        
$sql_select 'SELECT * FROM ' $this->TableName ' WHERE ' $this->FieldID ' = ' $IDNode ' AND ' $this->FieldDiffer " = '" $Differ "'";
        
$rs_select  $this->_safe_query($sql_select);
        if ((
$rs_select) && ($row_select $this->db->fetchAssoc($rs_select))) {
            
$this->_safe_set($row_select[$this->FieldID], -1);
            
$this->_safe_set($row_select[$this->FieldLeft], -1);
            
$this->_safe_set($row_select[$this->FieldRight], -1);
            
$this->_safe_set($row_select[$this->FieldLevel], -1);
            if (
$Level == -1) { // All child nodes
                
$sql_result 'SELECT count(' $this->FieldID ') FROM ' $this->TableName .
                        
' WHERE ' $this->FieldLeft ' > ' $row_select[$this->FieldLeft] .
                        
' AND ' $this->FieldRight ' < ' $row_select[$this->FieldRight] .
                        
' AND ' $this->FieldDiffer " = '" $Differ "'" .
                        
' ORDER BY ' $this->FieldLeft ',' $this->FieldOrder;
            } else { 
// Only $Level child nodes
                
$sql_result 'SELECT count(' $this->FieldID ') FROM ' $this->TableName .
                        
' WHERE ' $this->FieldLeft ' > ' $row_select[$this->FieldLeft] .
                        
' AND ' $this->FieldRight ' < ' $row_select[$this->FieldRight] .
                        
' AND ' $this->FieldLevel ' <= ' . ($Level $row_select[$this->FieldLevel]) .
                        
' AND ' $this->FieldDiffer " = '" $Differ "'" .
                        
' ORDER BY ' $this->FieldLeft ',' $this->FieldOrder;
            }
            
$this->db->freeResult($rs_select);
            
$res $this->_safe_query($sql_result); // Remember to free result
            
list($count) = $this->db->fetchRow($res);
            
$this->db->freeResult($res);
            return 
$count;
        } else {
            return 
false;
        }
    }

}
Онлайн: 0
Реклама