2010-07-20 70 views
0

我在想,是否有一种简单的方法可以制作一个由一个模型构成的树结构的副本,并且parent_id扮演着一棵树的角色?CakePHP:轻松复制/深度复制树结构?

我想这应该很容易递归通过给定的树,删除所有ID和LFT,RIGHT字段;但是,因为我添加新的字段parent_id将无法正确匹配。我想应该很容易编写我自己的函数来处理这个问题,但我只想知道是否已经有一些东西可以解决这个问题了。

谢谢!

+0

我会在早上回复你的例子!这是午夜。 – Leo 2010-07-20 21:58:58

回答

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

Ahhhh,我seee!是的,这是有道理的,我在脑海里有同样的概念!我希望它已经自动化了。感谢这个例子! – Parris 2010-07-21 18:59:08