Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony

KnpMenuBundle

31 janvier 2018 à 16:22:39

Bonsoir,

J'essaie de finaliser la mise en place d'un menu pour le back-office admin de mon application à l'aide du bundle KnpMenuBundle. Seulement voilà, je rencontre une erreur sur laquelle j'essaie de me documenter, qui est la suivante : 

Accessing Twig_Template attributes is forbidden.

En effet, au moment d'arriver sur la page ou est censé s'afficher le menu, l'erreur précédente est levée ! D'après ce que j'ai pu lire, il s'agit d'un soucis inhérent à l'évolution des versions de Twig entre la 1-x et la 2-x par rapport à l'utilisation des macros.

J'ai récupéré le template suivant servant à la construction du menu en HTML : 

{% extends 'knp_menu.html.twig' %}

{% block item %}
{% import "knp_menu.html.twig" as macros %}
{% if item.displayed %}
    {%- set attributes = item.attributes %}
    {%- set is_dropdown = attributes.dropdown|default(false) %}
    {%- set divider_prepend = attributes.divider_prepend|default(false) %}
    {%- set divider_append = attributes.divider_append|default(false) %}

{# unset bootstrap specific attributes #}
    {%- set attributes = attributes|merge({'dropdown': null, 'divider_prepend': null, 'divider_append': null }) %}

    {%- if divider_prepend %}
        {{ block('dividerElement') }}
    {%- endif %}

{# building the class of the item #}
    {%- set classes = item.attribute('class') is not empty ? [item.attribute('class')] : [] %}
    {%- if matcher.isCurrent(item) %}
        {%- set classes = classes|merge([options.currentClass]) %}
    {%- elseif matcher.isAncestor(item, options.depth) %}
        {%- set classes = classes|merge([options.ancestorClass]) %}
    {%- endif %}
    {%- if item.actsLikeFirst %}
        {%- set classes = classes|merge([options.firstClass]) %}
    {%- endif %}
    {%- if item.actsLikeLast %}
        {%- set classes = classes|merge([options.lastClass]) %}
    {%- endif %}

{# building the class of the children #}
    {%- set childrenClasses = item.childrenAttribute('class') is not empty ? [item.childrenAttribute('class')] : [] %}
    {%- set childrenClasses = childrenClasses|merge(['menu_level_' ~ item.level]) %}

{# adding classes for dropdown #}
    {%- if is_dropdown %}
        {%- set classes = classes|merge(['dropdown']) %}
        {%- set childrenClasses = childrenClasses|merge(['dropdown-menu']) %}
    {%- endif %}

{# putting classes together #}
    {%- if classes is not empty %}
        {%- set attributes = attributes|merge({'class': classes|join(' ')}) %}
    {%- endif %}
    {%- set listAttributes = item.childrenAttributes|merge({'class': childrenClasses|join(' ') }) %}

{# displaying the item #}
    <li{{ macros.attributes(attributes) }}>
        {%- if is_dropdown %}
            {{ block('dropdownElement') }}
        {%- elseif item.uri is not empty and (not item.current or options.currentAsLink) %}
            {{ block('linkElement') }}
        {%- else %}
            {{ block('spanElement') }}
        {%- endif %}
{# render the list of children#}
        {{ block('list') }}
    </li>


    {%- if divider_append %}
        {{ block('dividerElement') }}
    {%- endif %}
{% endif %}
{% endblock %}

{% block dividerElement %}
{% if item.level == 1 %}

<li class="divider-vertical"></li>

{% else %}

<li class="divider"></li>

{% endif %}
{% endblock %}

{% block linkElement %}
	<a href="{{ item.uri }}"{{ macros.attributes(item.linkAttributes) }}>
		{% if item.attribute('icon') is not empty  %}
    		<i class="{{ item.attribute('icon') }}"></i> 
    	{% endif %}
		{{ block('label') }}
	</a>
{% endblock %}

{% block spanElement %}
	<span>{{ macros.attributes(item.labelAttributes) }}>
		{% if item.attribute('icon') is not empty  %}
    		<i class="{{ item.attribute('icon') }}"></i> 
    	{% endif %}
		{{ block('label') }}
	</span>
{% endblock %}

{% block dropdownElement %}
    {%- set classes = item.linkAttribute('class') is not empty ? [item.linkAttribute('class')] : [] %}
    {%- set classes = classes|merge(['dropdown-toggle']) %}
    {%- set attributes = item.linkAttributes %}
    {%- set attributes = attributes|merge({'class': classes|join(' ')}) %}
    {%- set attributes = attributes|merge({'data-toggle': 'dropdown'}) %}
    <a href="#"{{ macros.attributes(attributes) }}>
    	{% if item.attribute('icon') is not empty  %}
    		<i class="{{ item.attribute('icon') }}"></i> 
    	{% endif %}
    	{{ block('label') }} 
    	<b class="caret"></b>
    </a>
{% endblock %}

{%- block label %}
{{ item.label|trans(
    item.getExtra('translation_params', {}),
    item.getExtra('translation_domain', 'messages')
) }}
{%- endblock %}

Je n'arrive pas encore à trouver d'issue afin d'utiliser ce template ! Pourtant en vérifiant la documentation de Twig en version 2-x, l'import me semble correct au début du fichier mais il y a toujours un soucis vis-à-vis des attributs présents dans le fichier importé. 

  • Partager sur Facebook
  • Partager sur Twitter
25 mars 2019 à 18:22:29

Essaye dans un premier temps de mettre ton menu directement sur la page principale ( index.html.twig je suppose ) pour être sûr que ton menu fonctionne correctement .

Si tout va bien , commence à exporter ton code puis inclure ton menu par des petits bouts de code pour trouver où ça coince exactement . 

au niveau de 

{% import "knp_menu.html.twig" as macros %}

Je pense que ça sera plutôt as utils et non pas as macros donc essaye plutôt : 

% import "knp_menu.html.twig" as utils %}
  • Partager sur Facebook
  • Partager sur Twitter

MEZIANI Mohamed Nacim

Mentor OC

25 mars 2019 à 19:17:14

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL