2016-07-28 4 views
8

Ich möchte ein kleines Formular erstellen und eine Sonata Admin Show-Vorlage erstellen. Was ich bisher gemacht habe, ist das Erstellen der Funktion in der benutzerdefinierten CRUD für diese spezifische Entität (Reihenfolge), die sich von Sonatas Standard-CRUD erstreckt;Hinzufügen eines benutzerdefinierten Formulars in der Show-Vorlage einer Sonata Admin-Entität

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(), 
    )); 
} 

In meiner orderAdmin habe ich die configShowFields Methode;

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() 
    ; 
} 

Die order_actions Vorlage sieht wie folgt aus und wird die entsprechende Funktionalität nach dem Status der Bestellung zeigen und wer angemeldet ist, so wie mit so vielen diffent Routen funktionieren ?;

<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> 

Beim Versuch bekomme ich einen Fehler;

Eine Ausnahme während der Wiedergabe einer Vorlage geworfen wurde ("Es gibt keine _sonata_admin für den Controller definiert ApBundle\Controller\PmodOrderCRUDController und der aktuelle Route` `") in AppBundle: PmodOrderAction: order_actions.html.twig in Zeile 3.

ich von der documentation verstehen, die ich brauche zu Verwendung dieses configureRoutes Verfahren zu machen;

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

Aber ich kann es nicht bekommen zu arbeiten, und ich bin nicht sicher, wie Formen anstelle einer einfachen Link-Taste zu machen.

Kann mir bitte jemand helfen, mein Problem zu beheben?

Antwort

2

Das _sonata_admin (Strecke) Attribut wird von verwendet, um die erforderlichen Admin Instanz zu erhalten ($this->admin) und in der Lage sein, Ihre Anfragen zu konfigurieren/Prozess:

Nach der richtigen Weg Definition hinzuzufügen:

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

Sie müssen auch die _sonata_admin Code hinzufügen, um die richtige Anfrage approveOrderAction() zu generieren:

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

Nehmen wir ein einfaches Beispiel machen:

Sie haben eine Order Unternehmen und seine Admin-Klasse: OrderAdmin in PurchaseBundle, so ist dies der Service-Definition Sonate für OrderAdmin Klasse (Yaml):

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

Nun basiert auf Ihrem eigenen approveOrderAction(), können Sie diese Aktion in der folgenden Art und Weise machen:

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

Nur müssen Sie den Admin-Code hinzu: 'purchase_bundle.admin.order_admin' und es sollte funktionieren!

Verwandte Themen