-1

介绍

我正在使用 Symfony v3.1.6、Doctrine v2.5.4 和 StofDoctrineExtensionsBundle [1] 来管理树结构。

为了设置树结构,我使用了 Symfony.com [2] 上的文档,然后是 GitHub [3] 上的文档。然后我继续进行树设置 - 使用示例 [4] 中的树实体并使用 [5] 中的代码创建树。

问题

我想处理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 '&nbsp;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 '&nbsp;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在每个树元素中。

结论

请指教。

感谢您的时间和知识。

4

1 回答 1

1

事实证明,在使用时必须提示获取所有相关值getArrayResult

Vanilla answer [1] 对我不起作用,所以我做了一些修改(查询的完整路径)。

工作代码:

$query = $em
    ->createQueryBuilder()
    ->select('node')
    ->from('AppBundle:Category', 'node')
    ->where('node.root = '. $rootId)
    ->orderBy('node.root, node.lft', 'ASC')
    ->getQuery();

$query->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true);
$build_my_tree = $query->getArrayResult();

请注意,提示正在进行,$query并且位于查询和获取结果之间。

链接:

  1. 在这里找到初始信息
  2. 关于提示的文档
于 2016-11-01T22:30:24.067 回答