ツリー構造を管理するために、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));
}
}
次のように1行を変更すると:
'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
- [1] GitHub の stofDoctrineExtensionsBundle ;
- [2] Symfony.com の stofDoctrineExtensinsBundnle ドキュメント;
- [3] GitHub の Gedmo ツリーのドキュメント。
- [4] Gedmo ツリー > ツリー エンティティの例;
- [5] Gedmo ツリー > 基本的な使用例;
- [6]使用しませんでした: Gedmo Tree > Tree Repositories ;
- [7] Gedmo ツリー > 抽象リポジトリを使用します。
- [8]ツリー html 出力例;
- [9] NestedTreeRepository にはメソッド getPath() があります。
[9] で見られるように、NestedTreeRepositry にはメソッド getPath() があります。
更新: [6] を試しましたが、設定できませんでした。それから [7] セットアップを試みましたが、それでもエラーは同じままです!
お知らせ下さい。お時間と知識をありがとうございました。