Вход Регистрация
Файл: InstantSocial/uploud/includes/nestedsets.php
Строк: 521
<?php
/*
    CCelkoNastedSet class 

    Written by Setec Astronomy

    Thanks to Kirill Hryapin <kx@chl.ru> for finding and solving bugs into the MoveNode () method.

    Modified by Vladimir Obukhov <r2@instantsoft.ru> for InstantCMS project.

    Members
    $TableName => Table name that contains nasted sets 
    $FieldID => Field name for table ID
    $FieldIDParent => Field name for table IDParent
    $FieldLeft => Field name for table nasted set left field 
    $FieldRight => Field name for table nasted set right field  
    $FieldDiffer => Field name used to manage more than one type of nasted set in the same table
    $FieldLevel => Field name for table nasted set level field  (0 = root node)
    $FieldOrder => Field name for table nasted set order field   
    $FieldIgnore => Field name for tablr nested set ignore field 
    
    $TransactionTable => Name for table used to manage transactions

    $MyLink => MySQL database link resource

    Methods 
    SelectSubNodes () => Returns all the sub node of IDNode fo Level number of level.
    SelectPath () => Returns the path from the IDNode to the root node.
    MoveNode () => Method used to move the node IDNode to IDParent.
    AddRootNode () => Method used to add the root node for a nested set
    AddNode () => Method used to add a node to IDParent. Return the new IDNode.
    DeleteNode () => Method used to delete the node identified by IDNode and all his children.
    ClearNodes () => Method used to clear the nasted set table

    BeginTransaction () => Method that start the transaction. Returns true or false.
    EndTransaction () => Method that stop the transaction.
    IsInTransaction () => Method to check the transaction state. Returns true or false.

*/

class CCelkoNastedSet 

   public  
$TableName;
   private 
$FieldID;
   private 
$FieldIDParent;
   private 
$FieldLeft;
   private 
$FieldRight;
   private 
$FieldDiffer;
   private 
$FieldLevel;
   private 
$FieldOrder;
   private 
$FieldIgnore;
   
   public  
$TransactionTable;
   private 
$_IsInTransaction;
   private 
$_TransactionTStamp;

   public 
$MyLink;

   public function 
__construct ()
    { 
       
$this->TableName "tblCelkoTree";  
       
$this->FieldID "id"
       
$this->FieldIDParent "parent_id"
       
$this->FieldLeft "NSLeft"
       
$this->FieldRight "NSRight"
       
$this->FieldDiffer "NSDiffer";
       
$this->FieldLevel "NSLevel";  
       
$this->FieldOrder "ordering";
       
$this->FieldIgnore "NSIgnore"
    
       
$this->TransactionTable "cms_ns_transactions";
       
$this->_IsInTransaction false;
       
$this->_TransactionTStamp 0;

       
$this->MyLink null;  
    } 

    
// Begin private functions //
    
private function _safe_set (&$var_true$var_false "")
    {
        if (!isset (
$var_true)) 
        { 
$var_true $var_false; }
    }

    private function 
_safe_query ($query$link)
    {
        if (empty(
$query)) { return false; }
        
$inDB   cmsDatabase::getInstance();
        
$result $inDB->query($query) or die("Nested sets error: $query");
        return 
$result;
    }
    
// End private functions //
    
    // Begin transaction functions //
    
private function InitializeTransaction ($Differ "")
    {
        
$sql_verify "SELECT * FROM " $this->TransactionTable .
                      
" WHERE TableName = '" $this->TableName "' " .
                      
" AND Differ = '" $Differ "'";
        
$rs_verify $this->_safe_query ($sql_verify$this->MyLink);
        
        if ((
$rs_verify) && (mysql_num_rows ($rs_verify) == 0))
        {
            
mysql_free_result ($rs_verify);
            
               
$sql_insert "INSERT INTO " $this->TransactionTable 
                          
" (TableName, Differ, InTransaction) " .
                          
" VALUES ('" $this->TableName "', '" $Differ "', 0)";
            
$this->_safe_query ($sql_insert$this->MyLink);
            
            return 
true;
        }
        else
        { return 
false; }
    }

    private function 
BeginTransaction ($Differ "")
    {
        
//r2: здесь нужно будет разбираться с транзакциями
        
$this->_IsInTransaction true; return true;

        
$this->InitializeTransaction($Differ);

        
$TStamp date ("YmdHis");

        
$sql_update "UPDATE " $this->TransactionTable 
                      
" SET TStamp = " $TStamp ", " .
                      
" InTransaction = 1 " .
                      
" WHERE InTransaction = 0 " .
                      
" AND TableName = '" $this->TableName "' " .
                      
" AND Differ = '" $Differ "'";
        
$this->_safe_query ($sql_update$this->MyLink);
        
        
$sql_verify "SELECT * FROM " $this->TransactionTable .
                      
" WHERE TableName = '" $this->TableName "' " .
                      
" AND InTransaction = 1 " .
                      
" AND TStamp = " $TStamp 
                      
" AND Differ = '" $Differ "'";
        
$rs_verify $this->_safe_query ($sql_verify$this->MyLink);

        if ((
$rs_verify) && (mysql_num_rows ($rs_verify) == 1))
        {
            
mysql_free_result ($rs_verify);
            
$this->_IsInTransaction true;
            
$this->_TransactionTStamp $TStamp;
            return 
true;
        }
        else
        { 
            
$this->_IsInTransaction false;
            
$this->_TransactionTStamp 0;
            return 
false
        }
    }
    
    public function 
EndTransaction ($Differ "")
    {
        
$sql_update "UPDATE " $this->TransactionTable 
                      
" SET InTransaction = 0 " .
                      
" WHERE TableName = '" $this->TableName "' " .
                      
" AND TStamp = " $this->_TransactionTStamp 
                      
" AND Differ = '" $Differ "'";
        
$this->_safe_query ($sql_update$this->MyLink);
        
$this->_IsInTransaction false;
    }

    public function 
IsInTransaction ()
    { return 
$this->_IsInTransaction; }
    
// End transaction  functions //
    
    // Begin nasted set functions //
    
public function ClearNodes ($Differ "")
    {
        
$this->BeginTransaction($Differ);
        
$sql_delete "DELETE FROM " $this->TableName " WHERE " $this->FieldDiffer " = '" $Differ "'";
        
$this->_safe_query ($sql_delete$this->MyLink);
        
$this->EndTransaction($Differ);
    }

    public function 
DeleteNode ($IDNode = -1$Differ "")
    {
        
$this->BeginTransaction($Differ);

        if (!
$this->_IsInTransaction)
        { return 
false; }
        
        
$sql_select "SELECT * FROM " $this->TableName " WHERE " $this->FieldID " = " $IDNode " AND " $this->FieldDiffer " = '" $Differ "'"
        
$rs_select $this->_safe_query ($sql_select$this->MyLink);
        if ((
$rs_select) && ($row_select mysql_fetch_assoc ($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$this->MyLink);

            
// 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$this->MyLink);

            
// 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->MyLink);
        
            
mysql_free_result ($rs_select);

            
$this->EndTransaction($Differ);
            return 
true;


        } else {

            
$this->EndTransaction($Differ);
            return 
false;

        }
    }

    public function 
AddRootNode ($Differ "")
    {
        
$this->BeginTransaction($Differ);

        if (!
$this->_IsInTransaction)
        { return 
false; }

        
$sql_insert "INSERT INTO " $this->TableName 
                      
" (" $this->FieldIDParent ", " $this->FieldLeft ", " $this->FieldRight 
                      
", " $this->FieldLevel ", " $this->FieldOrder ", " $this->FieldDiffer ") " .
                      
" VALUES (0, 1, 2, 0, 1, '" $Differ "')";
        
$this->_safe_query ($sql_insert$this->MyLink);

        
$new_id mysql_insert_id ($this->MyLink);

        
$this->EndTransaction($Differ);

        return 
$new_id;
    }

    public function 
AddNode ($IDParent = -1$Order = -1$Differ "")
    {
        
$this->BeginTransaction($Differ);

        if (!
$this->_IsInTransaction)
        { return 
false; }

        
$sql_select "SELECT * FROM " $this->TableName " WHERE " $this->FieldID " = " $IDParent " AND " $this->FieldDiffer " = '" $Differ "'";
        
$rs_select $this->_safe_query ($sql_select$this->MyLink);
        if ((
$rs_select) && ($row_select mysql_fetch_assoc ($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$this->MyLink);
                if ((
$rs_order) && ($row_order mysql_fetch_assoc ($rs_order)))
                {
                    
$this->_safe_set ($row_order[$this->FieldOrder], 0);
                    
$Order $row_order[$this->FieldOrder] + 1;
                    
mysql_free_result ($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$this->MyLink);
            
            
$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$this->MyLink);
            if ((
$rs_order) && ($row_order mysql_fetch_assoc ($rs_order)))
            {
                
$this->_safe_set ($row_order[$this->FieldRight], -1);
                
$left $row_order[$this->FieldRight] + 1;
                
mysql_free_result ($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$this->MyLink);
            
            
// 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$this->MyLink);

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

            
mysql_free_result ($rs_select);

            
$new_id mysql_insert_id ($this->MyLink);

            
$this->EndTransaction($Differ);

            return 
$new_id;
        }
        else
        { return 
false; }
    }
    
    public function 
MoveOrdering($IDNode$dir 1){

        
$this->BeginTransaction();

        if (!
$this->_IsInTransaction)
        { return 
false; }
        
        
$sql "SELECT * FROM {$this->TableName} WHERE {$this->FieldID}='{$IDNode}'";
        
$res $this->_safe_query ($sql$this->MyLink);
        
$move_row mysql_fetch_assoc($res);
        
mysql_free_result($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$this->MyLink);
        list(
$maxordering) = mysql_fetch_row($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$this->MyLink);
        list(
$minordering) = mysql_fetch_row($res_min);
        if (!
$minordering$minordering 1;

        
mysql_free_result($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$this->MyLink);
            
$count mysql_affected_rows($this->MyLink) * 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$this->MyLink);
            
$near mysql_fetch_assoc($res);
            
mysql_free_result($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$this->MyLink);
            
$count2 mysql_affected_rows($this->MyLink) * 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$this->MyLink);
            
            
$sql "UPDATE {$this->TableName} SET {$this->FieldOrder} = {$this->FieldOrder} - 1
                    WHERE 
{$this->FieldID} = {$IDNode}";
            
$this->_safe_query ($sql$this->MyLink);
            
            
$sql "UPDATE {$this->TableName} SET {$this->FieldOrder} = {$this->FieldOrder} + 1
                    WHERE 
{$this->FieldID} = {$near[$this->FieldID]}";
            
$this->_safe_query ($sql$this->MyLink);
        }
        
        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$this->MyLink);
            
$count mysql_affected_rows($this->MyLink) * 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$this->MyLink);
            
$near mysql_fetch_assoc($res);
            
mysql_free_result($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$this->MyLink);
            
$count2 mysql_affected_rows($this->MyLink) * 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$this->MyLink);
            
            
$sql "UPDATE {$this->TableName} SET {$this->FieldOrder} = {$this->FieldOrder} + 1
                    WHERE 
{$this->FieldID} = {$IDNode}";
            
$this->_safe_query ($sql$this->MyLink);
            
            
$sql "UPDATE {$this->TableName} SET {$this->FieldOrder} = {$this->FieldOrder} - 1
                    WHERE 
{$this->FieldID} = {$near[$this->FieldID]}";
            
$this->_safe_query ($sql$this->MyLink);
        }

        
$this->EndTransaction($Differ);

        return 
true;
    }    

    public function 
MoveNode ($IDNode = -1$IDParent = -1$Order = -1$Differ "")
    {
        
$this->BeginTransaction($Differ);

        if (!
$this->_IsInTransaction)
        { return 
false; }

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

        
$rs_select $this->_safe_query ($sql_select$this->MyLink);
        if ((
$rs_select) && ($row_select mysql_fetch_assoc ($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$this->MyLink);
            if ((
$rs_select_parent) && ($row_select_parent mysql_fetch_assoc ($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$this->MyLink);

                
// 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$this->MyLink);
                    if ((
$rs_order) && ($row_order mysql_fetch_assoc ($rs_order)))
                    {
                        
$this->_safe_set ($row_order[$this->FieldOrder], 0);
                        
$Order $row_order[$this->FieldOrder] + 1;
                        
mysql_free_result ($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$this->MyLink);

                
$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$this->MyLink);
                if ((
$rs_order) && ($row_order mysql_fetch_assoc ($rs_order)))
                {
                    
$this->_safe_set ($row_order[$this->FieldRight], -1);
                    
$left $row_order[$this->FieldRight] + 1;
                    
mysql_free_result ($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$this->MyLink);

                
// 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$this->MyLink);

                
$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$this->MyLink);

                
//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$this->MyLink);

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

                
mysql_free_result ($rs_select_parent);
                
$this->EndTransaction($Differ);
                return 
true;
            }
            else
            { 
$this->EndTransaction($Differ);
                return 
false; }

            
mysql_free_result ($rs_select);
            
$this->EndTransaction($Differ);
            return 
true;
        }
        else
        { 
$this->EndTransaction($Differ); 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$this->MyLink);
        if ((
$rs_select) && ($row_select mysql_fetch_assoc ($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;
            
mysql_free_result ($rs_select);
            return 
$this->_safe_query ($sql_result$this->MyLink); // 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$this->MyLink);
        if ((
$rs_select) && ($row_select mysql_fetch_assoc ($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;
            }
            
mysql_free_result ($rs_select);            
            return 
$this->_safe_query ($sql_result$this->MyLink); // 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$this->MyLink);
        if ((
$rs_select) && ($row_select mysql_fetch_assoc ($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;
            }
            
mysql_free_result ($rs_select);
            
$res $this->_safe_query ($sql_result$this->MyLink); // Remember to free result
            
list($count) = mysql_fetch_row($res);
            
mysql_free_result ($res);
            return 
$count;
        }
        else
        { return 
false; }
    }
    
// End nasted set functions //


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