Ошибка Gedmo Tree getPath: узел не связан с этим хранилищем. 500 Внутренняя ошибка сервера - InvalidArgumentException

Я получаю ошибку:

Node is not related to this repository
500 Internal Server Error - InvalidArgumentException

ОБНОВЛЕНИЕ 1: не имеет значения, если я настроил древовидный репозиторий с чертами или расширил абстрактный репозиторий, ошибка та же.

ОБНОВЛЕНИЕ 2: Полная трассировка стека http://pastebin.com/TtaJnyzf

Я хочу вывести HTML-дерево с древовидной структурой из базы данных и, в частности, мне нужно получить путь от корня до выбранного узла. Насколько я понимаю, это делается с помощью функции getPath().

Я использую:

  • Symfony v3.0.6;
  • Доктрина v2.5.4
  • StofDoctrineExtensionsBundle [1]

для того, чтобы управлять древовидной структурой.

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

Пока у меня есть древовидная структура в базе данных, и я получаю HTML-дерево, как это:

<?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) use ($repo)
{
    return '<a href="/project_path/'. implode('/', $repo->getPath($node)) .'">'. $node['title'] .'</a>';
}

Как видно из [7] и [8], существует функция getPath(), которая должна возвращать массив элементов из корня в выбранный элемент.

Я думаю, что проблема может заключаться в этом блоке кода:

$repo->getPath($node)

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

1 ответ

Решение

Работай!

Вот необходимые изменения:

вместо

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

надо написать

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

и в категорию категории добавить

public function __toString()
{
    return $this->getTitle();
}

То есть, путь к каждому узлу теперь должен показываться.

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