Добавление пользовательской формы в шаблон показа административной сущности Sonata

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

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

Из документации я понимаю, что мне нужно использовать это configureRoutes Способ;

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

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

Может кто-нибудь помочь мне решить мою проблему?

1 ответ

_sonata_admin (маршрут) атрибут используется SonataAdminBundle получить требуемый экземпляр администратора ($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' и это должно работать!

Другие вопросы по тегам