1

Я использую Symfony v3.0.4, Doctrine v2.5.4 и StofDoctrineExtensionsBundle [1] для управления структурой дерева.Как получить элемент элемента дерева Gedmo с помощью symfony3, doctrine2 и stofDoctrineExtensionsBundle

Чтобы настроить структуру дерева, я использовал документацию на 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] настроить его нормально, но ошибка остается прежней!

Просьба сообщить. Спасибо за ваше время и знания.

ответ

1

Чтобы использовать 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 ошибку

1

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