Ошибка 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] https://github.com/stof/StofDoctrineExtensionsBundle на GitHub;
- [2] документация stofDoctrineExtensinsBundnle на Symfony.com;
- [3] Документация Gedmo Tree на GitHub;
- [4] Пример Gedmo Tree > Tree Entity;
- [5] Gedmo Tree> Основной пример использования;
- [6] Пример вывода дерева html;
- [7] NestedTreeRepository использует NestedTreeRepositoryTrait
- [8] NestedTreeRepositoryTrait имеет функцию "getPath()".
Пожалуйста, порекомендуйте. Спасибо за ваше время и знания.
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();
}
То есть, путь к каждому узлу теперь должен показываться.