/**
  * {@inheritdoc}
  */
 public function generateMenuUrl(AdminInterface $admin, $name, array $parameters = array(), $absolute = UrlGeneratorInterface::ABSOLUTE_PATH)
 {
     // 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);
 }
예제 #2
0
 /**
  * Returns the Response object associated to the acl action.
  *
  * @param int|string|null $id
  *
  * @return Response|RedirectResponse
  *
  * @throws AccessDeniedException If access is not granted.
  * @throws NotFoundHttpException If the object does not exist or the ACL is not enabled
  */
 public function aclAction($id = null)
 {
     if (!$this->admin->isAclEnabled()) {
         throw new NotFoundHttpException('ACL are not enabled for this admin');
     }
     $id = $this->get('request')->get($this->admin->getIdParameter());
     $object = $this->admin->getObject($id);
     if (!$object) {
         throw new NotFoundHttpException(sprintf('unable to find the object with id : %s', $id));
     }
     if (false === $this->admin->isGranted('MASTER', $object)) {
         throw new AccessDeniedException();
     }
     $this->admin->setSubject($object);
     $aclUsers = $this->getAclUsers();
     $adminObjectAclManipulator = $this->get('sonata.admin.object.manipulator.acl.admin');
     $adminObjectAclData = new AdminObjectAclData($this->admin, $object, $aclUsers, $adminObjectAclManipulator->getMaskBuilderClass());
     $form = $adminObjectAclManipulator->createForm($adminObjectAclData);
     $request = $this->getRequest();
     if ($request->getMethod() === 'POST') {
         $form->submit($request);
         if ($form->isValid()) {
             $adminObjectAclManipulator->updateAcl($adminObjectAclData);
             $this->addFlash('sonata_flash_success', 'flash_acl_edit_success');
             return new RedirectResponse($this->admin->generateObjectUrl('acl', $object));
         }
     }
     return $this->render($this->admin->getTemplate('acl'), array('action' => 'acl', 'permissions' => $adminObjectAclData->getUserPermissions(), 'object' => $object, 'users' => $aclUsers, 'form' => $form->createView()));
 }
예제 #3
0
    /**
     * return the Response object associated to the view action
     *
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function showAction($id)
    {
        if (false === $this->admin->isGranted('SHOW')) {
            throw new AccessDeniedException();
        }

        $object = $this->admin->getObject($this->get('request')->get($this->admin->getIdParameter()));

        if (!$object) {
            throw new NotFoundHttpException(sprintf('unable to find the object with id : %s', $id));
        }

        $this->admin->setSubject($object);

        // build the show list
        $elements = $this->admin->getShow();

        return $this->render($this->admin->getShowTemplate(), array(
            'action'         => 'show',
            'object'         => $object,
            'elements'       => $this->admin->getShow(),
            'admin'          => $this->admin,
            'base_template'  => $this->getBaseTemplate(),
        ));
    }
 /**
  * @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);
 }
예제 #5
0
 /**
  * return the Response object associated to the edit action
  *
  * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
  * @param  $id
  * @return \Symfony\Component\HttpFoundation\Response
  */
 public function editAction($id)
 {
     $object = $this->admin->getObject($this->get('request')->get($this->admin->getIdParameter()));
     if (!$object) {
         throw new NotFoundHttpException(sprintf('unable to find the object with id : %s', $id));
     }
     $this->admin->setSubject($object);
     $form = $this->admin->getForm($object);
     if ($this->get('request')->getMethod() == 'POST') {
         $form->bindRequest($this->get('request'));
         if ($form->isValid()) {
             $this->admin->update($object);
             if ($this->isXmlHttpRequest()) {
                 return $this->renderJson(array('result' => 'ok', 'objectId' => $object->getId()));
             }
             // redirect to edit mode
             return $this->redirectTo($object);
         }
     }
     return $this->render($this->admin->getEditTemplate(), array('action' => 'edit', 'form' => $form->createView(), 'object' => $object, 'admin' => $this->admin, 'base_template' => $this->getBaseTemplate()));
 }
예제 #6
0
 /**
  * Returns the Response object associated to the acl action.
  *
  * @param int|string|null $id
  * @param Request         $request
  *
  * @return Response|RedirectResponse
  *
  * @throws AccessDeniedException If access is not granted.
  * @throws NotFoundHttpException If the object does not exist or the ACL is not enabled
  */
 public function aclAction($id = null)
 {
     $request = $this->getRequest();
     if (!$this->admin->isAclEnabled()) {
         throw $this->createNotFoundException('ACL are not enabled for this admin');
     }
     $id = $request->get($this->admin->getIdParameter());
     $object = $this->admin->getObject($id);
     if (!$object) {
         throw $this->createNotFoundException(sprintf('unable to find the object with id : %s', $id));
     }
     $this->admin->checkAccess('acl', $object);
     $this->admin->setSubject($object);
     $aclUsers = $this->getAclUsers();
     $aclRoles = $this->getAclRoles();
     $adminObjectAclManipulator = $this->get('sonata.admin.object.manipulator.acl.admin');
     $adminObjectAclData = new AdminObjectAclData($this->admin, $object, $aclUsers, $adminObjectAclManipulator->getMaskBuilderClass(), $aclRoles);
     $aclUsersForm = $adminObjectAclManipulator->createAclUsersForm($adminObjectAclData);
     $aclRolesForm = $adminObjectAclManipulator->createAclRolesForm($adminObjectAclData);
     if ($request->getMethod() === 'POST') {
         if ($request->request->has(AdminObjectAclManipulator::ACL_USERS_FORM_NAME)) {
             $form = $aclUsersForm;
             $updateMethod = 'updateAclUsers';
         } elseif ($request->request->has(AdminObjectAclManipulator::ACL_ROLES_FORM_NAME)) {
             $form = $aclRolesForm;
             $updateMethod = 'updateAclRoles';
         }
         if (isset($form)) {
             $form->handleRequest($request);
             if ($form->isValid()) {
                 $adminObjectAclManipulator->{$updateMethod}($adminObjectAclData);
                 $this->addFlash('sonata_flash_success', 'flash_acl_edit_success');
                 return new RedirectResponse($this->admin->generateObjectUrl('acl', $object));
             }
         }
     }
     return $this->render($this->admin->getTemplate('acl'), array('action' => 'acl', 'permissions' => $adminObjectAclData->getUserPermissions(), 'object' => $object, 'users' => $aclUsers, 'roles' => $aclRoles, 'aclUsersForm' => $aclUsersForm->createView(), 'aclRolesForm' => $aclRolesForm->createView()), null, $request);
 }
예제 #7
0
 /**
  * @param null    $id
  * @param string  $revision
  *
  * @return Response
  */
 public function historyViewRevisionAction($id = null, $revision = null)
 {
     if (false === $this->admin->isGranted('EDIT')) {
         throw new AccessDeniedException();
     }
     $id = $this->get('request')->get($this->admin->getIdParameter());
     $object = $this->admin->getObject($id);
     if (!$object) {
         throw new NotFoundHttpException(sprintf('unable to find the object with id : %s', $id));
     }
     $manager = $this->get('sonata.admin.audit.manager');
     if (!$manager->hasReader($this->admin->getClass())) {
         throw new NotFoundHttpException(sprintf('unable to find the audit reader for class : %s', $this->admin->getClass()));
     }
     $reader = $manager->getReader($this->admin->getClass());
     // retrieve the revisioned object
     $object = $reader->find($this->admin->getClass(), $id, $revision);
     if (!$object) {
         throw new NotFoundHttpException(sprintf('unable to find the targeted object `%s` from the revision `%s` with classname : `%s`', $id, $revision, $this->admin->getClass()));
     }
     $this->admin->setSubject($object);
     return $this->render($this->admin->getShowTemplate(), array('action' => 'show', 'object' => $object, 'elements' => $this->admin->getShow()));
 }