在奏鸣曲管理实体的显示模板中添加自定义表单

Posted

技术标签:

【中文标题】在奏鸣曲管理实体的显示模板中添加自定义表单【英文标题】:Adding a custom form inside the show template of a Sonata Admin Entity 【发布时间】:2016-12-02 18:25:32 【问题描述】:

我想在 Sonata Admin 表演模板中生成一个小表单。到目前为止,我所做的是在自定义 CRUD 中为从 Sonata 的默认 CRUD 扩展的特定实体(订单)创建函数;

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

在我的 orderAdmin 中,我有 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 行。

我从documentation了解到我需要使用这个configureRoutes方法;

protected function configureRoutes(RouteCollection $collection)

    $collection->add('clone', $this->getRouterIdParameter().'/clone');

但我无法让它工作,我不确定如何呈现表单而不是简单的链接按钮。

有人可以帮我解决我的问题吗?

【问题讨论】:

【参考方案1】:

SonataAdminBundle 使用_sonata_admin(路由)属性来获取所需的管理实例 ($this-&gt;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 实体及其管理类:OrderAdminPurchaseBundle,所以这是 Sonata 对 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' 即可!

【讨论】:

以上是关于在奏鸣曲管理实体的显示模板中添加自定义表单的主要内容,如果未能解决你的问题,请参考以下文章

如何使用奏鸣曲管理员创建自定义列表

Symfony2:奏鸣曲实体中的自定义标识符

我得到了 FatalErrorException: 试图在奏鸣曲管理员中创建自定义操作

与 FOSUserBundle 和易于扩展的自定义实体创建关系时出错

将自定义奏鸣曲页面路由添加到导航栏

在 django 中覆盖管理模板以添加自定义 javascript