74 lines
2.4 KiB
PHP
74 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace Trinity\Bundle\ContentManagerBundle\Routing;
|
|
|
|
use Symfony\Bundle\FrameworkBundle\Routing\Router as BaseRouter;
|
|
use Symfony\Component\Routing\Exception\RouteNotFoundException;
|
|
use Trinity\Bundle\ContentManagerBundle\Page\PageManager;
|
|
use Trinity\Bundle\ContentManagerBundle\Model\NavQuery;
|
|
use Trinity\Bundle\ContentManagerBundle\Exception\NavigationNotFoundException;
|
|
|
|
class Router extends BaseRouter
|
|
{
|
|
protected $navCache = array();
|
|
|
|
protected $firstNav;
|
|
|
|
protected $pageManager;
|
|
|
|
public function generate($name, $parameters = array(), $referenceType = parent::ABSOLUTE_PATH)
|
|
{
|
|
if (strpos($name, ':') !== false) {
|
|
list($navName, $routeName) = explode(':', $name);
|
|
|
|
if (isset($this->navCache[$navName])) {
|
|
$navId = $this->navCache[$navName]->getId();
|
|
} else {
|
|
if ($nav = NavQuery::create()->findOneByName($navName)) {
|
|
$navId = $nav->getId();
|
|
$this->navCache[$navName] = $nav;
|
|
}
|
|
}
|
|
|
|
if (!isset($navId)) {
|
|
throw new NavigationNotFoundException(sprintf('No navigation found to generate url for route "%s"', $name));
|
|
}
|
|
|
|
$name = sprintf('%d_%s', $navId, $routeName);
|
|
$parameters = array_merge(
|
|
$parameters,
|
|
array(
|
|
'_locale' => $this->navCache[$navName]->getCulture(),
|
|
)
|
|
);
|
|
}
|
|
|
|
try {
|
|
return $this->getGenerator()->generate($name, $parameters, $referenceType);
|
|
} catch (RouteNotFoundException $e) {
|
|
return $this->generateWhenException($e, $name, $parameters, $referenceType);
|
|
}
|
|
}
|
|
|
|
protected function generateWhenException(\Exception $e, $name, $parameters = array(), $referenceType = parent::ABSOLUTE_PATH)
|
|
{
|
|
if (null === $this->firstNav) {
|
|
if (!empty($this->navCache)) {
|
|
$this->firstNav = $this->navCache[array_keys($this->navCache)[0]]->getId();
|
|
} else {
|
|
$this->firstNav = NavQuery::create()->findOne();
|
|
|
|
if ($this->firstNav) {
|
|
$this->firstNav = $this->firstNav->getId();
|
|
} else {
|
|
throw $e;
|
|
}
|
|
}
|
|
}
|
|
|
|
$name = sprintf('%d_%s', $this->firstNav, $name);
|
|
|
|
return $this->getGenerator()->generate($name, $parameters, $referenceType);
|
|
}
|
|
}
|