Как получить путь элемента дерева Gedmo, используя symfony3, doctrine2 и stofDoctrineExtensionsBundle

Я использую Symfony v3.0.4, Doctrine v2.5.4 и StofDoctrineExtensionsBundle [1] для управления древовидной структурой.

Для настройки древовидной структуры я использовал документацию на Symfony.com [2], а затем документацию на GitHub [3].

Затем я приступил к настройке дерева - использовал сущность дерева из примера [4] и использовал код в [5] для создания дерева.

Я не использовал [6] и [7], так как это кажется необязательным (насколько я могу судить, дерево работает и отображается без него). Смотрите обновление.

Пока у меня есть древовидная структура в базе данных, и для ее отображения я изменил пример [8]. Как это:

<?php

namespace AppBundle\Controller;

use AppBundle\Entity\Category;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class TreeController extends Controller
{
    /**
     * @Route("/tree", name="tree")
     */
    public function treeAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();

        $repo = $em->getRepository('AppBundle:Category');
        $options = array(
            'decorate' => true,
            'rootOpen' => '<ul>',
            'rootClose' => '</ul>',
            'childOpen' => '<li>',
            'childClose' => '</li>',
            'nodeDecorator' => function($node) {
                return '<a href="/some_path/...">'. $node['title'] .'</a>';
            }
        );

        $htmlTree = $repo->childrenHierarchy(
            null, /* starting from root nodes */
            false, /* false: load all children, true: only direct */
            $options
        );

        return $this->render('tree/tree_show.html.twig', array('project_tree' => $htmlTree));
    }
}

если я изменю одну строку следующим образом:

'nodeDecorator' => function($node) {
    return '<a href="/project_path/'. implode('/', getPath($node)) .'">'. $node['title'] .'</a>';
}

чтобы получить путь к каждому элементу дерева, я получаю ошибку:

Fatal error: Call to undefined function AppBundle\Controller\getPath()
500 Internal Server Error - FatalThrowableError

Как видно из [9], NestedTreeRepositry имеет метод getPath().

Обновление: я попытался [6], но не смог настроить его. Затем я попытался [7] настроить его нормально, но ошибка остается прежней!

Пожалуйста, порекомендуйте. Спасибо за ваше время и знания.

2 ответа

Решение

Использовать functon getPath() что существует в

"vendor/gedmo/doctrine-extensions/lib/Gedmo/Tree/Entity/Repository" in the file "NestedTreeRepository.php"

или в

"vendor/gedmo/doctrine-extensions/lib/Gedmo/Tree/Traits/Repository/ORM" in the file "NestedTreeRepositoryTrait.php"

нужно изменить блок кода следующим образом:

nodeDecorator' => function($node) use ($repo)
{
    return '<a href="/project_path/'. @implode('/', $repo->getPath($repo->findOneBy(array('id' => $node['id'])))) .'">'. $node['title'] .'</a>';
}

примечание добавлено

use ($repo)

а также

@implode('/', $repo->getPath($repo->findOneBy(array('id' => $node['id']))))

с этим - не должно быть undefined function ошибка

У меня была такая же проблема, поэтому я использовал getPathInfo() вместо этого, и это работало нормально.

Другие вопросы по тегам