Sonata Admin 中的多步批处理操作

Multi step batch action in Sonata Admin

我有一个联系人实体。网站用户将向管理员发送消息的位置。在 ADMIN,管理员需要向用户发送回复 MSG(实体有一个电子邮件字段)。 Form sonata admin 批处理操作文档 - 我为单个联系人实体项目创建了一个 replyMSG 批处理操作(它工作成功)。

但是我创建多个回复失败(邮件抄送)。

我需要的是,管理员 select 项目列表和 select batchSMS(形成批处理操作选择 "Reply Selected - refer attached IMAGE")并单击确定按钮。然后 bootstrap MODEL 需要弹出一个文本区域字段 - 管理员填写它 - 并提交以进行处理(在 customCRUD 中处理 - 我从管理员文档中知道)。

有人成功完成了这个多步批量操作吗?我参考了以下链接但没有成功..

我用下面的代码解决了,

管理员class

public function getTemplate($name) {
        switch ($name) {
            case 'list': return 'admin/backend/contact/contact_batch_reply.html.twig';
                break;
            default : return parent::getTemplate($name);
                break;
        }
    }

admin/backend/contact/contact_batch_reply.html.twig

{% extends 'SonataAdminBundle:CRUD:base_list.html.twig' %}

{% block batch_actions %}
    <label class="checkbox" for="{{ admin.uniqid }}_all_elements">
        <input type="checkbox" name="all_elements" id="{{ admin.uniqid }}_all_elements"/>
        {{ 'all_elements'|trans({},'SonataAdminBundle') }} ({{ admin.datagrid.pager.nbresults }})
    </label>
    <div id="fz_reply_msg" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
        <div class="modal-dialog modal-lg">
            <div class="modal-content">
                <div class="modal-header">
                    <button aria-hidden="true" data-dismiss="modal" class="close" type="button">×</button>
                    <h4 class="modal-title">Replay Message</h4>
                </div>
                <div class="modal-body">
                    <div class="box box-success">
                        <div class="box-header"><h3 class="box-title">Message: </h3></div>
                        <div class="box-body">
                            <div class="fz_reply_msg form-group col-xs-12">{{ form_widget(actionForm.msg) }}</div>
                            <div class="clearfix"></div>
                        </div>
                    </div>
                </div>
                <div class="modal-footer">
                    <button id="fz_reply_msg_submit" class="btn btn-primary" type="submit">Submit</button>
                    <button class="btn btn-default" type="reset">Clear</button>
                </div>
            </div>
        </div>
    </div>
    <select name="action" style="width:auto;height: auto" class="form-control">
        {% for action, options in batchactions %}
            <option value="{{ action }}">{{ options.label }}</option>
        {% endfor %}
    </select>
{% endblock batch_actions %}

JQuery代码

$('input[type=submit]').click(function (e) {
            e.preventDefault();
            var value = $('select[name="action"] option:selected').val();
            if (value === 'batchReply') {
                $('#fz_reply_msg').modal('show');
            }
        });
        $('button[type=submit]').click(function () {
            var v = $('textarea#msg').val();
            if ((v !== null) && (v.length > 0)) {
                return true;
            } else {
                $('textarea#msg').select();
                return  false;
            }
        });

和自定义 CRUDController class

public function batchActionBatchReply(ProxyQueryInterface $selectedModelQuery) {
        if (!$this->admin->isGranted('EDIT')) {
            throw new AccessDeniedException();
        }
        $selectedModels = $selectedModelQuery->execute();
        $r = [];
        try {
            foreach ($selectedModels as $selectedModel) {
                $r = [$selectedModel->getName() => $selectedModel->getEmail()];
            }
        } catch (\Exception $e) {
            $this->addFlash('sonata_flash_error', 'ERROR : ' . $e->getMessage());
            return new RedirectResponse($this->admin->generateUrl('list', $this->admin->getFilterParameters()));
        }
        // PROCESS CODE ...
        $this->addFlash('sonata_flash_success', 'The selected items has been Replayed');
        return new RedirectResponse($this->admin->generateUrl('list', $this->admin->getFilterParameters()));
    }