/** * {@inheritdoc} */ public function generateMenuUrl(AdminInterface $admin, $name, array $parameters = array(), $absolute = false) { // if the admin is a child we automatically append the parent's id if ($admin->isChild() && $admin->hasRequest() && $admin->getRequest()->attributes->has($admin->getParent()->getIdParameter())) { // twig template does not accept variable hash key ... so cannot use admin.idparameter ... // switch value if (isset($parameters['id'])) { $parameters[$admin->getIdParameter()] = $parameters['id']; unset($parameters['id']); } $parameters[$admin->getParent()->getIdParameter()] = $admin->getRequest()->attributes->get($admin->getParent()->getIdParameter()); } // if the admin is linked to a parent FieldDescription (ie, embedded widget) if ($admin->hasParentFieldDescription()) { // merge link parameter if any provided by the parent field $parameters = array_merge($parameters, $admin->getParentFieldDescription()->getOption('link_parameters', array())); $parameters['uniqid'] = $admin->getUniqid(); $parameters['code'] = $admin->getCode(); $parameters['pcode'] = $admin->getParentFieldDescription()->getAdmin()->getCode(); $parameters['puniqid'] = $admin->getParentFieldDescription()->getAdmin()->getUniqid(); } if ($name == 'update' || substr($name, -7) == '|update') { $parameters['uniqid'] = $admin->getUniqid(); $parameters['code'] = $admin->getCode(); } // allows to define persistent parameters if ($admin->hasRequest()) { $parameters = array_merge($admin->getPersistentParameters(), $parameters); } $code = $this->getCode($admin, $name); if (!array_key_exists($code, $this->caches)) { throw new \RuntimeException(sprintf('unable to find the route `%s`', $code)); } return array('route' => $this->caches[$code], 'routeParameters' => $parameters, 'routeAbsolute' => $absolute); }
/** * Contextualize the admin class depends on the current request * * @throws \RuntimeException * @return void */ public function configure() { $adminCode = $this->container->get('request')->get('_sonata_admin'); if (!$adminCode) { throw new \RuntimeException(sprintf('There is no `_sonata_admin` defined for the controller `%s` and the current route `%s`', get_class($this), $this->container->get('request')->get('_route'))); } $this->admin = $this->container->get('sonata.admin.pool')->getAdminByAdminCode($adminCode); if (!$this->admin) { throw new \RuntimeException(sprintf('Unable to find the admin class related to the current controller (%s)', get_class($this))); } $rootAdmin = $this->admin; if ($this->admin->isChild()) { $this->admin->setCurrentChild(true); $rootAdmin = $rootAdmin->getParent(); } $rootAdmin->setRequest($this->container->get('request')); }
/** * @throws \RuntimeException * @param \Sonata\AdminBundle\Admin\AdminInterface $admin * @param $name * @param array $parameter * @param bool $absolute * @return string */ public function generateUrl(AdminInterface $admin, $name, array $parameters = array(), $absolute = false) { if (!$admin->isChild()) { if (strpos($name, '.')) { $name = $admin->getCode() . '|' . $name; } else { $name = $admin->getCode() . '.' . $name; } } else { if ($admin->isChild()) { $name = $admin->getBaseCodeRoute() . '.' . $name; // twig template does not accept variable hash key ... so cannot use admin.idparameter ... // switch value if (isset($parameters['id'])) { $parameters[$admin->getIdParameter()] = $parameters['id']; unset($parameters['id']); } $parameters[$admin->getParent()->getIdParameter()] = $admin->getRequest()->get($admin->getParent()->getIdParameter()); } } // if the admin is linked to a parent FieldDescription (ie, embedded widget) if ($admin->hasParentFieldDescription()) { // merge link parameter if any provided by the parent field $parameters = array_merge($parameters, $admin->getParentFieldDescription()->getOption('link_parameters', array())); $parameters['uniqid'] = $admin->getUniqid(); $parameters['code'] = $admin->getCode(); $parameters['pcode'] = $admin->getParentFieldDescription()->getAdmin()->getCode(); $parameters['puniqid'] = $admin->getParentFieldDescription()->getAdmin()->getUniqid(); } if ($name == 'update' || substr($name, -7) == '|update') { $parameters['uniqid'] = $admin->getUniqid(); $parameters['code'] = $admin->getCode(); } // allows to define persistent parameters if ($admin->hasRequest()) { $parameters = array_merge($admin->getPersistentParameters(), $parameters); } $route = $admin->getRoute($name); if (!$route) { throw new \RuntimeException(sprintf('unable to find the route `%s`', $name)); } return $this->router->generate($route->getDefault('_sonata_name'), $parameters, $absolute); }
/** * {@inheritdoc} */ public function getBreadcrumbs(AdminInterface $admin, $action) { $breadcrumbs = array(); if ($admin->isChild()) { return $this->getBreadcrumbs($admin->getParent(), $action); } $menu = $this->buildBreadcrumbs($admin, $action); do { $breadcrumbs[] = $menu; } while ($menu = $menu->getParent()); $breadcrumbs = array_reverse($breadcrumbs); array_shift($breadcrumbs); return $breadcrumbs; }
/** * @param AdminInterface $admin */ private function loadCache(AdminInterface $admin) { if ($admin->isChild()) { $this->loadCache($admin->getParent()); } else { if (in_array($admin->getCode(), $this->loaded)) { return; } $this->caches = array_merge($this->cache->load($admin), $this->caches); $this->loaded[] = $admin->getCode(); } }