2016-12-05 32 views
0

我正在使用 laravel包以及jstree jQuery插件來管理類別。etrepat/baum laravel包中缺少makeNthChildOf()方法

在jstree中有一個move_node.jstree用於移動節點的方法。它具有有用的屬性來獲取有關移動動作的信息,如parentold _parent,...和position,它返回父節點中移動的子節點的新位置。

另一方面也有移動節點的方法(here)。但是沒有像makeNthChildOf()這樣的方法可用於將子節點放置在父節點的特定位置。像:

$node->makeNthChildOf(newPosition , $parent) 
在客戶端

現在移動我寫了這個節點:

$treeview.on('move_node.jstree', function (e, data) { 
      $.post('/move', { 
       'CategoryID': data.node.id, 
       'newParent': data.parent, 
       'oldParent': data.old_parent 
      }, function (res) { 
       data.instance.open_node(data.parent); 
      }, 'json'); 
     }); 

而在laravel:

public function move (Request $request) 
    { 
     $data = $request->only('newParent', 'oldParent', 'CategoryID'); 

     $currentNode = Category::find($data['CategoryID']); 
     if ($data['newParent'] == '#') { 
      $currentNode->makeRoot(); 
     } else { 
      $currentNode->makeChildOf($data['newParent']); 
     } 

     return ['success' => true]; 
    } 

但上面的代碼不能這樣做,我想和剛可以將父節點從父節點移動到另一個父節點。

我想知道是否有任何替代方法來做到這一功能?

回答

0

好吧,我相信我找到了一種方法來實現這一點。我只是把它很快在一起,所以比較遺憾的是醜陋的代碼:

首先,我用ajax,所以我建立了

formData = "node_id=" + data.node.id + "&name=" + data.node.text + "&_token=" + $("input[name=_token]").val() + "&parent=" + data.parent + "&position=" + data.position + "&old_position=" + data.old_position + "&old_parent=" + data.old_parent; 

接下來,我們創建了一個快速的輔助功能的節點信息的表單數據來確定我們當前節點在什麼位置。它將循環遍歷父節點的所有後繼者並從字面上計數它們。

private function findPosition($decendants, $position) { 
    $i = 0; 
    foreach ($decendants as $decendant) { 
     if ($i == $position) { 
      return $decendant; 
     } 
     $i++; 
    } 
} 

,然後我們可以移動節點到它的正確位置:

//We first need to account for moving within same node, but below it's current position. Without this the node will be moved 1 position off. 
    if ($parent == $old_parent) { 
     if ($position > $old_position) { 
      $position = $position +1; 
     } 
    } 

    $parent = BaumTest::find($parent); 
    $decendants = $parent->getImmediateDescendants(); 
    $moveTo = $this->findPosition($decendants, $position); 
    $node = BaumTest::find($node_id); 

//If the parent we are moving to doesn't have any decendents, just move it now 
    if ($parent->isLeaf()) { 
     $node->makeChildOf($parent); 
     return array("error"=>false, "successMessage"=>"Sucessfully Moved!"); 
    } 

    //This takes care of it we are moving it into the last position 
    if (is_null($moveTo)) { 
     $node->makeLastChildOf($parent); 
     return array("error"=>false, "successMessage"=>"Sucessfully Moved!"); 
    } 

$node->moveToLeftOf($moveTo);