deblan.tv/vendor/trinity/src/Trinity/Bundle/ContentManagerBundle/Routing/NodeUrlResolver.php
2015-03-02 21:57:49 +01:00

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;
}
}