diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 5de75c3..4904166 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -47,7 +47,9 @@ services: pugx_cmf_page.routing_auto.menu_path_provider: class: PUGX\Cmf\PageBundle\RoutingAuto\TokenProvider\MenuPathTokenProvider - arguments: [ @cmf_routing_auto.slugifier ] + arguments: + - @cmf_routing_auto.slugifier + - @doctrine_phpcr.odm.default_document_manager tags: - { name: cmf_routing_auto.token_provider, alias: "menu_path" } diff --git a/RoutingAuto/TokenProvider/MenuPathTokenProvider.php b/RoutingAuto/TokenProvider/MenuPathTokenProvider.php index 9d2b1fa..7a12205 100644 --- a/RoutingAuto/TokenProvider/MenuPathTokenProvider.php +++ b/RoutingAuto/TokenProvider/MenuPathTokenProvider.php @@ -9,6 +9,7 @@ namespace PUGX\Cmf\PageBundle\RoutingAuto\TokenProvider; +use Doctrine\ODM\PHPCR\DocumentManager; use Symfony\Cmf\Bundle\CoreBundle\Slugifier\SlugifierInterface; use Symfony\Cmf\Bundle\MenuBundle\Doctrine\Phpcr\MenuNode; use Symfony\Cmf\Component\RoutingAuto\TokenProviderInterface; @@ -22,13 +23,22 @@ class MenuPathTokenProvider implements TokenProviderInterface */ private $slugifier; + /** + * @var DocumentManager + */ + private $documentManager; + + private $locale; + /** * MenuPathTokenProvider constructor. * @param SlugifierInterface $slugifier + * @param DocumentManager $documentManager */ - public function __construct(SlugifierInterface $slugifier) + public function __construct(SlugifierInterface $slugifier, DocumentManager $documentManager) { $this->slugifier = $slugifier; + $this->documentManager = $documentManager; } /** @@ -43,6 +53,11 @@ public function provideValue(UriContext $uriContext, $options) { $path = array(); $subject = $uriContext->getSubjectObject(); + + if ($this->documentManager->isDocumentTranslatable($subject)) { + $this->locale = $subject->getLocale(); + } + $this->traversePath($subject, $path); if (empty($path)) { return ''; @@ -91,7 +106,15 @@ private function traversePath($subject, array &$path) if (!$parentNode instanceof MenuNode) { return; } + $parentSubject = $parentNode->getContent(); + if ($this->locale && $this->documentManager->isDocumentTranslatable($parentSubject)) { + $meta = $this->documentManager->getMetadataFactory()->getMetadataFor(get_class($parentSubject)); + $parentSubject = $this + ->documentManager + ->findTranslation($meta->getName(), $meta->getIdentifierValue($parentSubject), $this->locale); + } + $this->traversePath($parentSubject, $path); } } diff --git a/Tests/Unit/RoutingAuto/TokenProvider/MenuPathTokenProviderTest.php b/Tests/Unit/RoutingAuto/TokenProvider/MenuPathTokenProviderTest.php index b9665fe..9ae51b6 100644 --- a/Tests/Unit/RoutingAuto/TokenProvider/MenuPathTokenProviderTest.php +++ b/Tests/Unit/RoutingAuto/TokenProvider/MenuPathTokenProviderTest.php @@ -18,6 +18,7 @@ public function testProvideValueWithTwoLevelPath() $slugifier = $this->mockSlugifier( array('Subject' => 'subject', 'Parent Subject' => 'parent-subject') ); + $documentManager = $this->getMock('Doctrine\ODM\PHPCR\DocumentManager', array(), array(), '', false); $subject = $this->getMock( 'PUGX\Cmf\PageBundle\Tests\Unit\RoutingAuto\TokenProvider\InitialTestSubjectInterface' ); @@ -33,7 +34,7 @@ public function testProvideValueWithTwoLevelPath() $menuNode = $this->mockMenuNode($parentMenuNode); $subject->expects($this->any())->method('providePrimaryMenuNode')->willReturn($menuNode); $uriContext = $this->mockUriContext($subject); - $provider = new MenuPathTokenProvider($slugifier); + $provider = new MenuPathTokenProvider($slugifier, $documentManager); $path = $provider->provideValue($uriContext, array()); $this->assertEquals('parent-subject/subject', $path); } @@ -41,10 +42,11 @@ public function testProvideValueWithTwoLevelPath() public function testProvideValueWithRouteTokenProviderSubjectButNoMenuProviderSubjectShouldReturnOnlyRouteToken() { $slugifier = $this->mockSlugifier(array('My Subject' => 'my-subject')); + $documentManager = $this->getMock('Doctrine\ODM\PHPCR\DocumentManager', array(), array(), '', false); $subject = $this->getMock('PUGX\Cmf\PageBundle\RoutingAuto\TokenProvider\RouteTokenProviderInterface'); $subject->expects($this->any())->method('provideRouteToken')->willReturn('My Subject'); $uriContext = $this->mockUriContext($subject); - $provider = new MenuPathTokenProvider($slugifier); + $provider = new MenuPathTokenProvider($slugifier, $documentManager); $path = $provider->provideValue($uriContext, array()); $this->assertEquals('my-subject', $path); } @@ -52,6 +54,7 @@ public function testProvideValueWithRouteTokenProviderSubjectButNoMenuProviderSu public function testProvideValueWithNoRouteTokenProviderSubjectButMenuProviderSubjectShouldReturnEmpty() { $slugifier = $this->mockSlugifier(array()); + $documentManager = $this->getMock('Doctrine\ODM\PHPCR\DocumentManager', array(), array(), '', false); $subject = $this->getMock('PUGX\Cmf\PageBundle\RoutingAuto\TokenProvider\PrimaryMenuNodeProviderInterface'); $parentContent = $this->getMock('PUGX\Cmf\PageBundle\RoutingAuto\TokenProvider\RouteTokenProviderInterface'); $parentContent->expects($this->any())->method('provideRouteToken')->willReturn('Parent Subject'); @@ -59,7 +62,7 @@ public function testProvideValueWithNoRouteTokenProviderSubjectButMenuProviderSu $menuNode = $this->mockMenuNode($parentMenuNode, null); $subject->expects($this->any())->method('providePrimaryMenuNode')->willReturn($menuNode); $uriContext = $this->mockUriContext($subject); - $provider = new MenuPathTokenProvider($slugifier); + $provider = new MenuPathTokenProvider($slugifier, $documentManager); $path = $provider->provideValue($uriContext, array()); $this->assertEquals('', $path); } @@ -67,13 +70,19 @@ public function testProvideValueWithNoRouteTokenProviderSubjectButMenuProviderSu public function testProvideValueWithNoRouteTokenProviderSubjectAndNoMenuProviderSubject() { $slugifier = $this->mockSlugifier(array()); + $documentManager = $this->getMock('Doctrine\ODM\PHPCR\DocumentManager', array(), array(), '', false); $subject = $this->getMock('\stdClass'); $uriContext = $this->mockUriContext($subject); - $provider = new MenuPathTokenProvider($slugifier); + $provider = new MenuPathTokenProvider($slugifier, $documentManager); $path = $provider->provideValue($uriContext, array()); $this->assertEquals('', $path); } + public function testProvideValueForTranslatedContent() + { + $this->markTestSkipped('TODO'); + } + /** * @param $parentObject * @param null $content