2016-07-28 2 views
8

Я хочу сгенерировать небольшую форму в виде шаблона представления Sonata Admin. То, что я сделал до сих пор, заключается в создании функции в пользовательском CRUD для этой конкретной сущности (порядка), которая простирается от CRAD по умолчанию Sonata;Добавление пользовательской формы внутри шаблона отображения элемента администрирования 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(), 
    )); 
} 

В моем заказеAdmin У меня есть метод 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() 
    ; 
} 

order_actions шаблона выглядит следующим образом и будет показывать соответствующую функциональность в соответствии со статусом заказа и вошедший в, таким образом, как работать с таким количеством 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> 

При попытке это я получаю сообщение об ошибке;

Исключение было брошено во время рендеринга шаблона («Там нет _sonata_admin определен для контроллера ApBundle\Controller\PmodOrderCRUDController и текущего маршрута` `») в AppBundle: PmodOrderAction: order_actions.html.twig в строке 3.

Я понимаю, из documentation, что мне нужно, чтобы использовать этот метод configureRoutes;

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

Но я не могу заставить его работать, и я не уверен, как визуализировать формы вместо простой кнопки ссылки.

Может кто-нибудь, пожалуйста, помогите мне исправить мою проблему?

ответ

2

Атрибут (маршрут) _sonata_admin используется для получения необходимого администратора экземпляра ($this->admin) и быть в состоянии настроить/обрабатываем ваши запросы:

После добавить правильное определение маршрута:

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

Вам нужно добавить также _sonata_admin код для генерации правильного запроса approveOrderAction():

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

Давайте сделаем простой пример:

У вас есть Order сущности и его администратора класс: OrderAdmin в PurchaseBundle, так что это определение Сонаты сервиса для OrderAdmin класса (YAML):

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

Теперь, на основании на свой собственный approveOrderAction(), вы можете сделать это действие в следующем образом:

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

Просто нужно добавить код администратора: 'purchase_bundle.admin.order_admin' и он должен работать!