8

Is it possible to override the template for the form type: "sonata_type_collection"?

Ive tried along these lines:

$formMapper->add('slides', 'sonata_type_collection', array(), array(
                'edit' => 'inline',
                'inline' => 'table',
                'sortable'  => 'priority',
                'template' => 'MyBundle:Form:slides.admin.html.twig'
            ));

but to no avail.

I know I could override the entire template, but I only want to do it for this form, not all the places where I use this form type.

Does anyone know if this is possible?

Thanks

lopsided
  • 2,370
  • 6
  • 28
  • 40

1 Answers1

18

I found a great bit of code in /vendor/sonata-project/admin-bundle/Sonata/AdminBundle/Form/Extension/Field/Type/FormTypeFieldExtension.php which actually sets up an array of types to attach to the form view which it uses to prioritise twig block rendering: (lines 99 to 105)

// add a new block types, so the Admin Form element can be tweaked based on the admin code
        $types    = $view->getVar('types');
        $baseName = str_replace('.', '_', $sonataAdmin['field_description']->getAdmin()->getCode());
        $baseType = $types[count($types) - 1];

        $types[] = sprintf('%s_%s', $baseName, $baseType);
        $types[] = sprintf('%s_%s_%s', $baseName, $sonataAdmin['field_description']->getName(), $baseType);

Therefore all I had to do was define a block called mycompany_admin_content_galleries_sonata_type_collection_widget or mycompany_admin_content_galleries_slides_sonata_type_collection_widget and it only applies to this admin form :)

To complete this solution in my Admin class I added this function:

public function getFormTheme()
{
    return array_merge(
        parent::getFormTheme(),
        array('MyBundle:Gallery:admin.slides.html.twig')
    );
}

and I created MyBundle/Resources/views/Gallery/admin.slides.html.twig, containing the following:

{% use 'SonataAdminBundle:Form:form_admin_fields.html.twig' %} // I think this 
             line is not really needed as the base admin's form theme uses this file

{% block my_bundle_content_pages_slides_sonata_type_collection_widget %}

    // copied and edited the contents of Sonata/DoctrineORMAdminBundle/Resources/views/CRUD/edit_orm_one_to_many.html.twig

{% endblock %}
lopsided
  • 2,370
  • 6
  • 28
  • 40
  • Just completing your answer, you can register your template files with twig so you don't need to merge the term in the admin class with "getFormTheme()", see: http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html#creating-a-template-for-the-field – Cassiano Aug 04 '14 at 14:20
  • 1
    There where you mentioned "to define a black called..." the same as the last step where you create a block in admin.slides.html.twig?? Or where do you define that block? – Mentos93 Aug 17 '16 at 13:28