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 中处理 - 我从管理员文档中知道)。
有人成功完成了这个多步批量操作吗?我参考了以下链接但没有成功..
- Sonata Admin Bundle - add a multi step batch action
- Batch multi step and/or form multi step in sonata admin bundle
我用下面的代码解决了,
在管理员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()));
}
我有一个联系人实体。网站用户将向管理员发送消息的位置。在 ADMIN,管理员需要向用户发送回复 MSG(实体有一个电子邮件字段)。 Form sonata admin 批处理操作文档 - 我为单个联系人实体项目创建了一个 replyMSG 批处理操作(它工作成功)。
但是我创建多个回复失败(邮件抄送)。
我需要的是,管理员 select 项目列表和 select batchSMS(形成批处理操作选择 "Reply Selected - refer attached IMAGE")并单击确定按钮。然后 bootstrap MODEL 需要弹出一个文本区域字段 - 管理员填写它 - 并提交以进行处理(在 customCRUD 中处理 - 我从管理员文档中知道)。
有人成功完成了这个多步批量操作吗?我参考了以下链接但没有成功..
- Sonata Admin Bundle - add a multi step batch action
- Batch multi step and/or form multi step in sonata admin bundle
我用下面的代码解决了,
在管理员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()));
}