Снова dbtree

FANTAzeRus

Guest
Снова dbtree

Поделитесь пожалуйста СТАБИЛЬНОЙ функцией moveAll для dbtree

Та которая в dbtree 1.3 безбожно глючит ... :-(
 

Макс

Старожил PHPClub
PHP:
   function moveAll($ID, $newParentId) {
      if(!(list($leftId, $rightId, $level) = $this->getNodeInfo($ID))) die("phpDbTree error: ".$this->db->error());
      if(!(list($leftIdP, $rightIdP, $levelP) = $this->getNodeInfo($newParentId))) die("phpDbTree error: ".$this->db->error());
      if($ID == $newParentId || $leftId == $leftIdP || ($leftIdP >= $leftId && $leftIdP <= $rightId)) return false;

      // если происходит перемещение вверх по родительской оси
      if ($leftIdP < $leftId && $rightIdP > $rightId && $levelP < $level - 1 ) {
         $this->sql = 'UPDATE '.$this->table.' SET '
            . $this->level.'=IF('.$this->left.' BETWEEN '.$leftId.' AND '.$rightId.', '.$this->level.sprintf('%+d', -($level-1)+$levelP).', '.$this->level.'), '
            . $this->right.'=IF('.$this->right.' BETWEEN '.($rightId+1).' AND '.($rightIdP-1).', '.$this->right.'-'.($rightId-$leftId+1).', '
                           .'IF('.$this->left.' BETWEEN '.($leftId).' AND '.($rightId).', '.$this->right.'+'.((($rightIdP-$rightId-$level+$levelP)/2)*2 + $level - $levelP - 1).', '.$this->right.')),  '
            . $this->left.'=IF('.$this->left.' BETWEEN '.($rightId+1).' AND '.($rightIdP-1).', '.$this->left.'-'.($rightId-$leftId+1).', '
                           .'IF('.$this->left.' BETWEEN '.$leftId.' AND '.($rightId).', '.$this->left.'+'.((($rightIdP-$rightId-$level+$levelP)/2)*2 + $level - $levelP - 1).', '.$this->left. ')) '
            . 'WHERE '.$this->left.' BETWEEN '.($leftIdP+1).' AND '.($rightIdP-1)
         ;
      } elseif($leftIdP < $leftId) {
         $this->sql = 'UPDATE '.$this->table.' SET '
            . $this->level.'=IF('.$this->left.' BETWEEN '.$leftId.' AND '.$rightId.', '.$this->level.sprintf('%+d', -($level-1)+$levelP).', '.$this->level.'), '
            . $this->left.'=IF('.$this->left.' BETWEEN '.$rightIdP.' AND '.($leftId-1).', '.$this->left.'+'.($rightId-$leftId+1).', '
               . 'IF('.$this->left.' BETWEEN '.$leftId.' AND '.$rightId.', '.$this->left.'-'.($leftId-$rightIdP).', '.$this->left.') '
            . '), '
            . $this->right.'=IF('.$this->right.' BETWEEN '.$rightIdP.' AND '.$leftId.', '.$this->right.'+'.($rightId-$leftId+1).', '
               . 'IF('.$this->right.' BETWEEN '.$leftId.' AND '.$rightId.', '.$this->right.'-'.($leftId-$rightIdP).', '.$this->right.') '
            . ') '
            . 'WHERE '.$this->left.' BETWEEN '.$leftIdP.' AND '.$rightId
            // !!! added this line (Maxim Matyukhin)
            .' OR '.$this->right.' BETWEEN '.$leftIdP.' AND '.$rightId
         ;
      } else {
         $this->sql = 'UPDATE '.$this->table.' SET '
            . $this->level.'=IF('.$this->left.' BETWEEN '.$leftId.' AND '.$rightId.', '.$this->level.sprintf('%+d', -($level-1)+$levelP).', '.$this->level.'), '
            . $this->left.'=IF('.$this->left.' BETWEEN '.$rightId.' AND '.$rightIdP.', '.$this->left.'-'.($rightId-$leftId+1).', '
               . 'IF('.$this->left.' BETWEEN '.$leftId.' AND '.$rightId.', '.$this->left.'+'.($rightIdP-1-$rightId).', '.$this->left.')'
            . '), '
            . $this->right.'=IF('.$this->right.' BETWEEN '.($rightId+1).' AND '.($rightIdP-1).', '.$this->right.'-'.($rightId-$leftId+1).', '
               . 'IF('.$this->right.' BETWEEN '.$leftId.' AND '.$rightId.', '.$this->right.'+'.($rightIdP-1-$rightId).', '.$this->right.') '
            . ') '
            . 'WHERE '.$this->left.' BETWEEN '.$leftId.' AND '.$rightIdP
            // !!! added this line (Maxim Matyukhin)
            . ' OR '.$this->right.' BETWEEN '.$leftId.' AND '.$rightIdP
         ;
      }
      return $this->db->query($this->sql) or die("phpDbTree error: ".$this->db->error());
   }
Если у тебя это глючит, то опиши глюки более подробно.
 
Сверху