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 - 没有注销导航栏

Sonata Admin Bundle:DatePicker 范围

Sonata Admin Bundle 和 Doctrine 问题:如何从反面更新实体?

Sonata Admin Bundle + Sonata User Bundle:覆盖登录表单

Sonata Admin Bundle:按计数一对多关系排序