Вход Регистрация
Файл: system/core/nestedsets.php
Строк: 192
<?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; }
        
$result = $this->db->query($query);
        return 
$result;
    }

    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);

            
$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 == -1 && $move_row[$this->FieldOrder] == $minordering) return;
        if (
$dir == 1 && $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);
            
$delete_offset = $row_select[$this->FieldRight] - $row_select[$this->FieldLeft];


            
$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; }
    }
    
// End nasted set public functions //
}

?>
Онлайн: 3
Реклама