2010-07-20 3 views
0

나는 나무로서 행동하는 parent_id를 가진 하나의 모델로 구성된 트리 구조의 복사본을 만드는 쉬운 방법이 있는지 궁금하다.CakePHP : 트리 구조를 쉽게 복제/딥 복사 하시겠습니까?

나는 주어진 tree를 재귀 적으로 통과해야하고, 모든 id와 lft, rght 필드를 제거해야한다고 생각했다; 그러나 새 필드를 추가 할 때 parent_id는 올바르게 일치하지 않습니다. 이 문제를 처리하기 위해 자체 함수를 작성하는 것이 쉬워야한다고 생각하지만,이 문제를 처리 할 수있는 것이 있는지 알고 싶었습니다.

감사합니다.

+0

아침에 예제를 통해 다시 알려 드리겠습니다. 자정이야. – Leo

답변

1

먼저 다중 트리 동작 (http://bakery.cakephp.org/articles/view/multitree-behavior)을 사용하여 하나의 테이블에서 여러 트리를 관리 할 수 ​​있습니다.

예제가 약간 복잡하고 특정 애플리케이션 코드와 혼동을 일으킬 수 있습니다.하지만 그 방법을 선택하는 것이 좋습니다.

트리를 사용하는 거의 모든 작업에는 재귀 '트리 워커'가 필요합니다. 나는 등 하위 작업과 작업 관리자를 쓴이 내가 나무를 걸어 사용하는 방법의 예입니다

function _walkTasksTree($nodes, $model='Task') 
{ 
    foreach($nodes as $node) 
    { 
     $task = $node[$model]; 
     $id = $task['id']; 
     $title = $task['name']; 
     $level = $task['level']; 

     $children = $this->_walkTasksTree($node['children'],$model); 

     if(empty($children)) 
     { 
      $data[$id] = array('level'=>$level,'title'=>$title); 
     } 
     else 
     { 
      $data[$id] = array('level'=>$level,'title'=>$title,'children' => $children); 
     } 
    } 
    $data = (isset($data))?$data:array(); 
    return $data; 
} 

내 응용 프로그램 프로젝트로 복제 할 수있는 일반적인 작업의 '저장소'이 . 기본 모델은 ProjectTask [1 : 1] ProjectTaskDescriptor - 데이터를 포함하는 설명 자 및 트리 위치를 유지하는 태스크입니다. 나는

그것은
function _saveTaskTree($subTasks,$parent_id,$root_id,$projId,$exclude=null) 
{ 
    foreach($subTasks as $node) 
    { 
     if(@$exclude!=$node['Task']['id']) 
     { 
      $node['Task']['id'] = null; 
      $node['Task']['root_id'] = $root_id; 
      $node['Task']['parent_id'] = $parent_id; 
      $node['Task']['project_id'] = $projId; 
      $this->ProjectTask->create(); 
      $saved = $this->ProjectTask->save($node['Task']); 
      $this->ProjectTaskDescriptor->create(); 
      $PTD = $node['TaskDescriptor']; 
      $PTD['project_task_id'] = $this->ProjectTask->id; 
      $this->ProjectTaskDescriptor->save($PTD); 
     } 
     else 
     { 
      $saved = true; //skip the first one - we've already done it. 
     } 
     if($saved) 
     { 
      if(@$node['children']) 
       $children = $this->_saveTaskTree($node['children'],$this->ProjectTask->id,$root_id,$projId); 
     } 
    } 
} 

프로세스에 매우 손과 미래를 이해하고 가치가 완전히 무슨 일이 일어나고 있는지 이해하는 코드의 유지 보수 측면에서 나무와/또는 지점을 통과하고 복제하는 데이 방법을 사용합니다.

+0

아, 알겠습니다. 참으로, 그것은 의미가 있습니다, 나는 내 마음 속에 같은 개념을 가지고있었습니다! 이미 자동화 된 상태 였으면 좋겠다. 예를 들어 주셔서 감사합니다! – Parris

관련 문제