2016-07-28 10 views
8

Chcę wygenerować mały formularz z szablonem Sonata Admin show. To, co do tej pory zrobiłem, to tworzenie funkcji w niestandardowym CRUD dla tej konkretnej jednostki (porządku), która rozciąga się od domyślnego CRUDa Sonaty;Dodawanie niestandardowego formularza wewnątrz szablonu prezentacji Sonaty Admin Entity

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

W moim zamówieniuAdmin Mam metodę 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() 
    ; 
} 

Szablon order_actions wygląda i pokaże istotne funkcje w zależności od statusu zamówienia i kto jest zalogowany, a więc w jaki sposób pracować z tyloma diffent trasach ?;

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

Podczas próby tego pojawia się błąd;

Wyjątek został wyrzucony podczas renderowania szablonu („Nie ma _sonata_admin zdefiniowane dla kontrolera ApBundle\Controller\PmodOrderCRUDController i aktualnej trasie ` `”) w AppBundle: PmodOrderAction: order_actions.html.twig na linii 3.

rozumiem ze documentation że muszę skorzystać z tej metody configureRoutes;

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

Ale nie mogę go uruchomić i nie mam pewności, jak renderować formularze zamiast prostego przycisku łącza.

Czy ktoś może mi pomóc rozwiązać mój problem?

Odpowiedz

2

_sonata_admin (trasa) atrybut jest używany przez aby uzyskać wymaganą administratora instancji ($this->admin) i być w stanie skonfigurować/przetworzyć żądania:

Po dodać odpowiednią definicję trasy:

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

trzeba dodać także kod _sonata_admin wygenerować odpowiednią prośbę do approveOrderAction():

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

Zróbmy prosty przykład:

Masz Order podmiot oraz jego klasę admin: OrderAdmin do PurchaseBundle, więc jest to definicja Sonaty służba dla OrderAdmin klasy (yaml):

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

Teraz, w oparciu na własnym approveOrderAction() można uczynić tę akcję w następujący sposób:

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

Tylko trzeba dodać kod administratora: 'purchase_bundle.admin.order_admin' i powinno działać!

Powiązane problemy