SonataAdminBundle批量更新

时间:2014-07-26 01:22:38

标签: symfony sonata-admin batch-updates

我试图在管理信息中心创建一个功能,我有一个products表,我想创建这些批处理功能:

价格更新

选择一个或多个产品,点击价格更新,以带有当前价格选择的产品,在带有名为new_price的输入文本的表单中输入以下内容:%10或 - %10或5或-5 [..],单击“更新”按钮并使用新价格更新所选产品

有效

这与价格更新几乎相同,但使用输入复选框并取消/激活所选产品

数量更新

更新所选产品数量/库存

我试过的是,覆盖CRUDController,如here所述,但在示例中它只显示如何merge个对象,覆盖list__batch.html.twig文件添加输入选项,它没有显示如何创建自定义模板批处理

我尝试的另一件事是覆盖batch_confirmation.html.twig,如下所示:

{% extends base_template %}

{% block actions %}
    <li>{% include 'SonataAdminBundle:Button:list_button.html.twig' %}</li>
    <li>{% include 'SonataAdminBundle:Button:create_button.html.twig' %}</li>
{% endblock %}

{% block tab_menu %}{{ knp_menu_render(admin.sidemenu(action), {'currentClass' : 'active'}, 'list') }}{% endblock %}

{% block content %}
    <div class="sonata-ba-delete">
        <h1>{% trans with {'%action%': action_label} from 'SonataAdminBundle' %}title_batch_confirmation{% endtrans %}</h1>

        {% if data.all_elements %}
            {{ 'message_batch_all_confirmation'|trans({}, 'SonataAdminBundle') }}
        {% else %}
            {% transchoice data.idx|length with {'%count%': data.idx|length} from 'SonataAdminBundle' %}message_batch_confirmation{% endtranschoice %}
        {% endif %}

        <div class="well well-small form-actions">
            <form action="{{ admin.generateUrl('batch', {'filter': admin.filterParameters}) }}" method="POST" >
                <input type="hidden" name="confirmation" value="ok">

                <input type="hidden" name="_sonata_csrf_token" value="{{ csrf_token }}">

                {% if data.action == "price_update" %}
                    <input type="text" name="new_price" value="BILLION" />
                    <input type="hidden" name="idx" value="{{ data.idx|json_encode }}">
                    <input type="hidden" name="all_elements" value="{{ data.all_elements }}">
                    <input type="hidden" name="action" value="{{ data.action }}">

                    # Show object rows
                {% else if data.action == "quantity_update" %}
                    # Show quantity_update object rows
                {% else if data.action == "de_activate_update" %}
                    # Show de_activate_update object rows
                {% else %} # delete batch action here!
                    <input type="hidden" name="data" value="{{ data|json_encode }}">
                {% endif %}

                # Don't know why this form is not displayed
                <div style="display: none">
                    {{ form_rest(form) }}
                </div>


                <button type="submit" class="btn btn-danger">{{ 'btn_execute_batch_action'|trans({}, 'SonataAdminBundle') }}</button>

                {% if admin.hasRoute('list') and admin.isGranted('LIST') %}
                    {{ 'delete_or'|trans({}, 'SonataAdminBundle') }}

                    <a class="btn btn-success" href="{{ admin.generateUrl('list') }}">
                        <i class="glyphicon glyphicon-th-list"></i> {{ 'link_action_list'|trans({}, 'SonataAdminBundle') }}
                    </a>
                {% endif %}
            </form>
        </div>
    </div>
{% endblock %}

此外,我必须覆盖batchAction()中的方法CRUDController来管理请求

这是正确的方法吗?

1 个答案:

答案 0 :(得分:0)

我认为您的 Active 复选框应该只是一个可编辑的布尔值:

public function configureListFields(ListMapper $list)
{
    $list->add('active', null, array('editable' => true));
}

查看文档: Admin's documentation - Reference - Action List (master) - 9.2. Customizing the fields displayed on the list page

是否必须每行设置其他批处理操作,或者您希望选择多行,然后在列表的页脚上选择您的操作和设置(价格等)?

这就是我解决批处理操作的方法,我需要一个额外的日期字段: https://github.com/sonata-project/SonataAdminBundle/issues/2336#issuecomment-54800396

我将很快添加一篇博文,您还可以在其中看到CRUDController中的操作。