protected function updateLocale(Route $doc, $id) { $matches = array(); // only update route objects and only if the prefix can match, to allow // for more than one listener and more than one route root if (!preg_match('#' . $this->idPrefix . '/([^/]+)(/|$)#', $id, $matches)) { return; } if (in_array($matches[1], $this->locales) && !$doc->getDefault('_locale') && !$doc->getRequirement('_locale')) { $doc->setDefault('_locale', $matches[1]); $doc->setRequirement('_locale', $matches[1]); } }
public function testRedirectContent() { $root = self::$dm->find(null, self::ROUTE_ROOT); $route = new Route(); $route->setRouteContent($root); // this happens to be a referenceable node $route->setPosition($root, 'testroute'); self::$dm->persist($route); $redirect = new RedirectRoute(); $redirect->setPosition($root, 'redirectContent'); $redirect->setRouteTarget($route); $redirect->setParameters(array('test' => 'content')); self::$dm->persist($redirect); self::$dm->flush(); self::$dm->clear(); $redirect = self::$dm->find(null, self::ROUTE_ROOT . '/redirectContent'); $response = self::$controller->redirectAction($redirect); $this->assertInstanceOf('Symfony\\Component\\HttpFoundation\\RedirectResponse', $response); $this->assertSame(302, $response->getStatusCode()); $this->assertSame('http://localhost/testroute?test=content', $response->getTargetUrl()); }
public function testGetRouteCollectionForRequest() { $route = new Route(); $root = self::$dm->find(null, self::ROUTE_ROOT); $route->setPosition($root, 'testroute'); self::$dm->persist($route); // smuggle a non-route thing into the repository $noroute = new Generic(); $noroute->setParent($route); $noroute->setNodename('noroute'); self::$dm->persist($noroute); $childroute = new Route(); $childroute->setPosition($noroute, 'child'); self::$dm->persist($childroute); self::$dm->flush(); self::$dm->clear(); $routes = self::$repository->getRouteCollectionForRequest(Request::create('/testroute/noroute/child')); $this->assertCount(3, $routes); foreach ($routes as $route) { $this->assertInstanceOf('Symfony\\Cmf\\Component\\Routing\\RouteObjectInterface', $route); } }
/** * careful: the kernel is shut down after the first test, if you need the * kernel, recreate it. * * @param array $options passed to self:.createKernel * @param string $routebase base name for routes under /test to use */ public static function setupBeforeClass(array $options = array(), $routebase = null) { self::$kernel = self::createKernel($options); self::$kernel->init(); self::$kernel->boot(); self::$dm = self::$kernel->getContainer()->get('doctrine_phpcr.odm.document_manager'); if (null == $routebase) { return; } $session = self::$kernel->getContainer()->get('doctrine_phpcr.session'); if ($session->nodeExists("/test/{$routebase}")) { $session->getNode("/test/{$routebase}")->remove(); } if (!$session->nodeExists('/test')) { $session->getRootNode()->addNode('test', 'nt:unstructured'); } $session->save(); $root = self::$dm->find(null, '/test'); $route = new Route(); $route->setPosition($root, $routebase); self::$dm->persist($route); self::$dm->flush(); }
public function testRedirectDoctrine() { $root = self::$dm->find(null, self::ROUTE_ROOT); $route = new Route(); $route->setRouteContent($root); // this happens to be a referenceable node $route->setPosition($root, 'testroute'); self::$dm->persist($route); $redirect = new RedirectRoute(); $redirect->setPosition($root, 'redirect'); $redirect->setRouteTarget($route); $redirect->setDefault('test', 'toast'); self::$dm->persist($redirect); self::$dm->flush(); self::$dm->clear(); $route = self::$dm->find(null, self::ROUTE_ROOT . '/testroute'); $redirect = self::$dm->find(null, self::ROUTE_ROOT . '/redirect'); $this->assertInstanceOf('Symfony\\Cmf\\Component\\Routing\\RedirectRouteInterface', $redirect); $this->assertSame($redirect, $redirect->getRouteContent()); $params = $redirect->getParameters(); $this->assertSame($route, $redirect->getRouteTarget()); $defaults = $redirect->getDefaults(); $this->assertEquals(array('test' => 'toast'), $defaults); }
/** * Load routing data into the document manager. * * NOTE: We demo all possibilities. Of course, you should try to be * consistent in what you use and only use different things for special * cases. * * @param $dm */ public function load(ObjectManager $dm) { $session = $dm->getPhpcrSession(); $basepath = $this->container->getParameter('symfony_cmf_routing_extra.routing_repositoryroot'); $content_path = $this->container->getParameter('symfony_cmf_content.static_basepath'); if ($session->itemExists($basepath)) { $session->removeItem($basepath); } NodeHelper::createPath($session, dirname($basepath)); $root = $dm->find(null, dirname($basepath)); $locales = array('en', 'fr', 'de'); //TODO: can we get this from phpcr-odm in a sane way? $parent = new MultilangLanguageSelectRoute(); $parent->setPosition($root, basename($basepath)); $dm->persist($parent); foreach ($locales as $locale) { $home = new Route(); $home->setPosition($parent, $locale); $home->setDefault('_locale', $locale); $home->setRouteContent($dm->find(null, "{$content_path}/home")); $dm->persist($home); $company = new Route(); $company->setPosition($home, 'company'); $company->setDefault('_locale', $locale); $company->setRouteContent($dm->find(null, "{$content_path}/company")); $dm->persist($company); $team = new Route(); $team->setPosition($company, 'team'); $team->setDefault('_locale', $locale); $team->setRouteContent($dm->find(null, "{$content_path}/team")); $dm->persist($team); $more = new Route(); $more->setPosition($company, 'more'); $more->setDefault('_locale', $locale); $more->setRouteContent($dm->find(null, "{$content_path}/more")); $dm->persist($more); $projects = new Route(); $projects->setPosition($home, 'projects'); $projects->setDefault('_locale', $locale); $projects->setRouteContent($dm->find(null, "{$content_path}/projects")); $dm->persist($projects); $cmf = new Route(); $cmf->setPosition($projects, 'cmf'); $cmf->setDefault('_locale', $locale); $cmf->setRouteContent($dm->find(null, "{$content_path}/cmf")); $dm->persist($cmf); } // demo features of routing // we can create routes without locales, but will lose the language context of course $demo = new Route(); $demo->setPosition($parent, 'demo'); $demo->setRouteContent($dm->find(null, "{$content_path}/demo")); $demo->setDefault(RouteObjectInterface::TEMPLATE_NAME, 'SandboxMainBundle:Demo:template_explicit.html.twig'); $dm->persist($demo); // explicit template $template = new Route(); $template->setPosition($demo, 'atemplate'); $template->setRouteContent($dm->find(null, "{$content_path}/demo_template")); $template->setDefault(RouteObjectInterface::TEMPLATE_NAME, 'SandboxMainBundle:Demo:template_explicit.html.twig'); $dm->persist($template); // explicit controller $controller = new Route(); $controller->setPosition($demo, 'controller'); $controller->setRouteContent($dm->find(null, "{$content_path}/demo_controller")); $controller->setDefault('_controller', 'sandbox_main.controller:specialAction'); $dm->persist($controller); // alias to controller mapping $alias = new Route(); $alias->setPosition($demo, 'alias'); $alias->setRouteContent($dm->find(null, "{$content_path}/demo_alias")); $alias->setDefault(RouteObjectInterface::CONTROLLER_ALIAS, 'demo_alias'); $dm->persist($alias); // class to controller mapping $class = new Route(); $class->setPosition($demo, 'class'); $class->setRouteContent($dm->find(null, "{$content_path}/demo_class")); $dm->persist($class); // redirections // redirect to uri $redirect = new RedirectRoute(); $redirect->setPosition($parent, 'external'); $redirect->setUri('http://cmf.symfony.com'); $dm->persist($redirect); // redirect to other doctrine route $redirectRoute = new RedirectRoute(); $redirectRoute->setPosition($parent, 'short'); $redirectRoute->setRouteTarget($cmf); $dm->persist($redirectRoute); // redirect to Symfony route $redirectS = new RedirectRoute(); $redirectS->setPosition($parent, 'short1'); $redirectS->setRouteName('test'); $dm->persist($redirectS); // class to template mapping is used for all the rest $dm->flush(); }
public function getOptions() { return parent::getOptions() + array('label' => $this->getLabel(), 'attributes' => array(), 'childrenAttributes' => array(), 'display' => !empty($this->label), 'displayChildren' => true, 'content' => $this, 'routeParameters' => array(), 'routeAbsolute' => false, 'linkAttributes' => array(), 'labelAttributes' => array()); }
public function testDefaultFormat() { $route = new Route(true); $root = self::$dm->find(null, self::ROUTE_ROOT); $route->setPosition($root, 'format'); self::$dm->persist($route); self::$dm->flush(); self::$dm->clear(); $route = self::$dm->find(null, self::ROUTE_ROOT . '/format'); $this->assertEquals('/format.{_format}', $route->getPattern()); }
public function testEnhanceTemplateByClass() { if ($content = self::$dm->find(null, '/templatebyclass')) { self::$dm->remove($content); self::$dm->flush(); } $document = new Content(); $document->path = '/templatebyclass'; self::$dm->persist($document); // put a route for this content $root = self::$dm->find(null, self::ROUTE_ROOT); $route = new Route(); $route->setRouteContent($document); $route->setPosition($root, 'templatebyclass'); self::$dm->persist($route); self::$dm->flush(); $expected = array('_controller' => 'symfony_cmf_content.controller:indexAction', RouteObjectInterface::ROUTE_NAME => '/test/routing/templatebyclass'); $request = Request::create('/templatebyclass'); $matches = self::$router->matchRequest($request); ksort($matches); $this->assertEquals($expected, $matches); $this->assertTrue($request->attributes->has(DynamicRouter::ROUTE_KEY)); $this->assertTrue($request->attributes->has(DynamicRouter::CONTENT_TEMPLATE)); $this->assertEquals('TestBundle:Content:index.html.twig', $request->attributes->get(DynamicRouter::CONTENT_TEMPLATE)); }