介绍
我正在使用 Symfony v3.1.6、Doctrine v2.5.4 和 StofDoctrineExtensionsBundle [1] 来管理树结构。
为了设置树结构,我使用了 Symfony.com [2] 上的文档,然后是 GitHub [3] 上的文档。然后我继续进行树设置 - 使用示例 [4] 中的树实体并使用 [5] 中的代码创建树。
- [1] stofDoctrineExtensionsBundle 在 GitHub 上;
- [2] Symfony.com 上的 stofDoctrineExtensinsBundnle 文档;
- [3] GitHub 上的 Gedmo 树文档;
- [4] Gedmo 树 > 树实体示例;
- [5] Gedmo 树 > 基本使用示例;
问题
我想处理parent_id
树的每个元素,但我不知道如何正确地做到这一点。
编码
控制器
/**
* @Route("/tree12", name="tree12")
*/
public function tree12Action(Request $request)
{
$em = $this->getDoctrine()->getManager();
$repo = $em->getRepository('AppBundle:Category');
$rootId = 19;
$query = $em
->createQueryBuilder()
->select('node')
->from('AppBundle:Category', 'node')
->where('node.root = '. $rootId)
->orderBy('node.root, node.lft', 'ASC')
->getQuery();
$build_my_tree = $query->getArrayResult();
$ultra = $this->get('app.ultrahelpers');
$build_my_tree = $ultra->prepareTreeData($build_my_tree);
//var_dump($build_my_tree);
$options = array(
'decorate' => true,
'rootOpen' => '<ul>',
'rootClose' => '</ul>',
'childOpen' => function($node)
{
if (array_key_exists('assigned_root_node', $node))
{
if ($node['assigned_root_node'] === true)
{
return '<li data-jstree=\'{"type":"root"}\'>';
}
}
else if ($node['is_file'] === true)
{
return '<li data-jstree=\'{"type":"file"}\'>';
}
else if ($node['is_file'] === false)
{
if ($node['title'] === 'Saursliezu_dzelzcels')
{
return '<li data-jstree=\'{"type":"home"}\'>';
}
else
{
return '<li data-jstree=\'{"type":"folder"}\'>';
}
}
},
'childClose' => '</li>',
'nodeDecorator' => function($node) use ($repo)
{
dump($node);
if (array_key_exists('assigned_root_node', $node))
{
if ($node['assigned_root_node'] === true)
{
$link_class = 'magenta';
}
//$parent_node_id = $node['parent_id'];
//$parent_node_id = $repo->getParentId($repo->findOneBy(array('id' => $node['id'])));
}
else if ($node['is_file'] === true)
{
$link_class = 'blue';
if ($node['title'] === 'aaa.txt')
{
$link_class = 'red';
}
else if ($node['title'] === 'bbb.txt')
{
$link_class = 'green';
}
//$parent_node_id = $node['parent_id'];
$parent_node_id = $repo->getParentId($repo->findOneBy(array('id' => $node['id'])));
}
else if ($node['is_file'] === false)
{
if ($node['title'] === 'Saursliezu_dzelzcels')
{
$link_class = 'red';
}
else
{
$link_class = 'black';
}
//$parent_node_id = $node['parent_id'];
$parent_node_id = $repo->getParentId($repo->findOneBy(array('id' => $node['id'])));;
}
return '<a data-parent-id="'. $parent_node_id .'" class="'. $link_class .'" href="/project_path/">'. $node['title'] .'</a>';
}
);
$tree = $repo->buildTree($build_my_tree, $options);
var_dump($tree);
return $this->render('tree/tree12_show.html.twig', array('tree' => $tree));
}
构建树数据数组
$rootId = 19;
$query = $em
->createQueryBuilder()
->select('node')
->from('AppBundle:Category', 'node')
->where('node.root = '. $rootId)
->orderBy('node.root, node.lft', 'ASC')
->getQuery();
$build_my_tree = $query->getArrayResult();
当我转储时,$build_my_tree
我得到:
array (size=6)
0 =>
array (size=7)
'id' => int 1
'title' => string ' Food' (length=10)
'is_file' => boolean false
'lft' => int 1
'lvl' => int 0
'rgt' => int 12
'assigned_root_node' => boolean true
1 =>
array (size=6)
'id' => int 2
'title' => string 'Fruits' (length=6)
'is_file' => boolean false
'lft' => int 2
'lvl' => int 1
'rgt' => int 3
2 =>
array (size=6)
'id' => int 3
'title' => string 'Vegetables' (length=10)
'is_file' => boolean false
'lft' => int 4
'lvl' => int 1
'rgt' => int 11
3 =>
array (size=6)
'id' => int 4
'title' => string 'Carrots' (length=7)
'is_file' => boolean false
'lft' => int 5
'lvl' => int 2
'rgt' => int 6
etc...
但我想得到以下信息:
array (size=6)
0 =>
array (size=7)
'id' => int 1
'title' => string ' Food' (length=10)
'is_file' => boolean false
'lft' => int 1
'lvl' => int 0
'rgt' => int 12
'assigned_root_node' => boolean true
'parent_id' => int 0
1 =>
array (size=6)
'id' => int 2
'title' => string 'Fruits' (length=6)
'is_file' => boolean false
'lft' => int 2
'lvl' => int 1
'rgt' => int 3
'parent_id' => int 1
2 =>
array (size=6)
'id' => int 3
'title' => string 'Vegetables' (length=10)
'is_file' => boolean false
'lft' => int 4
'lvl' => int 1
'rgt' => int 11
'parent_id' => int 1
3 =>
array (size=6)
'id' => int 4
'title' => string 'Carrots' (length=7)
'is_file' => boolean false
'lft' => int 5
'lvl' => int 2
'rgt' => int 6
'parent_id' => int 3
etc...
那是parent_id
在每个树元素中。
结论
请指教。
感谢您的时间和知识。