/** * {@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); }
/** * Sanity check and default locale to request locale. * * {@inheritdoc} */ public function alterNewInstance(AdminInterface $admin, $object) { if (!$object instanceof TranslatableInterface) { throw new \InvalidArgumentException('Expected TranslatableInterface, got ' . get_class($object)); } if ($admin->hasRequest()) { $currentLocale = $admin->getRequest()->getLocale(); if (in_array($currentLocale, $this->locales)) { $object->setLocale($currentLocale); } } }
/** * {@inheritdoc} */ public function preUpdate(AdminInterface $admin, $object) { if (!$admin->hasRequest() || !($data = $admin->getRequest()->get($admin->getUniqid()))) { return; } if (!isset($data[$this->fieldName])) { return; } $modelManager = $admin->getModelManager(); if (!$modelManager instanceof LockInterface) { return; } $modelManager->lock($object, $data[$this->fieldName]); }
/** * @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); }
/** * Set a default parent if defined in the request * * {@inheritDoc} */ public function alterNewInstance(AdminInterface $admin, $object) { if (!$admin->hasRequest() || !($parentId = $admin->getRequest()->get('parent'))) { return; } $parent = $admin->getModelManager()->find(null, $parentId); if (!$parent) { return; } switch ($object) { case $object instanceof HierarchyInterface: $object->setParentDocument($parent); break; case $object instanceof ChildInterface: $object->setParentObject($parent); break; default: throw new \InvalidArgumentException(sprintf('Class %s is not supported', get_class($object))); } }
/** * returns the locale of the current admin user * * @param \Sonata\AdminBundle\Admin\AdminInterface $admin * @return mixed|string */ public function getCurrentAdminLocale(\Sonata\AdminBundle\Admin\AdminInterface $admin) { $locale = ''; if (!$admin->hasRequest()) { $admin->setRequest($this->getService('request')); } if ($subject = $admin->getSubject()) { return $this->getFieldValue($subject, 'locale'); } elseif ($filter = $admin->getDatagrid()->getFilter('locale')) { /** @var \Sonata\AdminBundle\Filter\Filter $filter */ $data = $filter->getValue(); if (!$data || !is_array($data) || !array_key_exists('value', $data)) { $locale = $this->getCurrentLocale(); } $data['value'] = trim($data['value']); if (strlen($data['value']) > 0) { $locale = $data['value']; } if (!$locale && method_exists($admin, 'getDefaultLocale')) { $locale = $admin->getDefaultLocale(); } } return $locale; }