diff --git a/DependencyInjection/CmfMenuExtension.php b/DependencyInjection/CmfMenuExtension.php index d177c7de..dc6840f4 100644 --- a/DependencyInjection/CmfMenuExtension.php +++ b/DependencyInjection/CmfMenuExtension.php @@ -45,6 +45,7 @@ public function load(array $configs, ContainerBuilder $container) public function loadVoters($config, XmlFileLoader $loader, ContainerBuilder $container) { $loader->load('voters.xml'); + if (isset($config['voters']['content_identity'])) { if (empty($config['voters']['content_identity']['content_key'])) { if (! class_exists('Symfony\\Cmf\\Bundle\\RoutingBundle\\Routing\\DynamicRouter')) { @@ -59,7 +60,7 @@ public function loadVoters($config, XmlFileLoader $loader, ContainerBuilder $con $container->removeDefinition('cmf_menu.current_item_voter.content_identity'); } - if (! isset($config['voters']['uri_prefix'])) { + if (!array_key_exists('uri_prefix', $config['voters'])) { $container->removeDefinition('cmf_menu.current_item_voter.uri_prefix'); } } diff --git a/Tests/Resources/Controller/VoterController.php b/Tests/Resources/Controller/VoterController.php new file mode 100644 index 00000000..c2ff94ac --- /dev/null +++ b/Tests/Resources/Controller/VoterController.php @@ -0,0 +1,59 @@ +container->get('doctrine_phpcr.odm.document_manager'); + } + + public function defaultAction(Request $request) + { + return $this->render('::tests/voter/default.html.twig'); + } + + public function requestContentIdentityAction(Request $request) + { + $content = $request->get(DynamicRouter::CONTENT_KEY); + if (!$content) { + $content = $this->getDm()->find(null, '/test/content-1'); + $request->attributes->set(DynamicRouter::CONTENT_KEY, $content); + + return $this->render('::tests/voter/requestContentVoterActive.html.twig', array('content' => $content)); + } + + return $this->render('::tests/voter/requestContent.html.twig', array('content' => $content)); + } + + public function blogAction(Request $request) + { + return $this->render('::tests/voter/blog.html.twig'); + } + + public function articlesAction(Request $request) + { + return $this->render('::tests/voter/articles.html.twig'); + } + + public function postAction(Request $request) + { + $content = $request->get(DynamicRouter::CONTENT_KEY); + return $this->render('::tests/voter/post.html.twig', array('content' => $content)); + } + + public function urlPrefixAction(Request $request) + { + return $this->render('::tests/voter/requestContent.html.twig', array('content' => $content)); + } +} diff --git a/Tests/Resources/DataFixtures/PHPCR/LoadMenuData.php b/Tests/Resources/DataFixtures/PHPCR/LoadMenuData.php index f26ada8c..1a9da220 100644 --- a/Tests/Resources/DataFixtures/PHPCR/LoadMenuData.php +++ b/Tests/Resources/DataFixtures/PHPCR/LoadMenuData.php @@ -15,13 +15,21 @@ use Doctrine\Common\DataFixtures\FixtureInterface; use Doctrine\Common\Persistence\ObjectManager; use Doctrine\Common\DataFixtures\DependentFixtureInterface; +use Doctrine\ODM\PHPCR\DocumentManager; use Symfony\Cmf\Bundle\MenuBundle\Doctrine\Phpcr\MenuNode; use Symfony\Cmf\Bundle\MenuBundle\Doctrine\Phpcr\Menu; use Symfony\Cmf\Bundle\MenuBundle\Tests\Resources\Document\Content; +use Symfony\Cmf\Bundle\MenuBundle\Tests\Resources\Document\Post; use Doctrine\ODM\PHPCR\Document\Generic; +use Symfony\Cmf\Bundle\RoutingBundle\Doctrine\Phpcr\Route; +use PHPCR\Util\NodeHelper; class LoadMenuData implements FixtureInterface, DependentFixtureInterface { + protected $root; + protected $menuRoot; + protected $routeRoot; + public function getDependencies() { return array( @@ -31,20 +39,29 @@ public function getDependencies() public function load(ObjectManager $manager) { - $content = new Content; - $content->setTitle('Content 1'); - $content->setId('/test/content-1'); + $this->root = $manager->find(null, '/test'); + + NodeHelper::createPath($manager->getPhpcrSession(), '/test/menus'); + NodeHelper::createPath($manager->getPhpcrSession(), '/test/routes/contents'); + $this->menuRoot = $manager->find(null, '/test/menus'); + $this->routeRoot = $manager->find(null, '/test/routes'); - $root = $manager->find(null, '/test'); - $menuRoot = new Generic; - $menuRoot->setNodename('menus'); - $menuRoot->setParent($root); - $manager->persist($menuRoot); + $this->loadMainMenu($manager); + $this->loadVoterMenu($manager); + + $manager->flush(); + } + + protected function loadMainMenu(DocumentManager $manager) + { + $content = new Content; + $content->setTitle('Menu Item Content 1'); + $content->setId('/test/content-menu-item-1'); $menu = new Menu; $menu->setName('test-menu'); $menu->setLabel('Test Menu'); - $menu->setParent($menuRoot); + $menu->setParent($this->menuRoot); $manager->persist($menu); $menuNode = new MenuNode; @@ -94,7 +111,7 @@ public function load(ObjectManager $manager) $menu = new Menu; $menu->setName('another-menu'); $menu->setLabel('Another Menu'); - $menu->setParent($menuRoot); + $menu->setParent($this->menuRoot); $manager->persist($menu); $menuNode = new MenuNode; @@ -113,6 +130,107 @@ public function load(ObjectManager $manager) $manager->persist($menuNode); $manager->persist($content); - $manager->flush(); + } + + protected function loadVoterMenu(DocumentManager $manager) + { + // test content + $content = new Content; + $content->setTitle('Content 1'); + $content->setId('/test/content-1'); + $manager->persist($content); + + $route = new Route(); + $route->setId('/test/routes/contents/content-1'); + $route->setDefault('_controller', 'Symfony\Cmf\Bundle\MenuBundle\Tests\Resources\Controller\VoterController::requestContentIdentityAction'); + $route->setContent($content); + $manager->persist($route); + + // test blog + $blog = new Content; + $blog->setTitle('Blog'); + $blog->setId('/test/blog-1'); + $manager->persist($blog); + + $route = new Route(); + $route->setId('/test/routes/blog'); + $route->setDefault('_controller', 'Symfony\Cmf\Bundle\MenuBundle\Tests\Resources\Controller\VoterController::blogAction'); + $route->setContent($blog); + $manager->persist($route); + + // test blog post + $post = new Post; + $post->setTitle('My Post'); + $post->setId('/test/blog-1/my-post'); + $manager->persist($post); + + $route = new Route(); + $route->setId('/test/routes/blog/my-post'); + $route->setDefault('_controller', 'Symfony\Cmf\Bundle\MenuBundle\Tests\Resources\Controller\VoterController::postAction'); + $route->setContent($post); + $manager->persist($route); + + // test articles + $articles = new Content; + $articles->setTitle('Articles Index'); + $articles->setId('/test/articles'); + $manager->persist($articles); + + $articlesRoute = new Route(); + $articlesRoute->setId('/test/routes/articles'); + $articlesRoute->setDefault('_controller', 'Symfony\Cmf\Bundle\MenuBundle\Tests\Resources\Controller\VoterController::articlesAction'); + $articlesRoute->setContent($articles); + $articlesRoute->setOption('currentUriPrefix', '/articles'); + $manager->persist($articlesRoute); + + $article1 = new Content(); + $article1->setTitle('Article 1'); + $article1->setId('/test/article-1'); + $manager->persist($article1); + + $route = new Route(); + $route->setId('/test/routes/articles/some-category'); + $manager->persist($route); + + $route = new Route(); + $route->setId('/test/routes/articles/some-category/article-1'); + $route->setDefault('_controller', 'Symfony\Cmf\Bundle\MenuBundle\Tests\Resources\Controller\VoterController::postAction'); + $route->setContent($article1); + $manager->persist($route); + + // menu items + $menu = new Menu; + $menu->setName('side-menu'); + $menu->setLabel('Side Menu'); + $menu->setParent($this->menuRoot); + $manager->persist($menu); + + $menuNode = new MenuNode; + $menuNode->setParent($menu); + $menuNode->setLabel('Default Behavior'); + $menuNode->setName('default'); + $menuNode->setRoute('current_menu_item_default'); + $manager->persist($menuNode); + + $menuNode = new MenuNode; + $menuNode->setParent($menu); + $menuNode->setLabel('Request Content Identity Voter'); + $menuNode->setName('request-content-identity-voter'); + $menuNode->setContent($content); + $manager->persist($menuNode); + + $menuNode = new MenuNode; + $menuNode->setParent($menu); + $menuNode->setLabel('URI Prefix Voter'); + $menuNode->setName('uri-prefix-voter'); + $menuNode->setContent($articlesRoute); + $manager->persist($menuNode); + + $menuNode = new MenuNode; + $menuNode->setParent($menu); + $menuNode->setLabel('Request Parent Content Identity Voter'); + $menuNode->setName('request-parent-content-identity-voter'); + $menuNode->setContent($blog); + $manager->persist($menuNode); } } diff --git a/Tests/Resources/Document/Content.php b/Tests/Resources/Document/Content.php index 05285e43..0fe6c4d4 100644 --- a/Tests/Resources/Document/Content.php +++ b/Tests/Resources/Document/Content.php @@ -27,7 +27,7 @@ class Content implements MenuNodeReferrersInterface, RouteReferrersReadInterface { /** - * @PHPCRODM\Id() + * @PHPCRODM\Id(strategy="assigned") */ protected $id; @@ -36,6 +36,11 @@ class Content implements MenuNodeReferrersInterface, RouteReferrersReadInterface */ protected $title; + /** + * @PHPCRODM\ParentDocument() + */ + protected $parent; + /** * @PHPCRODM\Referrers( * referringDocument="Symfony\Cmf\Bundle\MenuBundle\Doctrine\Phpcr\MenuNode", @@ -45,9 +50,18 @@ class Content implements MenuNodeReferrersInterface, RouteReferrersReadInterface */ protected $menuNodes; + /** + * @PHPCRODM\Referrers( + * referringDocument="Symfony\Cmf\Bundle\RoutingBundle\Doctrine\Phpcr\Route", + * referencedBy="content" + * ) + */ + protected $routes; + public function __construct() { $this->menuNodes = new ArrayCollection(); + $this->routes = new ArrayCollection(); } public function getId() @@ -80,6 +94,12 @@ public function addMenuNode(NodeInterface $menuNode) $this->menuNodes->add($menuNode); } + public function addRoute($route) + { + $this->routes->add($route); + } + + public function removeMenuNode(NodeInterface $menuNode) { $this->menuNodes->remove($menuNode); @@ -87,6 +107,13 @@ public function removeMenuNode(NodeInterface $menuNode) public function getRoutes() { - return array(new Route('http://www.example.com/content')); + foreach ($this->routes as $route) { + } + return $this->routes; + } + + public function getParent() + { + return $this->parent; } } diff --git a/Tests/Resources/Document/Post.php b/Tests/Resources/Document/Post.php new file mode 100644 index 00000000..44df603a --- /dev/null +++ b/Tests/Resources/Document/Post.php @@ -0,0 +1,19 @@ +load(__DIR__.'/config/config.php'); - $loader->load(__DIR__.'/config/admin-test.xml'); + $loader->load(__DIR__.'/config/test-services.xml'); } } diff --git a/Tests/Resources/app/Resources/views/index.html.twig b/Tests/Resources/app/Resources/views/index.html.twig index a4e5fe9a..ee6b6d37 100644 --- a/Tests/Resources/app/Resources/views/index.html.twig +++ b/Tests/Resources/app/Resources/views/index.html.twig @@ -4,6 +4,7 @@

About

This test application is built into the MenuBundle. You can easily run diff --git a/Tests/Resources/app/Resources/views/layout.html.twig b/Tests/Resources/app/Resources/views/layout.html.twig index f0e45c64..af8b0d0f 100644 --- a/Tests/Resources/app/Resources/views/layout.html.twig +++ b/Tests/Resources/app/Resources/views/layout.html.twig @@ -1,6 +1,24 @@ MenuBundle Test Application +