Fatal error : Declaration of {{path}}::validate() must be compatible with that of Sonata\AdminBundle\Admin\AdminInterface::validate()

You are trying to setup a custom validator on Sonata and you get this error :

Fatal error: Declaration of Adin\AdminBundle\Admin\AnnonceAdmin::validate() must be compatible with that of Sonata\AdminBundle\Admin\AdminInterface::validate() in /home/www/arlogis/src/Adin/AdminBundle/Admin/AnnonceAdmin.php on line 250

Don’t panic, just add this at the begining of your class

1
use Sonata\AdminBundle\Validator\ErrorElement;

in our example it’s in this file : /AdminBundle/Admin/AnnonceAdmin.php

Symfony2 sonata custom CRUD template

It is possible to change templates use by default.

First, override the controller action method, in your AdminBundle/Controller/SecteurAdminController.php file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
    * return the Response object associated to the list action
    *
    * @return Response
    */
   public function listAction()
   {
       if (false === $this->admin->isGranted('LIST')) {
           throw new AccessDeniedException();
       }
 
       $datagrid = $this->admin->getDatagrid();
       $formView = $datagrid->getForm()->createView();
 
       // set the theme for the current Admin Form
       $this->get('twig')->getExtension('form')->setTheme($formView, $this->admin->getFilterTheme());
 
       //custom code from here
       $total = 0;
       $enable = 0;
       $new = 0;
       $site = $this->admin->site;
 
       $repository = $this->getDoctrine()->getRepository('TripixAdminBundle:Annonce');
       $total = $repository->getNombreAnnonceTotal($site);
       $enable = $repository->getNombreAnnonceEnabled($site);
       $new = $repository->getNombreAnnonceNew($site);
 
 
 
       return $this->render('TripixAdminBundle:CRUD:list_secteur.html.twig', array(
           'action'   => 'list',
           'form'     => $formView,
           'datagrid' => $datagrid,
           'total'     => $total,
           'enable'    => $enable,
           'new'       => $new,
       ));
   }

The import thing on previous code is the render() fonction, the first parameter is the template to use.
In our example, the template file will be /AdminBundle/Ressources/view/CRUD/list_secteur.html.twig

You can use the /AdminBundle/Ressources/view/CRUD/base_secteur.html.twig file as example for your custom template.

Parent function to override on the controller are here : /vendor/bundles/Sonata/AdminBundle/Controller/CRUDController.php

Symfony2 Sonata add custom column on page list

To add a custom column on a page list, just follow these steps. In the example, we will add a “Nombre d’annoce(s)” column.

On your admin class file (ex: /AdminBundle/Admin/SecteurAdmin.php), on your configureListFields() fonction, add a new entry on the listMapper object

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * @param \Sonata\AdminBundle\Datagrid\ListMapper $listMapper
 * @return void
 */
protected function configureListFields(ListMapper $listMapper) {
    $listMapper
            ->addIdentifier('titre')
            ->add('Tri', 'string', array('template' => 'TripixAdminBundle:Admin:list_tri.html.twig'))
            ->add('Nb', 'string', array('label' => 'Nombre d\'annonce(s)', 'template' => 'TripixAdminBundle:Admin:list_nb_annonce.html.twig'))
            ->add('_action', 'actions', array(
                'actions' => array(
                    'edit' => array(),
                    'delete' => array(),
                )
            ))
    ;
}

This new entry said to use the TripixADminBundle:Admin:list_tri.html.twig template.

Now, create your template file (list_nb_annonce.html) in the /AdminBundle/ressources/view/admin/ directory.

1
2
3
4
5
6
7
8
9
{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}
 
{% block field%}
{% if admin.datagrid.results|length > 1 %}
 <div>
        <strong>{{ object.getNombreAnnonce}}</strong>
    </div>
{% endif %}
{% endblock %}

In our example, getNombreAnnonce() is not defined, let’s do it
In the /adminBundle/Entity/Secteur.php file, add

1
2
3
4
public function getNombreAnnonce()
 {
   return count($this->getAnnonces());
 }

That’s all.

must be compatible with that of Sonata\AdminBundle\Admin\AdminInterface::validate() error message

You are using sonata and want to validate some fields.
You innocently add the validate function to your Admin file

1
2
3
function validate(ErrorElement $errorElement, $object)
{
}

Then, you get this error :

1
Fatal error: Declaration of Adin\AdminBundle\Admin\AnnonceAdmin::validate() must be compatible with that of Sonata\AdminBundle\Admin\AdminInterface::validate() in /home/www/arlogis/src/Adin/AdminBundle/Admin/AnnonceAdmin.php on line 251

You checked to AdminInterface file the declaration is the same.

To fix it, you need to use additionnal namespace :

1
2
use Sonata\AdminBundle\Validator\ErrorElement;
use Symfony\Component\Validator\ValidatorInterface;