IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Problème de conception blocks twig (Fonctions render(controller) / fonction parent() / blocks)


Sujet :

Symfony PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 2
    Points
    2
    Par défaut Problème de conception blocks twig (Fonctions render(controller) / fonction parent() / blocks)
    Bonjour,

    Je poste aujourd'hui car je me trompe sur le mécanisme de render, de blocks et de la fonction parent() de twig.

    Pour vous expliquer ce que je veux faire, je vous ais fait 1 schéma et 1 speudo-code.

    Le code qui pose problème est dans le fichier block2.html.twig. Je ne comprend comment le construire. Je pense que le reste est bon.

    layout.html.twig
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <head>
        {% block css %}
             ...
         {% endblock %}
     
         ...
     
    </head>
     
    <body>
     
         ...
     
         {% block site_body %}{% endblock %}
     
         ...
     
         {% block javascripts %}
                 <script>
                       ...
                 </script>
                 ...
         {% endblock %}
     
    </body>
    adaptiveView.html.twig
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    {% extends '::base.html.twig' %}
     
         {# On remplit le block site_body #}
         {% block site_body %}
     
              {# la function fonctionBlock1Action dans le controller Machin va render block1.html.twig #}
              {{ render(controller('AcmeTrucBundle:Machin:fonctionBlock1')) }}
     
              {# la function fonctionBlock2Action dans le controller Machin va render block2.html.twig #}
              {{ render(controller('AcmeTrucBundle:Machin:fonctionBlock2')) }}
     
              {# la function fonctionBlock1Action dans le controller Machin va render block3.html.twig #}
              {{ render(controller('AcmeTrucBundle:Machin:fonctionBlock3')) }}
     
         {% endblock %}
    block2.html.twig
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    {% extends '::base.html.twig' %}
     
         {% block javascripts %}
              {{ parent() }}
     
              {# javascripts essentielle au fonctionnement de block2 #}
                   ...
          {% endblock %}
     
          {# code du block2 #}
          {% block site_body %}
                {{ parent() }}
          {% endblock %}
    Nom : schema1.jpg
Affichages : 951
Taille : 66,4 Ko

    Voici donc mes questions :

    _ Comment construire le code du block2 ?
    _ Il faut utiliser le la fonction parent() ? Je qu'il ne faut pas que je ré-appelle le bock site_body mais si je ne le fait pas j'ai une erreur à l'exécution car j'ai du code tout seul dans aucun block alors que je fais un extends d'un layout. Et pourtant je dois bien inclure l'ajout de code javascript ...

    Suis-je clair ?


    Merci d'avance,

    Olivier

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <head>
        {% block css %}
         {% endblock %}
    </head>
    <body>
         {% block site_body%}       
         {% endblock %}
         {% block javascripts %}
         {% endblock %}
    </body>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    {% extends '::base.html.twig' %}
     
         {# On remplit le block site_body #}
         {% block site_body %}
     
              {# la function fonctionBlock1Action dans le controller Machin va render block1.html.twig #}
              {{ render(controller('AcmeTrucBundle:Machin:fonctionBlock1')) }}
     
              {# la function fonctionBlock2Action dans le controller Machin va render block2.html.twig #}
              {{ render(controller('AcmeTrucBundle:Machin:fonctionBlock2')) }}
     
              {# la function fonctionBlock1Action dans le controller Machin va render block3.html.twig #}
              {{ render(controller('AcmeTrucBundle:Machin:fonctionBlock3')) }}
     
         {% endblock %}
    
    {% block javascripts %}
          {{ parent() }}
     {% endblock %}
    je ne suis plus sur si le bloc javascripts est obligatoire ou non, essaye et fait moi un retour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {% extends '::adaptive_view.html.twig' %}
     
         {% block javascripts %}
              {{ parent() }}
          {% endblock %}
     
          {# code du block2 #}
          {% block site_body %}
                {{ parent() }}
          {% endblock %}
    Ici il suffisait d'étendre le layout perso que tu as fait.

    En gros tu ne peux pas faire d'héritage "horizontal" : donc avoir trois fichiers qui étendent le même fichier pour le même affichage.

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 2
    Points
    2
    Par défaut Merci pour la réponse.
    Merci pour la réponse.

    Je teste ca ce soir. Je fait un retour immédiatement après le test.

    Effectivement, ca me parait logique. Hâte de faire le test ^^

  4. #4
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Pour info, il vaut mieux éviter tous ces render() dans la template (à moins que tu n'aies vraiment pas le choix) : chaque render exécute une nouvelle requête HTTP ce qui est assez couteux en temps et en ressource.

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 2
    Points
    2
    Par défaut Peux-tu me dire si j'ai bien tout compris ?
    Citation Envoyé par Nico_F Voir le message
    Pour info, il vaut mieux éviter tous ces render() dans la template (à moins que tu n'aies vraiment pas le choix) : chaque render exécute une nouvelle requête HTTP ce qui est assez couteux en temps et en ressource.
    Du coup, lorsque que je construis une page type page d'accueil personnalisé avec 6 blocks indépendants (avec une logique propre à chacun), il est préférable de mettre toute la logique dans 1 seul controller et de renvoyer d'un coup toutes les infos dont j'ai besoin, au lieu de faire 1 render/block ?

    L'inconvénient, c'est que je ne peux pas appeler les différents fichiers twig que j'ai besoin en fonction de la logique de mon application (ou sinon je suis obligé de mettre de la logique dans un fichier twig, ce qui est fortement déconseillé, il me semble ...).


    J'ai bien tout saisie ?

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par gototog Voir le message
    je ne suis plus sur si le bloc javascripts est obligatoire ou non, essaye et fait moi un retour
    Aucun moyen de faire marcher tout ca. J'ai une page blanche (500 (Internal Server Error));

    C'est le "{{ parent() }}" dans le block2.html.twig qui fait tout planter.

    Si je l'enlève ça marche mais ça me met 2 fois toute la page (header, footer ...).

    Je désespère un peu sur ce problème épineux qui me bloque depuis quelques jours.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Ton contrôleur fait bien un render du troisieme fichier?

  8. #8
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Citation Envoyé par shigeru94 Voir le message
    Du coup, lorsque que je construis une page type page d'accueil personnalisé avec 6 blocks indépendants (avec une logique propre à chacun), il est préférable de mettre toute la logique dans 1 seul controller et de renvoyer d'un coup toutes les infos dont j'ai besoin, au lieu de faire 1 render/block ?

    L'inconvénient, c'est que je ne peux pas appeler les différents fichiers twig que j'ai besoin en fonction de la logique de mon application (ou sinon je suis obligé de mettre de la logique dans un fichier twig, ce qui est fortement déconseillé, il me semble ...).


    J'ai bien tout saisie ?
    Oui c'est à peu près ça : c'est d'autant plus déconseillé qu'une page d'accueil est censé être la page la plus visitée donc celle ou le temps de chargement a besoin d'être optimisé.
    Il est préférable que tu récupères toutes les infos dans ton contrôleur.

    Rien ne t'empêche de garder la séparation de chacun de ces blocks dans des templates, mais il vaut mieux leur passer les données et n'avoir qu'un contrôleur plutôt que faire 5 ou 6 render controller.
    Tu peux faire des includes, auquel tu passeras les données dont chaque template a besoin.

  9. #9
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 2
    Points
    2
    Par défaut Merci Nico_F
    Merci pour le conseil. Je vais changer ca ce soir. Peut être que ca résolvera mon autre problème (L'espoir fait vivre ...).

  10. #10
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par gototog Voir le message
    Ton contrôleur fait bien un render du troisieme fichier?
    Oui, j'ai bien vérifié. La preuve étant que si je met que un titre seul, ca apparait bien.
    Je pourrais mettre tout mon code sans extends, sans blocks sauf que je peux pas ajouter mon javascript dans le bloc javascript prévu à cet effet.

    Sinon j'ai fait les situation suivante :
    1 - Je fais un extends et que j'ajoute la ligne {{ parent() }} => tout plante
    2 - Je fais un extends sans la ligne {{ parent() }} => J'ai tout qui s'affiche en double, header et footer compris


    C'est pour ca à la base je me posait la question si j'ai bien compris le fonctionnement de extends, de parent() et des blocks.

    Si vous n'avez pas d'idée, je vais dejà faire les changements proposés par Nico_F et voir si j'arrive pas à trouver la solution par ce biais.

  11. #11
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 2
    Points
    2
    Par défaut A la recherche de la solution perdue
    Je suis vraiment obligé de passer par un render(controller). J'ai essayé de faire autrement sans succès.

    Et pas moyen de résoudre le problème de base.

    Personne ?

  12. #12
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Pour quelle raison es-tu obligé de passer par un render controller ?

  13. #13
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Nico_F Voir le message
    Pour quelle raison es-tu obligé de passer par un render controller ?
    Pour faire court, sur la page, je dois afficher les informations de l'utilisateurs et les informations de la dernière équipe de l'utilisateur (formée par 2 utilisateurs).

    Donc je dois, d'une part, aller chercher les informations de l'utilisateur et en fonction de celle-ci afficher l'une des 3 vues utilisateurs et, de l'autre part, je dois chercher la dernière équipe de l'utilisateurs et afficher l'une des 5 vues différentes.

    Il me faut donc au minimum 2 controllers et 2 render.

    C'est très agréable de voir des personnes qui essaie de m'aider et d'améliorer mon niveau de connescence et de maitrise de Symfony2/Doctrine/Twig. C'est vraiment apréciable.

    Merci beaucoup.

  14. #14
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    On te crois sur parole parcontre avoir le message des erreurs twig ça nous aiderai
    Tes render controlleurs sont là pour afficher quoi?


    EDIT: Désolé j'avais commencer a répondre avant ton message ^^
    J'essaye de te faire un code de démo dans le weekend pour être sur que ca fonctionne

  15. #15
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par gototog Voir le message
    On te crois sur parole parcontre avoir le message des erreurs twig ça nous aiderai
    C'est ca le truc étonnant. Lorsque j'ajoute la ligne {{ parent() }}, ca mouline, une page blanche s'affiche. Dans la console du navigateur, j'ai un 500 Internal Server Error. Je suis bien en mode debug (j'ai les message d'erreur classique lorsque je fais des fautes de syntax dans mon controller, par exemple). Quand au logs dans logs/dev.log, je suis noyé par des centaines de lignes et je toruve pas vraiment de choses interessante.

    J'aimerais bien vous donner plus d'infos mais je vois pas vraiment comment ...

    Citation Envoyé par gototog Voir le message
    Tes render controlleurs sont là pour afficher quoi?
    Comme expliqué plus bas, mes render sont là pour récuperer les infos des 2 différents controllers et choisir les 2 vues à afficher, parmis plein de possibilités, en fonction de ces infos.

  16. #16
    Candidat au Club
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 2
    Points
    2
    Par défaut This is the end ?
    Bonjour,

    Je suis finalement tombé sur ca.

    http://stackoverflow.com/questions/1...arent-template

    Combiné à pas mal de ressources trouvé sur le web, il semble que ce que je voulais faire n'est pas possible.

    Je vais donc mettre du code simple dans mon block2.html.twig

    Et ajouter le javascript dans un block javascript, avec un parent dans le adaptiveView.hmtl.twig

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    {% extends '::base.html.twig' %}
     
         {# On remplit le block site_body #}
         {% block site_body %}
     
              {# la function fonctionBlock1Action dans le controller Machin va render block1.html.twig #}
              {{ render(controller('AcmeTrucBundle:Machin:fonctionBlock1')) }}
     
              {# la function fonctionBlock2Action dans le controller Machin va render block2.html.twig #}
              {{ render(controller('AcmeTrucBundle:Machin:fonctionBlock2')) }}
     
              {# la function fonctionBlock1Action dans le controller Machin va render block3.html.twig #}
              {{ render(controller('AcmeTrucBundle:Machin:fonctionBlock3')) }}
     
         {% endblock %}
    
    {% block javascripts %}
          {{ parent() }}
    
    {# Je met ici mon code javascript #}
    
     {% endblock %}
    Je vais avoir une tartine de code javascript non utile pour beaucoup de situation, ca va alourdir un peu les fichiers chargés. Je sais pas ce que ca donne au niveau performance.

    Je vais essayer de me repencher sur le nombre de requête HTTP car grâce à vos conseils, je vais éviter au plus le render pour accélerer le site.

    Je laisse le topic ouvert encore un peu, si vous avez des remarques.

Discussions similaires

  1. Problème conception de site (événement User Control)
    Par rad_hass dans le forum ASP.NET
    Réponses: 4
    Dernier message: 14/01/2009, 16h37
  2. Petit problème de conception sur access
    Par coooookinette dans le forum Modélisation
    Réponses: 3
    Dernier message: 18/12/2005, 19h24
  3. Gestion des départements problème de conception
    Par snoopy69 dans le forum Modélisation
    Réponses: 7
    Dernier message: 11/10/2005, 14h08
  4. Réponses: 3
    Dernier message: 12/05/2005, 19h26
  5. Problème de conceptions de tables
    Par dtavan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/05/2004, 00h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo