Custom Admin Controller

1. Create your controller

Your controller must extend the ContentController:

<?php

// AlbumController.php

namespace Acme\AdminBundle\Controller;

use Snowcap\AdminBundle\Controller\ContentController;
use Snowcap\AdminBundle\Admin\ContentAdmin;

class AlbumController extends ContentController
{
    public function changeStatusAction(Request $request, ContentAdmin $admin)
    {
        $album = $this->getDoctrine()->getRepository('AcmeSiteBundle:Album')->find($request->query->get('id'));
        if(null === $album) {
            throw new NotFoundHttpException('No album with this id was found.');
        }

        $this->secure($admin, 'ADMIN_CONTENT_UPDATE', $album);

        // Do whatever you want there
    }
}

2. Add your route for the admin

You have to override the addRoutes() function in your admin:

<?php

// AlbumAdmin.php

namespace Acme\AdminBundle\Admin;

use Snowcap\AdminBundle\Admin\ContentAdmin;
use Snowcap\AdminBundle\Datalist\DatalistInterface;
use Symfony\Component\Routing\RouteCollection;

class AlbumAdmin extends ContentAdmin
{
    // ...

    /**
     * @param RouteCollection $routeCollection
     */
    public function addRoutes(RouteCollection $routeCollection)
    {
        parent::addRoutes($routeCollection);

        // Add changeStatus route
        $routeCollection->add(
            $this->getRoutingHelper()->getRouteName($this, 'changeStatus'),
            $this->getRoutingHelper()->getRoute($this, 'changeStatus', array('id'))
        );
    }


    // You can even add a button directly in your datalist

    /**
     * @return DatalistInterface
     */
    public function getDatalist()
    {
        return $this->getDatalistFactory()
            ->createBuilder('base', array(
                    'admin' => $this,
                    'data_class' => $this->getEntityClass(),
                )
            )
            // ... All your fields and filters here

            ->addAction(
                'changeStatus',
                'content_admin',
                array(
                    'admin' => $this,
                    'action' => 'changeStatus',
                    'label' => 'datalist.change_status',
                    'icon' => 'pencil',
                )
            )
            ->getDatalist();
    }
}