Sonata Admin Bundle 如何配置批处理操作
Posted
技术标签:
【中文标题】Sonata Admin Bundle 如何配置批处理操作【英文标题】:Sonata Admin Bundle How Configure Batch Actions 【发布时间】:2017-02-12 05:20:56 【问题描述】:如何在 Sonata Admin Bundle 中创建自定义配置的批处理操作。 当我选择批处理操作时,我需要使用选定的列表视图项来配置一些更改,然后应用批处理。
我解决了这个问题:
SonataAdmin
public function getBatchActions()
$actions = parent::getBatchActions();
// check user permissions
$actions['change'] = [
'label' => $this->trans('action_group_change', [], 'admin'),
'ask_confirmation' => false,
];
return $actions;
//在控制器中
public function batchActionChange(ProxyQueryInterface $selectedModelQuery, Request $request = null)
// !$this->admin->isGranted('EDIT')
// TODO: при необходимости
//
//
$modelManager = $this->admin->getModelManager();
$selectedModels = $selectedModelQuery->execute();
$ids = [];
foreach ($selectedModels as $selectedModel)
$ids[] = $selectedModel->getId();
return new RedirectResponse(
$this->admin->generateUrl('change', [
'ids' => $ids,
])
);
public function changeAction(Request $request)
$ids = $request->get('ids');
if ($ids === null)
$this->addFlash('sonata_flash_error', 'Ничего не выбрано');
return new RedirectResponse($this->admin->generateUrl('list'));
$form = $this->createForm(new ChangeProxyAdminType());
if ($request->getMethod()==='POST')
$formHandler = $this->get('webface_character.handler.change_proxy');
$handleResult =$formHandler->handle($form,$request);
if ($handleResult)
return new RedirectResponse($this->admin->generateUrl('list'));
return $this->render('WebfaceCharacterBundle:ProxyAdmin:change.html.twig', [
'action' => 'change',
'form' => $form->createView(),
]);
表格类型:
public function buildForm(FormBuilderInterface $builder, array $options)
$builder
->add('user', EntityType::class, [
'class' => User::class,
'empty_data' => null,
'required' => false,
])
->add('username', TextType::class, [
'attr' => [
'class' => 'form-control',
],
'required' => false,
])
->add('password', PasswordType::class, [
'attr' => [
'class' => 'form-control',
],
'required' => false,
])
->add('isArchive', CheckboxType::class, [
'attr' => [
'class' => 'form-control',
],
'required' => false,
]);
表单处理程序:
public function handle(FormInterface $form, Request $request)
if (!$request->isMethod('POST'))
return false;
$form->handleRequest($request);
if (!$form->isValid())
return false;
$data = $form->getData();
$ids = $request->get('ids');
$qb = $this->em->createQueryBuilder();
$query = $qb->update('WebfaceCharacterBundle:Proxy', 'p');
if ($data['user'] !== null)
$user = $this->em->getRepository('WebfaceUserBundle:User')->findOneBy(['id' => $data['user']]);
dump($user);
$query->set('p.user', $user->getId());
if ($data['password'] !== null)
$query->set('p.password', $qb->expr()->literal($data['password']));
if ($data['username'] !== null)
$query->set('p.username',$qb->expr()->literal($data['username']));
$query->set('p.isArchive', $qb->expr()->literal($data['isArchive']));
$query->where($qb->expr()->in('p.id', implode(',', $ids)))
->getQuery()
->getResult();
return true;
我确定这不是最佳解决方案。但我不知道如何为这个问题创建最佳解决方案。
此解决方案不适用于对 1000 个项目的批处理操作,因为在我的解决方案中,所有 id 都传递给 Query 和重定向。
附: (这是草稿)
【问题讨论】:
错误信息是什么? 【参考方案1】:如果您想创建已配置的批处理操作:
-
列表项
创建自定义表单。
使用表单处理程序创建控制器方法
batchAction 呈现形式,其中 action = controllerAction
表单处理后
return new RedirectResponse($this->admin->generateUrl('list'));
【讨论】:
以上是关于Sonata Admin Bundle 如何配置批处理操作的主要内容,如果未能解决你的问题,请参考以下文章
Sonata Admin Bundle ACL 不授予编辑权限
Sonata Admin Bundle:DatePicker 范围
Sonata Admin Bundle 和 Doctrine 问题:如何从反面更新实体?