2016-07-28 1 views
8

Je souhaite générer un petit formulaire à l'intérieur d'un modèle d'émission Sonata Admin. Ce que j'ai fait jusqu'ici est de créer la fonction dans le CRUD personnalisé pour cette entité spécifique (ordre) qui s'étend de la CRUD par défaut de Sonata;Ajout d'un formulaire personnalisé à l'intérieur du modèle de présentation d'une entité d'administration Sonata

public function approveOrderAction($id = null) 
{ 
    $request = $this->getRequest(); 

    $id = $request->get($this->admin->getIdParameter()); 
    $order = $this->admin->getObject($id); 

    $approveForm = $this->createFormBuilder($order) 
     ->add('reqSecondApprover', 'checkbox', array('label' => 'Require second Approval', 'required' => false)) 
     ->add('secondApprover', 'choice', array('choices' => Crud::getWhatever(array('Developer')), 'required' => false)) 
     ->getForm(); 

    $approveForm->handleRequest($request); 

    if ($approveForm->isSubmitted() && $approveForm->isValid()) { 
     $secondApproval = $request->request->get('form'); 
     $approval = $approveForm->getData(); 

     if (isset($secondApproval['reqSecondApprover'])) { 
      $order->setStatus(PmodOrder::STATUS_PARTLY_APPROVED); 
     } else { 
      $order->setStatus(PmodOrder::STATUS_APPROVED); 
      $order->setSecondApprover(null); 
     } 

     $em->persist($approval); 
     $em->flush(); 

     return new RedirectResponse($this->admin->generateUrl('show')); 
    } 

    return $this->render('AppBundle:PmodOrder:order_approve.html.twig', array(
     'order' => $order, 
     'form' => $approveForm->createView(), 
    )); 
} 

Dans ma commandeAdmin j'ai la méthode configShowFields;

protected function configureShowFields(ShowMapper $showMapper) 
{ 
    $order = $this->getSubject(); 

    $showMapper 
     ->with('General') 
      ->add('createdBy', null, array('label' => 'Requested By')) 
      ->add('createdAt', null, array('label' => 'Date Requested')) 
     ->with('Order Details') 
      ->add('orderRows', NULL, array('template' => 'AppBundle:PmodOrderRow:orderrow_overview.html.twig')) 
     ->end() 
     ->with('Actions') 
      ->add('actions', NULL, array('template' => 'AppBundle:PmodOrderAction:order_actions.html.twig', 'route' => 'approve')) 
     ->end() 
    ; 
} 

Le modèle order_actions ressemble à ceci et montrera les fonctionnalités pertinentes en fonction du statut de l'ordre et qui est connecté, donc comment fonctionnent avec tant de routes ?; diffent

<td> 
    {% if app.user.id == object.firstApprover and object.status == 1%} 
     {{ render(controller('AppBundle:PmodOrderCRUD:approveOrder', { 'id': object.id })) }} 
    {% elseif app.user.id == object.secondApprover and object.status == 2 %} 
     <a href="{{ path('order_second_approve', { 'id': object.id })}}" class="btn btn-primary"><i class="fa fa-check"></i> Approve</a> 
     <a href="{{ path('order_disapprove', { 'id': object.id })}}" class="btn btn-default"><i class="fa fa-times"></i> Disapprove</a> 
    {% elseif app.user == object.createdBy and object.status == 3 %} 
     <a href="{{ path('order_place', { 'id': object.id })}}" class="btn btn-primary">Place Order</a> 
     <a href="{{ path('order_place', { 'id': object.id })}}" class="btn btn-default">Cancel Order</a> 
    {% else %} 
     - 
    {% endif %} 
</td> 

En essayant ceci, j'obtiens une erreur;

Une exception a été levée lors du rendu d'un modèle ("Il n'y a pas _sonata_admin défini pour le contrôleur ApBundle\Controller\PmodOrderCRUDController et la route` `courant ") dans AppBundle: PmodOrderAction: order_actions.html.twig à la ligne 3.

Je comprends de la documentation que je dois utiliser cette méthode configureRoutes; Mais je n'arrive pas à le faire fonctionner et je ne suis pas sûr de la façon de rendre les formulaires au lieu d'un simple bouton de lien. Est-ce que quelqu'un peut m'aider à résoudre mon problème?

Répondre

2

L'attribut _sonata_admin (route) est utilisé par pour obtenir l'instance admin sont requis ($this->admin) et être en mesure de configurer/traiter vos demandes:

Après d'ajouter la bonne définition de l'itinéraire:

protected function configureRoutes(RouteCollection $collection) 
{ 
    $collection->add('approve_order', $this->getRouterIdParameter().'/approve'); 
} 

Vous devez également ajouter le code _sonata_admin pour générer la demande de droit approveOrderAction():

{{ render(controller('QiBssFrontendBundle:PmodOrderCRUD:approveOrder', { 'id': object.id, '_sonata_admin': '...' })) }} 

Faisons un exemple simple:

Vous avez une entité Order et sa classe d'administration: OrderAdmin en PurchaseBundle, donc c'est la définition de service Sonate pour OrderAdmin classe (YAML):

services: 
    purchase_bundle.admin.order_admin: 
     class: PurchaseBundle\Admin\OrderAdmin 
     arguments: 
      - ~ 
      - PurchaseBundle\Entity\Order 
      - ~ 
     tags: 
      - { name: 'sonata.admin', manager_type: orm } 

Maintenant, sur la base sur votre propre approveOrderAction(), vous pouvez rendre cette action de la manière suivante:

{{ render(controller('PurchaseBundle:OrderAdmin:approveOrder', { 'id': object.id, '_sonata_admin': 'purchase_bundle.admin.order_admin' })) }} 

Juste vous devez ajouter le code d'administration: 'purchase_bundle.admin.order_admin' et ça devrait marcher!