diff --git a/libraries/src/Component/Router/Rules/NomenuRules.php b/libraries/src/Component/Router/Rules/NomenuRules.php index 0361c6afbd4ff..1f4926a0f019b 100644 --- a/libraries/src/Component/Router/Rules/NomenuRules.php +++ b/libraries/src/Component/Router/Rules/NomenuRules.php @@ -74,10 +74,48 @@ public function parse(&$segments, &$vars) if (isset($views[$segments[0]])) { $vars['view'] = array_shift($segments); + $view = $views[$vars['view']]; - if (isset($views[$vars['view']]->key) && isset($segments[0])) + if (isset($view->key) && isset($segments[0])) { - $vars[$views[$vars['view']]->key] = preg_replace('/-/', ':', array_shift($segments), 1); + if (\is_callable(array($this->router, 'get' . ucfirst($view->name) . 'Id'))) + { + if ($view->parent_key && $this->router->app->input->get($view->parent_key)) + { + $vars[$view->parent->key] = $this->router->app->input->get($view->parent_key); + $vars[$view->parent_key] = $this->router->app->input->get($view->parent_key); + } + + if ($view->nestable) + { + $vars[$view->key] = 0; + + while (count($segments)) + { + $segment = array_shift($segments); + $result = \call_user_func_array(array($this->router, 'get' . ucfirst($view->name) . 'Id'), array($segment, $vars)); + + if (!$result) + { + array_unshift($segments, $segment); + break; + } + + $vars[$view->key] = preg_replace('/-/', ':', $result, 1); + } + } + else + { + $segment = array_shift($segments); + $result = \call_user_func_array(array($this->router, 'get' . ucfirst($view->name) . 'Id'), array($segment, $vars)); + + $vars[$view->key] = preg_replace('/-/', ':', $result, 1); + } + } + else + { + $vars[$view->key] = preg_replace('/-/', ':', array_shift($segments), 1); + } } } } @@ -121,7 +159,20 @@ public function build(&$query, &$segments) if (\is_callable(array($this->router, 'get' . ucfirst($view->name) . 'Segment'))) { $result = \call_user_func_array(array($this->router, 'get' . ucfirst($view->name) . 'Segment'), array($query[$view->key], $query)); - $segments[] = str_replace(':', '-', array_shift($result)); + + if ($view->nestable) + { + array_pop($result); + + while (count($result)) + { + $segments[] = str_replace(':', '-', array_pop($result)); + } + } + else + { + $segments[] = str_replace(':', '-', array_pop($result)); + } } else {