2
votes

Today at work, I have to create a custom batch action in a Sonata project.

It's ok for that, the problem is :

I want set a specific batch_confirmation template for my new batch action, and I need it have no impact on other.

If no solution exists, I will override the default batch_confirmation template, change it in my sonata config, and make many 'if' statements to keep the basic confirmation for my other admin classes, but I think it's not the cleaner alternative.

Somebody have already has this kind of issues ?

2

2 Answers

4
votes

When you add a custom batch action you'll need a custom action in your controller which exends the normal CRUD controller, see: https://sonata-project.org/bundles/admin/master/doc/reference/batch_actions.html.

Instead of returning a redirect response, like you see in the documentation: you can return any template, e.g.:

return $this->render(
     'YourBundle:Batch:confirmation.html.twig',
      $templateParams
);

In this confirmation template you can add your custom html. When you want to confirm the batch method, you'll need a form that posts back to your custom action with the data you'll need.

From the batch_confirmation.html.twig copy the form to your own confirmation template. In the original batch_confirmation template, a hidden field is set to check if the user confirms: <input type="hidden" name="confirmation" value="ok">

Check in your custom action if the user did confirm (check the request object). Then do the batch action. (You also can return a second step template, to build a wizard).

Finally throw in some flash message

$this->addFlash('sonata_flash_success', 'everything is ok!'); 

and return to the list url:

return new RedirectResponse($this->admin->generateUrl('list', array('filter' => $this->admin->getFilterParameters())));
1
votes

even if it's a bit late but for newcomers who encounter the same problem the solution is simple in the function configureBatchActions you can sepcify the confirmation template :

protected function configureBatchActions($actions)
{

        $actions['YourAction'] = [
            'ask_confirmation' => true,
            'template' => 'YourTemplate'
        ];

    return $actions;
}