Sudhakar Krishnan
Sudhakar Krishnan

Reputation: 860

Multi step batch action in Sonata Admin

I have a contact entity. Where the website users will send message to admin. At ADMIN the admin need to send reply MSG to the users(Entity has an email field). Form sonata admin batch action doc - I created a replyMSG batch action for individual contact entity item(Its working successfully).

enter image description here

But I failed to create multiple reply(Mail carbon copy).

What I needed is, Admin select a list of items and select batchSMS (form batch action choice "Reply Selected - refer attached IMAGE") and click ok button. Then bootstrap MODEL needs to be popup with a textarea field - admin fills it - and submit to do process(Handle this in customCRUD - I know this from admin doc).

enter image description here

Does anyone succeed in this MULTI-STEP batch action? I refered these following links but no success..

Upvotes: 2

Views: 1306

Answers (1)

Sudhakar Krishnan
Sudhakar Krishnan

Reputation: 860

I solved with the following code,

At Admin 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;
        }
    }

and at 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 code

$('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;
            }
        });

and at custom 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()));
    }

Upvotes: 1

Related Questions