applications/vanilla/models/class.categorymodel.php
public function SaveTree($TreeArray) {
      /*
        TreeArray comes in the format:
      '0' ...
        'item_id' => "root"
        'parent_id' => "none"
        'depth' => "0"
        'left' => "1"
        'right' => "34"
      '1' ...
        'item_id' => "1"
        'parent_id' => "root"
        'depth' => "1"
        'left' => "2"
        'right' => "3"
      etc...
      */

      // Grab all of the categories so that permissions can be properly saved.
      $PermTree = $this->SQL->Select('CategoryID, PermissionCategoryID, TreeLeft, TreeRight, Depth, Sort, ParentCategoryID')->From('Category')->Get();
      $PermTree = $PermTree->Index($PermTree->ResultArray(), 'CategoryID');

      // The tree must be walked in order for the permissions to save properly.
      usort($TreeArray, array('CategoryModel', '_TreeSort'));
      $Saves = array();
      
      foreach($TreeArray as $I => $Node) {
         $CategoryID = GetValue('item_id', $Node);
         if ($CategoryID == 'root')
            $CategoryID = -1;
            
         $ParentCategoryID = GetValue('parent_id', $Node);
         if (in_array($ParentCategoryID, array('root', 'none')))
            $ParentCategoryID = -1;

         $PermissionCategoryID = GetValueR("$CategoryID.PermissionCategoryID", $PermTree, 0);
         $PermCatChanged = FALSE;
         if ($PermissionCategoryID != $CategoryID) {
            // This category does not have custom permissions so must inherit its parent's permissions.
            $PermissionCategoryID = GetValueR("$ParentCategoryID.PermissionCategoryID", $PermTree, 0);
            if ($CategoryID != -1 && !GetValueR("$ParentCategoryID.Touched", $PermTree)) {
               throw new Exception("Category $ParentCategoryID not touched before touching $CategoryID.");
            }
            if ($PermTree[$CategoryID]['PermissionCategoryID'] != $PermissionCategoryID)
               $PermCatChanged = TRUE;
            $PermTree[$CategoryID]['PermissionCategoryID'] = $PermissionCategoryID;
         }
         $PermTree[$CategoryID]['Touched'] = TRUE;

         // Only update if the tree doesn't match the database.
         $Row = $PermTree[$CategoryID];
         if ($Node['left'] != $Row['TreeLeft'] || $Node['right'] != $Row['TreeRight'] || $Node['depth'] != $Row['Depth'] || $ParentCategoryID != $Row['ParentCategoryID'] || $Node['left'] != $Row['Sort'] || $PermCatChanged) {
            $Set = array(
                  'TreeLeft' => $Node['left'],
                  'TreeRight' => $Node['right'],
                  'Depth' => $Node['depth'],
                  'Sort' => $Node['left'],
                  'ParentCategoryID' => $ParentCategoryID,
                  'PermissionCategoryID' => $PermissionCategoryID
               );
            
            $this->SQL->Update(
               'Category',
               $Set,
               array('CategoryID' => $CategoryID)
            )->Put();
            
            $Saves[] = array_merge(array('CategoryID' => $CategoryID), $Set);
         }
      }
      self::ClearCache();
      return $Saves;
   }
public function SaveTree($TreeArray) {
      /*
        TreeArray comes in the format:
      '0' ...
        'item_id' => "root"
        'parent_id' => "none"
        'depth' => "0"
        'left' => "1"
        'right' => "34"
      '1' ...
        'item_id' => "1"
        'parent_id' => "root"
        'depth' => "1"
        'left' => "2"
        'right' => "3"
      etc...
      */

      // Grab all of the categories so that permissions can be properly saved.
      $PermTree = $this->SQL->Select('CategoryID, PermissionCategoryID, TreeLeft, TreeRight, Depth, Sort, ParentCategoryID')->From('Category')->Get();
      $PermTree = $PermTree->Index($PermTree->ResultArray(), 'CategoryID');

      // The tree must be walked in order for the permissions to save properly.
      usort($TreeArray, array('CategoryModel', '_TreeSort'));
      $Saves = array();
      
      foreach($TreeArray as $I => $Node) {
         $CategoryID = GetValue('item_id', $Node);
         if ($CategoryID == 'root')
            $CategoryID = -1;
            
         $ParentCategoryID = GetValue('parent_id', $Node);
         if (in_array($ParentCategoryID, array('root', 'none')))
            $ParentCategoryID = -1;

         $PermissionCategoryID = GetValueR("$CategoryID.PermissionCategoryID", $PermTree, 0);
         $PermCatChanged = FALSE;
         if ($PermissionCategoryID != $CategoryID) {
            // This category does not have custom permissions so must inherit its parent's permissions.
            $PermissionCategoryID = GetValueR("$ParentCategoryID.PermissionCategoryID", $PermTree, 0);
            if ($CategoryID != -1 && !GetValueR("$ParentCategoryID.Touched", $PermTree)) {
               throw new Exception("Category $ParentCategoryID not touched before touching $CategoryID.");
            }
            if ($PermTree[$CategoryID]['PermissionCategoryID'] != $PermissionCategoryID)
               $PermCatChanged = TRUE;
            $PermTree[$CategoryID]['PermissionCategoryID'] = $PermissionCategoryID;
         }
         $PermTree[$CategoryID]['Touched'] = TRUE;

         // Only update if the tree doesn't match the database.
         $Row = $PermTree[$CategoryID];
         if ($Node['left'] != $Row['TreeLeft'] || $Node['right'] != $Row['TreeRight'] || $Node['depth'] != $Row['Depth'] || $ParentCategoryID != $Row['ParentCategoryID'] || $Node['left'] != $Row['Sort'] || $PermCatChanged) {
            $Set = array(
                  'TreeLeft' => $Node['left'],
                  'TreeRight' => $Node['right'],
                  'Depth' => $Node['depth'],
                  'Sort' => $Node['left'],
                  'ParentCategoryID' => $ParentCategoryID,
                  'PermissionCategoryID' => $PermissionCategoryID
               );
            
            $this->SQL->Update(
               'Category',
               $Set,
               array('CategoryID' => $CategoryID)
            )->Put();
            
            $Saves[] = array_merge(array('CategoryID' => $CategoryID), $Set);
         }
      }
      self::ClearCache();
      return $Saves;
   }
public function SaveTree ( $ TreeArray ) { /*
        TreeArray comes in the format:
      '0' ...
        'item_id' => "root"
        'parent_id' => "none"
        'depth' => "0"
        'left' => "1"
        'right' => "34"
      '1' ...
        'item_id' => "1"
        'parent_id' => "root"
        'depth' => "1"
        'left' => "2"
        'right' => "3"
      etc...
      */ // Grab all of the categories so that permissions can be properly saved. $ PermTree = $ this -> SQL -> Select ( 'CategoryID, PermissionCategoryID, TreeLeft, TreeRight, Depth, Sort, ParentCategoryID' ) -> From ( 'Category' ) -> Get ( ) ; $ PermTree = $ PermTree -> Index ( $ PermTree -> ResultArray ( ) , 'CategoryID' ) ; // The tree must be walked in order for the permissions to save properly. usort ( $ TreeArray , array ( 'CategoryModel' , '_TreeSort' ) ) ; $ Saves = array ( ) ; foreach ( $ TreeArray as $ I => $ Node ) { $ CategoryID = GetValue ( 'item_id' , $ Node ) ; if ( $ CategoryID == 'root' ) $ CategoryID = - 1 ; $ ParentCategoryID = GetValue ( 'parent_id' , $ Node ) ; if ( in_array ( $ ParentCategoryID , array ( 'root' , 'none' ) ) ) $ ParentCategoryID = - 1 ; $ PermissionCategoryID = GetValueR ( "$CategoryID.PermissionCategoryID" , $ PermTree , 0 ) ; $ PermCatChanged = FALSE ; if ( $ PermissionCategoryID != $ CategoryID ) { // This category does not have custom permissions so must inherit its parent's permissions. $ PermissionCategoryID = GetValueR ( "$ParentCategoryID.PermissionCategoryID" , $ PermTree , 0 ) ; if ( $ CategoryID != - 1 && ! GetValueR ( "$ParentCategoryID.Touched" , $ PermTree ) ) { throw new Exception ( "Category $ParentCategoryID not touched before touching $CategoryID." ) ; } if ( $ PermTree [ $ CategoryID ] [ 'PermissionCategoryID' ] != $ PermissionCategoryID ) $ PermCatChanged = TRUE ; $ PermTree [ $ CategoryID ] [ 'PermissionCategoryID' ] = $ PermissionCategoryID ; } $ PermTree [ $ CategoryID ] [ 'Touched' ] = TRUE ; // Only update if the tree doesn't match the database. $ Row = $ PermTree [ $ CategoryID ] ; if ( $ Node [ 'left' ] != $ Row [ 'TreeLeft' ] || $ Node [ 'right' ] != $ Row [ 'TreeRight' ] || $ Node [ 'depth' ] != $ Row [ 'Depth' ] || $ ParentCategoryID != $ Row [ 'ParentCategoryID' ] || $ Node [ 'left' ] != $ Row [ 'Sort' ] || $ PermCatChanged ) { $ Set = array ( 'TreeLeft' => $ Node [ 'left' ] , 'TreeRight' => $ Node [ 'right' ] , 'Depth' => $ Node [ 'depth' ] , 'Sort' => $ Node [ 'left' ] , 'ParentCategoryID' => $ ParentCategoryID , 'PermissionCategoryID' => $ PermissionCategoryID ) ; $ this -> SQL -> Update ( 'Category' , $ Set , array ( 'CategoryID' => $ CategoryID ) ) -> Put ( ) ; $ Saves [ ] = array_merge ( array ( 'CategoryID' => $ CategoryID ) , $ Set ) ; } } self :: ClearCache ( ) ; return $ Saves ; }
Saves the category tree based on a provided tree array. We are using the
Nested Set tree model.

@ref http://articles.sitepoint.com/article/hierarchical-data-database/2
@ref http://en.wikipedia.org/wiki/Nested_set_model

@since 2.0.16
@access public

@param array $TreeArray A fully defined nested set model of the category tree.
Saves the category tree based on a provided tree array . We are using the Nested Set tree model .