export fails when using custom twigs
Hello, If I use twigs for customizing a cell in the grid and and the grid globaly, the export fails with "Block "grid_titles" doesn't exist in grid template "ee"." An example based on https://github.com/npotier/apydatagrid-demo author/book in config/packages/twig.yaml:
paths:
'%kernel.project_dir%/vendor/apy/datagrid-bundle/Resources/views': apy
templates/grid.html.twig:
{% extends '@apy/blocks.html.twig' %}
{# ------------------------------------------------------ grid ------------------------------------------------------ #}
{% block grid %}
<div class="grid">
{% if grid.totalCount > 0 or grid.isFiltered or grid.noDataMessage is same as (false) %}
<form id="{{ grid.hash }}" action="{{ grid.routeUrl }}" method="post">
<div class="grid_header">
{% if grid.massActions|length > 0 %}
{{ grid_actions(grid) }}
{% endif %}
</div>
<div class="grid_body">
<table class="table table-sm table-striped table-bordered">
<thead>
{% if grid.isTitleSectionVisible %}
{{ grid_titles(grid) }}
{% endif %}
{% if grid.isFilterSectionVisible %}
{{ grid_filters(grid) }}
{% endif %}
</thead>
<tbody>
{{ grid_rows(grid) }}
</tbody>
</table>
</div>
<div class="grid_footer">
{% if grid.isPagerSectionVisible %}
{{ grid_pager(grid) }}
{% endif %}
{% if grid.exports|length > 0 %}
{{ grid_exports(grid) }}
{% endif %}
{% if grid.tweaks|length > 0 %}
{{ grid_tweaks(grid) }}
{% endif %}
</div>
{% if withjs %}
{{ grid_scripts(grid) }}
{% endif %}
</form>
{% else %}
{{ grid_no_data(grid) }}
{% endif %}
</div>
{% endblock grid %}
templates/author/index.html.twig
{% extends 'base.html.twig' %}
{% block title %}Author index{% endblock %}
{% block body %}
<h1>Author index</h1>
{{ grid(grid, "author/grid_template.html.twig") }}
<a href="{{ path('author_new') }}">Create new</a>
{% endblock %}
templates/author/grid_template.html.twig `{% extends 'grid.html.twig' %}
{% block grid_column_id_cell %} here {{ value }} {% endblock %}`
AuthorController ` /** * @Route("/", name="author_index", methods={"GET", "POST"}) */ public function index(AuthorRepository $authorRepository, \APY\DataGridBundle\Grid\Grid $grid): Response { $source = new Entity(Author::class); // Attach the source to the grid $grid->setSource($source); $grid->addExport(new CSVExport('CSV Export', 'export')); return $grid->getGridResponse('author/index.html.twig',[ 'authors' => $authorRepository->findAll(), ]);
}`
Nota: same error if grid.html.twig doesn't extend blocks.html.twig
I forgot to say: apy/datagrid-bundle 4.0.2 symfony 5.4.7 php 7.2.24
HI, @FredDut it's seems to be a bug introduced here.
It's not TemplateWrapper class that should be use but ```Twig\Template``class
Hi @mhor , rolling back to Twig\Template is not enough. I've to change
public function setTemplate($template)
{
if (is_string($template)) {
if (substr($template, 0, 8) === '__SELF__') {
$this->templates = $this->getTemplatesFromString(substr($template, 8));
$this->templates[] = $this->twig->loadTemplate(static::DEFAULT_TEMPLATE);
} else {
$this->templates = $this->getTemplatesFromString($template);
}
} elseif ($this->templates === null) {
$this->templates[] = $this->twig->loadTemplate(static::DEFAULT_TEMPLATE);
} else {
throw new \Exception('Unable to load template');
}
return $this;
}
in
public function setTemplate($template)
{
if (is_string($template)) {
if (substr($template, 0, 8) === '__SELF__') {
$this->templates = $this->getTemplatesFromString(substr($template, 8));
$this->templates[] = $this->twig->loadTemplate(static::DEFAULT_TEMPLATE);
} else {
$this->templates = $this->getTemplatesFromString($template);
$this->templates[] = $this->twig->loadTemplate(static::DEFAULT_TEMPLATE);
}
} elseif ($this->templates === null) {
$this->templates[] = $this->twig->loadTemplate(static::DEFAULT_TEMPLATE);
} else {
throw new \Exception('Unable to load template');
}
return $this;
}
or this
public function setTemplate($template)
{
if (is_string($template)) {
if (substr($template, 0, 8) === '__SELF__') {
$this->templates = $this->getTemplatesFromString(substr($template, 8));
} else {
$this->templates = $this->getTemplatesFromString($template);
}
$this->templates[] = $this->twig->loadTemplate(static::DEFAULT_TEMPLATE);
} elseif ($this->templates === null) {
$this->templates[] = $this->twig->loadTemplate(static::DEFAULT_TEMPLATE);
} else {
throw new \Exception('Unable to load template');
}
return $this;
}
but I don't really know what I'm doing I don't know why the DEFAULT_TEMPLATE is not loaded by getTemplatesFromString and why it was working before.
Hello @FredDut thank you for reporting this bug.
I've updated the demo repo here https://github.com/npotier/apydatagrid-demo to reproduce this case.
With the latest version of APYDatagridBundle, I don't reproduce this bug.
Could you try and confirm it please ?
Thank you 😄
Hello, I don't reproduce it anymore, neither do I. It's fixed. Thanks