236 lines
7 KiB
PHP
236 lines
7 KiB
PHP
<?php
|
|
|
|
namespace Trinity\Bundle\ContentManagerBundle\Routing;
|
|
|
|
use Symfony\Component\DependencyInjection\ContainerInterface;
|
|
use Symfony\Component\Routing\Exception\RouteNotFoundException;
|
|
use Trinity\Bundle\ContentManagerBundle\Model\Node;
|
|
use Symfony\Component\Routing\RouterInterface;
|
|
use Trinity\Bundle\ContentManagerBundle\Model\PageableInterface;
|
|
use Trinity\Bundle\ContentManagerBundle\Model\NodeQuery;
|
|
|
|
class NodeUrlResolver
|
|
{
|
|
|
|
private $container;
|
|
private $config_url_resolver;
|
|
private $config_default_locale;
|
|
private $router;
|
|
|
|
public function __construct(ContainerInterface $container, RouterInterface $router)
|
|
{
|
|
$this->container = $container;
|
|
$this->config_url_resolver = $this->container->getParameter('trinity_content_manager.url_resolver');
|
|
$this->config_default_locale = $this->container->getParameter('trinity_content_manager.url_resolver');
|
|
$this->router = $router;
|
|
}
|
|
|
|
public function resolve(Node $node, $parameters = array(), $model = null, $absolute = false)
|
|
{
|
|
if ($node->getNodeAlias()) {
|
|
$node = $node->getNodeRelatedByNodeAlias();
|
|
}
|
|
|
|
$url = $node->getUrl();
|
|
|
|
$expected_params = array();
|
|
|
|
foreach (explode('/', $url) as $param) {
|
|
if (!preg_match('`\{.*\}`', $param)) {
|
|
continue;
|
|
}
|
|
|
|
$expected_params[] = str_replace(
|
|
array('{', '}'),
|
|
'',
|
|
$param
|
|
);
|
|
}
|
|
|
|
foreach ($node->getCleanedDefaultParams() as $param_name => $param) {
|
|
if (!array_key_exists($param_name, $parameters)) {
|
|
$parameters[$param_name] = $param;
|
|
}
|
|
}
|
|
|
|
if ($node->getPage()) {
|
|
$page = $node->getPage()->getClassKey();
|
|
|
|
if (!isset($this->config_url_resolver['models'])) {
|
|
$config = array();
|
|
} else {
|
|
$config = array_key_exists($page, $this->config_url_resolver['models']) ? $this->config_url_resolver['models'][$page]['params'] : array();
|
|
}
|
|
|
|
if ($node->getPage() instanceof PageableInterface) {
|
|
if (!array_key_exists('page', $parameters)) {
|
|
$parameters['page'] = 1;
|
|
}
|
|
}
|
|
|
|
foreach ($expected_params as $expected_param) {
|
|
if (in_array($expected_param, array_keys($parameters))) {
|
|
continue;
|
|
}
|
|
|
|
if (!in_array($expected_param, array_keys($config))) {
|
|
continue;
|
|
}
|
|
|
|
if ($node->layOnDataModel()) {
|
|
$value = $model ? $model : $node->getDataModelObject();
|
|
|
|
foreach (explode('.', $config[$expected_param]) as $method) {
|
|
if ($method == 'PARENT') {
|
|
if (!$node->hasParent()) {
|
|
continue;
|
|
}
|
|
$parent_param = $node->getParent()->getCleanedDefaultParams();
|
|
if (!in_array($expected_param,array_keys($parent_param))) {
|
|
continue;
|
|
}
|
|
$value = $parent_param[$expected_param];
|
|
} else {
|
|
$value = call_user_func(array($value, $method));
|
|
}
|
|
}
|
|
|
|
$parameters[$expected_param] = $value;
|
|
}
|
|
|
|
if ($node->layOnDataModels() && $model) {
|
|
$value = $model;
|
|
|
|
foreach (explode('.', $config[$expected_param]) as $method) {
|
|
$value = call_user_func(array($value, $method));
|
|
}
|
|
|
|
$parameters[$expected_param] = $value;
|
|
}
|
|
}
|
|
}
|
|
|
|
try {
|
|
return $this->router->generate($node->getRealRouteName(), $parameters, $absolute);
|
|
} catch (RouteNotFoundException $e) {
|
|
return null;
|
|
} catch (\Exception $e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Transform à compact url tag into readable url
|
|
*
|
|
* @param $value
|
|
* @return string
|
|
*/
|
|
public function translate($value, $raw = false)
|
|
{
|
|
if (is_array($value)) {
|
|
$value = implode('', $value);
|
|
}
|
|
|
|
if($raw){
|
|
$elements = $this->extract2($value);
|
|
|
|
$node = NodeQuery::create()->findOneById($elements['id']);
|
|
|
|
if (!$node) {
|
|
return $value;
|
|
}
|
|
|
|
if (array_key_exists('object_model', $elements) && array_key_exists('object_model_id', $elements)) {
|
|
$model = \PropelQuery::from($elements['object_model'])->findPk($elements['object_model_id']);
|
|
return $this->resolve($node, array(), $model);
|
|
} else {
|
|
return $this->resolve($node);
|
|
}
|
|
}
|
|
|
|
$href = substr($value, 0, 6);
|
|
$elements = $this->extract($value);
|
|
|
|
$node = NodeQuery::create()->findOneById($elements['id']);
|
|
|
|
if (!$node) {
|
|
return sprintf('%s%s', $href, '/');
|
|
}
|
|
|
|
if (array_key_exists('object_model', $elements) && array_key_exists('object_model_id', $elements)) {
|
|
$model = \PropelQuery::from($elements['object_model'])->findPk($elements['object_model_id']);
|
|
$link = $this->resolve($node, array(), $model);
|
|
} else {
|
|
$link = $this->resolve($node);
|
|
}
|
|
|
|
return sprintf('%s%s', $href, $link);
|
|
}
|
|
|
|
public function getTitle($value)
|
|
{
|
|
if (is_array($value)) {
|
|
$value = implode('', $value);
|
|
}
|
|
|
|
$elements = $this->extract2($value);
|
|
|
|
$node = NodeQuery::create()->findOneById($elements['id']);
|
|
|
|
if (!$node) {
|
|
return null;
|
|
}
|
|
|
|
if (array_key_exists('object_model', $elements) && array_key_exists('object_model_id', $elements)) {
|
|
$model = \PropelQuery::from($elements['object_model'])->findPk($elements['object_model_id']);
|
|
|
|
return (string) $model;
|
|
} else {
|
|
return (string) $node;
|
|
}
|
|
}
|
|
|
|
private function extract($value)
|
|
{
|
|
$value = explode(
|
|
';',
|
|
str_replace(
|
|
array('/', '{', '}', 'cmsnode:'),
|
|
'',
|
|
substr($value, 6, strlen($value))
|
|
)
|
|
);
|
|
|
|
$elements = array();
|
|
|
|
foreach ($value as $v) {
|
|
$kv = explode('=', $v);
|
|
$elements[array_shift($kv)] = array_shift($kv);
|
|
}
|
|
|
|
return $elements;
|
|
}
|
|
|
|
private function extract2($value)
|
|
{
|
|
$value = explode(
|
|
';',
|
|
str_replace(
|
|
array('/', '{', '}', 'cmsnode:'),
|
|
'',
|
|
$value
|
|
)
|
|
);
|
|
|
|
$elements = array();
|
|
|
|
foreach ($value as $v) {
|
|
$kv = explode('=', $v);
|
|
$elements[array_shift($kv)] = array_shift($kv);
|
|
}
|
|
|
|
return $elements;
|
|
}
|
|
|
|
}
|