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 twig add new function file_exists

An important function is missing on twig : file_exists.

I will show you here how to define a new function for twig.

On your namespace/bundle, add a Twig/Extension directory and create your class file :
/src/Adin/ArlogisBundle/Twig/Extension/FileExistsExtension.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
 
namespace Adin\ArlogisBundle\Twig\Extension;
 
class FileExistsExtension extends \twig_Extension
{
        /**
         *Return the function registered as twig extension
         *
         *@return array
         */
        public function getFunctions()
        {
                return array(
                        'file_exists' => new \Twig_Function_Function('file_exists'),
                        );
        }
 
        public function getName()
        {
                return 'adin_file_exists';
        }
}
?>

You then have to register your service, add a in your /Adin/ArlogisBundle/Ressources/config/services.xml file

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" ?>
 
<services>
       <service id="adin.twig.tripix_extension" class="Adin\ArlogisBundle\Twig\Extension\FileExistsExtension">
        <tag name="twig.extension" />
        </service>
    </services>
</container>

It’s ready, you can use it on your twig template

1
2
3
4
5
{% if file_exists('/var/www/image.jpg') %}
    File exists
{% else %}
    File not exists
{% endif %}

Be carefull, you need to specify the absolute path of the file. You can create a twig global variable root_path.
app/config/config.yml

1
2
3
4
# Twig Configuration
twig:
    globals:
        root_path: %kernel.root_dir%/../web

Then on twig template

1
2
3
4
5
{% if file_exists({{root_path}}'/var/www/image.jpg') %}
    File exists
{% else %}
    File not exists
{% endif %}