Adding action in SonataAdminBundle

10,125

Finally got it !

In the admin class :

protected function configureRoutes(RouteCollection $collection)
{
    $collection->add('calculate');

}

# Override to add actions like delete, etc...
public function getBatchActions()
{
    // retrieve the default (currently only the delete action) actions
    $actions = parent::getBatchActions();

    // check user permissions
    if($this->hasRoute('edit') && $this->isGranted('EDIT') && $this->hasRoute('delete') && $this->isGranted('DELETE'))
    {
        // define calculate action
        $actions['calculate']= array ('label' => 'Calculate', 'ask_confirmation'  => true );

    }

    return $actions;
}

protected function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ->addIdentifier('id')
        ->add('name')        
        // add custom action links
        ->add('_action', 'actions', array(
            'actions' => array(
                'view' => array(),
                'calculate' => array('template' => 'chemoinfoEdrugBundle:CRUD:list__action_calculate.html.twig'),
                'edit' => array(),
            )
        ))
    ;
}

and in admin controller :

public function batchActionCalculate(ProxyQueryInterface $selectedModelQuery)
{
    ...
}

and in /src/mysite/mybundle/Resources/views/CRUD :

{% if admin.isGranted('EDIT', object) and admin.hasRoute('edit') %}
<a href="{{ admin.generateObjectUrl('calculate', object) }}" class="calculate_link" title="{{ 'action_calculate'|trans({}, 'SonataAdminBundle') }}">
    <img src="{{ asset('bundles/sonataadmin/famfamfam/calculator.png') }}" alt="{{ 'action_calculate'|trans({}, 'SonataAdminBundle') }}" />
</a>
{% endif %}
Share:
10,125
qdelettre
Author by

qdelettre

Updated on July 20, 2022

Comments

  • qdelettre
    qdelettre almost 2 years

    I'm trying to add an action in sonata admin bundle. I changed my Admin class with :

    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->addIdentifier('id')
            ->add('name')        
            // add custom action links
            ->add('_action', 'actions', array(
                'actions' => array(
                    'view' => array(),
                    'calculate' => array('template' => 'myappMyBundle:Admin:list__action_calculate.html.twig'),
                    'edit' => array(),
                )
            ))
        ;
    }
    

    and

    protected function configureSideMenu(MenuItemInterface $menu, $action, Admin $childAdmin = null)
    {
        if (!$childAdmin && !in_array($action, array('edit'))) {
            return;
        }
        $admin = $this->isChild() ? $this->getParent() : $this;
        $id = $admin->getRequest()->get('id');
        $menu->addChild('calculate', array('uri' => 'http://google.com?id=' . $id));
    }
    

    and put a template called list__action_calculate.html.twig in src/myapp/MyBundle/Resources/views/Admin/ :

    {% if admin.isGranted('EDIT', object) and admin.hasRoute('edit') %}
    <a href="{{ admin.generateObjectUrl('calculate', object) }}" class="calculate_link" title="{{ 'action_calculate'|trans({}, 'SonataAdminBundle') }}">
        <img src="{{ asset('bundles/sonataadmin/famfamfam/page_white_edit.png') }}" alt="{{ 'action_calculate'|trans({}, 'SonataAdminBundle') }}" />
    </a>
    {% endif %}
    

    But i got this error from symfony :

    An exception has been thrown during the rendering of a template 
    ("unable to find the route `mysite.mybundle.admin.myentity.calculate`") 
    in "SonataAdminBundle:CRUD:list.html.twig"
    

    What have i missed ? Is there a clue in the documentation than this page of the Doc.

  • Brais Gabin
    Brais Gabin about 10 years
    Official documentation: Batch actions