序章
ツリー構造を管理するために、Symfony v3.1.6、Doctrine v2.5.4、および StofDoctrineExtensionsBundle [1] を使用しています。
ツリー構造をセットアップするには、Symfony.com [2] のドキュメントを使用し、続いて GitHub [3] のドキュメントを使用しました。次に、ツリーのセットアップに進みました。例 [4] のツリー エンティティを使用し、[5] のコードを使用してツリーを作成しました。
- [1] GitHub の stofDoctrineExtensionsBundle ;
- [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
各ツリー要素にあります。
結論
お知らせ下さい。
お時間と知識をありがとうございました。