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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du 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
    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 : 1030
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 Expert
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    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
    Membre du 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
    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 Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    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
    Membre du 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
    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
    Membre Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    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.

  7. #7
    Membre du 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
    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.

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

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

  9. #9
    Membre du 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
    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.

  10. #10
    Membre du 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
    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 ?

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, 15h37
  2. Petit problème de conception sur access
    Par coooookinette dans le forum Modélisation
    Réponses: 3
    Dernier message: 18/12/2005, 18h24
  3. Gestion des départements problème de conception
    Par snoopy69 dans le forum Modélisation
    Réponses: 7
    Dernier message: 11/10/2005, 13h08
  4. Réponses: 3
    Dernier message: 12/05/2005, 18h26
  5. Problème de conceptions de tables
    Par dtavan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/05/2004, 23h13

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