Share Pastebin
Guest
Public paste!

VKS

By: a guest | Jul 2nd, 2009 | Syntax: PHP | Size: 4.78 KB | Hits: 17 | Expires: Never
Copy text to clipboard
  1. public function change_position_all($id1, $id2, $before = FALSE)
  2.         {
  3.                 if (!is_a($id1, get_class($this))) {
  4.                         $id1 = self::factory($this->object_name, $id1);
  5.                 }
  6.                
  7.                 if (!is_a($id2, get_class($this))) {
  8.                         $id2 = self::factory($this->object_name, $id2);
  9.                 }
  10.                
  11.                 if ($id1->level_column <> $id2->level_column) {
  12.             throw new Kohana_User_Exception('Error change position to node', 'Cannot move nodes with different levels');
  13.         }
  14.                
  15.                 if ($before == TRUE) {
  16.             if ($id1->lft > $id2->lft) {
  17.                 $sql = 'UPDATE ' . $this->table_name . ' SET '
  18.                 . $this->right_column . ' = CASE WHEN ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id1->rgt . ' THEN ' . $this->right_column . ' - ' . ($id1->lft - $id2->lft) . ' '
  19.                 . 'WHEN ' . $this->left_column . ' BETWEEN ' . $id2->lft . ' AND ' . ($id1->lft - 1) . ' THEN ' . $this->right_column . ' +  ' . ($id1->rgt - $id1->lft + 1) . ' ELSE ' . $this->right_column . ' END, '
  20.                 . $this->left_column . ' = CASE WHEN ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id1->rgt . ' THEN ' . $this->left_column . ' - ' . ($id1->lft - $id2->lft) . ' '
  21.                 . 'WHEN ' . $this->left_column . ' BETWEEN ' . $id2->lft . ' AND ' . ($id1->lft - 1) . ' THEN ' . $this->left_column . ' + ' . ($id1->rgt - $id1->lft + 1) . ' ELSE ' . $this->left_column . ' END '
  22.                 . 'WHERE ' . $this->left_column . ' BETWEEN ' . $id2->lft . ' AND ' . $id1->rgt;
  23.             } else {
  24.                 $sql = 'UPDATE ' . $this->table_name . ' SET '
  25.                 . $this->right_column . ' = CASE WHEN ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id1->rgt . ' THEN ' . $this->right_column . ' + ' . (($id2->lft - $id1->lft) - ($id1->rgt - $id1->lft + 1)) . ' '
  26.                 . 'WHEN ' . $this->left_column . ' BETWEEN ' . ($id1->rgt + 1) . ' AND ' . ($id2->lft - 1) . ' THEN ' . $this->right_column . ' - ' . (($id1->rgt - $id1->lft + 1)) . ' ELSE ' . $this->right_column . ' END, '
  27.                 . $this->left_column . ' = CASE WHEN ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id1->rgt . ' THEN ' . $this->left_column . ' + ' . (($id2->lft - $id1->lft) - ($id1->rgt - $id1->lft + 1)) . ' '
  28.                 . 'WHEN ' . $this->left_column . ' BETWEEN ' . ($id1->rgt + 1) . ' AND ' . ($id2->lft - 1) . ' THEN ' . $this->left_column . ' - ' . ($id1->rgt - $id1->lft + 1) . ' ELSE ' . $this->left_column . ' END '
  29.                 . 'WHERE ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . ($id2->lft - 1);
  30.             }
  31.         }
  32.                 else
  33.                 {
  34.             if ($id1->lft > $id2->lft) {
  35.                 $sql = 'UPDATE ' . $this->table_name . ' SET '
  36.                 . $this->right_column . ' = CASE WHEN ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id1->rgt . ' THEN ' . $this->right_column . ' - ' . ($id1->lft - $id2->lft - ($id2->rgt - $id2->lft + 1)) . ' '
  37.                 . 'WHEN ' . $this->left_column . ' BETWEEN ' . ($id2->rgt + 1) . ' AND ' . ($id1->lft - 1) . ' THEN ' . $this->right_column . ' +  ' . ($id1->rgt - $id1->lft + 1) . ' ELSE ' . $this->right_column . ' END, '
  38.                 . $this->left_column . ' = CASE WHEN ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id1->rgt . ' THEN ' . $this->left_column . ' - ' . ($id1->lft - $id2->lft - ($id2->rgt - $id2->lft + 1)) . ' '
  39.                 . 'WHEN ' . $this->left_column . ' BETWEEN ' . ($id2->rgt + 1) . ' AND ' . ($id1->lft - 1) . ' THEN ' . $this->left_column . ' + ' . ($id1->rgt - $id1->lft + 1) . ' ELSE ' . $this->left_column . ' END '
  40.                 . 'WHERE ' . $this->left_column . ' BETWEEN ' . ($id2->rgt + 1) . ' AND ' . $id1->rgt;
  41.             } else {
  42.                 $sql = 'UPDATE ' . $this->table_name . ' SET '
  43.                 . $this->right_column . ' = CASE WHEN ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id1->rgt . ' THEN ' . $this->right_column . ' + ' . ($id2->rgt - $id1->rgt) . ' '
  44.                 . 'WHEN ' . $this->left_column . ' BETWEEN ' . ($id1->rgt + 1) . ' AND ' . $id2->rgt . ' THEN ' . $this->right_column . ' - ' . (($id1->rgt - $id1->lft + 1)) . ' ELSE ' . $this->right_column . ' END, '
  45.                 . $this->left_column . ' = CASE WHEN ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id1->rgt . ' THEN ' . $this->left_column . ' + ' . ($id2->rgt - $id1->rgt) . ' '
  46.                 . 'WHEN ' . $this->left_column . ' BETWEEN ' . ($id1->rgt + 1) . ' AND ' . $id2->rgt . ' THEN ' . $this->left_column . ' - ' . ($id1->rgt - $id1->lft + 1) . ' ELSE ' . $this->left_column . ' END '
  47.                 . 'WHERE ' . $this->left_column . ' BETWEEN ' . $id1->lft . ' AND ' . $id2->rgt;
  48.             }
  49.                 }
  50.                
  51.                 $this->lock();
  52.                
  53.                 $this->db->query($sql);
  54.                
  55.                 $this->unlock();
  56.                
  57.                 $this->reload();
  58.         }