먼저 다중 트리 동작 (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);
}
}
}
프로세스에 매우 손과 미래를 이해하고 가치가 완전히 무슨 일이 일어나고 있는지 이해하는 코드의 유지 보수 측면에서 나무와/또는 지점을 통과하고 복제하는 데이 방법을 사용합니다.
출처
2010-07-21 08:57:58
Leo
아침에 예제를 통해 다시 알려 드리겠습니다. 자정이야. – Leo