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