- Recupérer contenu d'une variable sans avoir à appeller un fichier

Une question complexe

a marqué ce sujet comme résolu.

Bonsoir,

Actuellement, j'essaie de re-développer un site pour un projet que j'avais mis en suspend il y a 2 ans et voulant tout reprendre de zéro afin de coller plus facilement avec des outils récents…

Je retravaille donc la gestion de mon menu via le SQL ce qui me permet d'avoir "qu'un seul" menu mais plusieurs affichages différents (basé sur le système de forums visible ou non selon le groupe dans lequel on se trouve).

Sur l'ancienne version qui utilisais le moteur de template phpBB (que je trouves maintenant obsolète vu qu'il date de 2004) j'avais ce code :

 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
    $request_menu   =   $sql->query("SELECT *,
                                    " . CATEGORY_TABLE . ".rank,
                                    " . MENU_ITEMS_TABLE . ".id AS items_id
                                    FROM " . CATEGORY_TABLE . "
                                    LEFT JOIN " . MENU_ITEMS_TABLE . "
                                    ON " . CATEGORY_TABLE . ".rank = " . MENU_ITEMS_TABLE . ".category_id
                                    WHERE " . MENU_ITEMS_TABLE . ".category_id = " . CATEGORY_TABLE . ".rank
                                    ORDER BY " . CATEGORY_TABLE . ".rank, " . MENU_ITEMS_TABLE . ".rank, " . MENU_ITEMS_TABLE . ".menu")
                        or die ($sql->error());

    $array_menu     =   array();
    $array_perm     =   array();

    $request_permissions    =   $sql->query("SELECT id_menu
                                            FROM    " . PERMISSIONS_TABLE . "
                                            WHERE   `id_group`  =   '" . $access . "'
                                            AND     `auth`      =   '1'")
                                or die ($sql->error());
    while($data_permissions = $request_permissions->fetch_assoc())
        {
            $array_perm[] = $data_permissions['id_menu'];
        }

    while($data_menu = $request_menu->fetch_assoc())
        {
            if(in_array($data_menu['items_id'], $array_perm))
                {
                    if(!in_array($data_menu['rank'], $array_menu)) // Si la categorie n'a pas deja été affichée:
                        {
                            $template->assign_block_vars('category', array(
                                'ID'            =>            $data_menu['rank'],
                                'CATEGORY_NAME' =>            stripslashes($data_menu['category']),
                            ));
                            $array_menu[] = $data_menu['rank'];
                        }
                        $template->assign_block_vars('category.item', array(
                            'ITEM_NAME'             =>            stripslashes($data_menu['menu']),
                            'ITEM_URL'              =>            $data_menu['url'],
                        ));
                }
        }

Ceci envoyait les données sur le fichier template HTML

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<div id="content">
    <div id="body_menu">
        <!-- BEGIN category -->
        <div class="category_group">
            <div class="category_title">
                {category.CATEGORY_NAME}
            </div>
            <!-- BEGIN item -->
            <div class="menu">
                &lambda;&nbsp;&nbsp;<a href="{category.item.ITEM_URL}">{category.item.ITEM_NAME}</a>
            </div>
            <!-- END item -->
        </div>
        <!-- END category -->   
    </div>
    <div id="body_page">

Le tout étant appelé dans monFichier.php via un pparse.

Maintenant, j'ai réécrit en partie de façon a me servir du moteur Twig (que je trouves vraiment bien pratique) mais, le soucis, c'est que je cherche a effectuer la même opération ou une similaire mais après deux jours de recherche à ce sujet, je sèche complétement.

Je fournis les fichiers ci-après.

Actuellement, le fichier index.php accueille quasiment tout en ce qui concerne les includes, ect… mais cela est de façon temporaire.

index.php :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

    include "lib/Twig/Autoloader.php";
    include "config/database/mysql.php";
    include "config/sqlTable.php";

    Twig_Autoloader::register();

    $loader = new Twig_Loader_Filesystem('view');
    $twig   = new Twig_Environment(
        $loader,
        array(
            'cache' =>  FALSE,
        ));
    include "config/menu.php";
    $query  = $sql->query('SELECT *
                   FROM   portfolio_news');

    echo $twig->render('index.html.twig', array(
        'news'  => $query,
    ));

config/menu.php

 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
27
28
29
30
31
32
33
34
35
36
37
<?php
    # FOR TEST
    $userGroupID    = 0;

    $request_menu   = $sql->query("SELECT   *,
                                            " . MENU_CATEGORY_TABLE . ".position AS category_position,
                                            " . MENU_ITEMS_TABLE . ".position AS items_position,
                                            " . MENU_ITEMS_TABLE . ".id AS item_id,
                                            " . MENU_CATEGORY_TABLE . ".name AS category_name
                                     FROM   " . MENU_CATEGORY_TABLE . "," . MENU_ITEMS_TABLE . "
                                     WHERE  " . MENU_ITEMS_TABLE . ".category = " . MENU_CATEGORY_TABLE . ".id
                                     ORDER BY " . MENU_CATEGORY_TABLE . ".position," . MENU_ITEMS_TABLE . ".position");

    $array_menu     = array();
    $array_perm     = array();

    $request_perm   = $sql->query("SELECT   *
                                   FROM     " . MENU_PERMISSIONS_TABLE . "
                                   WHERE    `id_group`      = '" . $userGroupID . "'
                                   AND      `permission`    = '1'");

    while ($return_perm = $request_perm->fetch(PDO::FETCH_ASSOC))
    {
        $array_perm[]   = $return_perm['id_item'];
    }
    $request_perm->closeCursor();

    while ($return_menu = $request_menu->fetch(PDO::FETCH_ASSOC))
    {
        if (in_array($return_menu['item_id'], $array_perm))
        {
            if (!in_array($return_menu['category_position'], $array_menu))
            {
                $array_menu[]   = $return_menu['category_position'];
            }
        }
    }

view/layout/base.html.twig :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
    <head>
        <link rel="stylesheet" href="./assets/css/global.css">
        <link rel="stylesheet" href="./assets/css/bootstrap.min.css">
        {% block css %}{% endblock %}
    </head>

    <body>
        <div class="container">
            <br />
            {% include 'layout/header.html.twig' %}
            <br />
            {% include 'layout/nav.html.twig' %}

            {% block body %}{% endblock %}
        </div>
    </body>
</html>

view/layout/nav.html.twig :

1
2
3
4
<div class="row">
    <nav class="col-md-2">
    </nav>
</div>

J'espère que ma demande est assez claire.

D'avance, merci pour vos réponses.

Ça serait bien de préciser ce que tu as, et ce que tu voudrais avoir.

Je n'ai pas compris ta phrase :

Maintenant, j'ai réécrit en partie de façon a me servir du moteur Twig […] mais, le soucis, c'est que je cherche a effectuer la même opération ou une similaire…

selmac

Tu cherches à faire quoi ? A afficher la vue en utilisant twig ?

En fait, mon système me permet de gérer tout mon menu via le SQL.

Ce que je cherchais à faire était de récupérer les infos fournies par PHP et les afficher dans Twig mais sans devoir faire appel au fichier vu qu'il est déjà inclus dans base.html.twig.

Mais on m'a conseillé hier soir d’écrire mon propre système de template ainsi que d'utiliser le JSON pour cette fonction.

Je n'ai toujours pas compris le problème, je vais essayer une réponse d'après ce que j'ai compris.

Twig est le moteur qui gère les vues, il est appelé avec la ligne de code ci-dessous (en PHP). En premier paramètre le nom de la vue, en deuxième paramètre l'array qui contient toutes les variables que tu souhaites afficher.

1
2
<?php
    $twig->render('index.html.twig', array('name' => 'A-312'));

Salut !

Je souhaiterais voir ton template index.html.twig, celui que tu rends aux lignes 19 à 21 du code d'index.php que tu nous as fourni.

Je note au passage que tu passes directement l'objet PDOStatement à ce template, je te conseillerais de passer en paramètre le résultat de $query->fetchAll() plutôt. Il vaut mieux donner à la vue les informations directement utilisables que pas encore transformées, à mon avis, d'autant que ça te permettra de mieux gérer les éventuelles erreurs et d'utiliser directement le {% for new in news %}

Si jamais, la coloration syntaxique pour Twig et du HTML, ça se passe comme ça :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
```html+django
<!DOCTYPE html>
<html>
    <head>
        <link rel="stylesheet" href="./assets/css/global.css">
        <link rel="stylesheet" href="./assets/css/bootstrap.min.css">
        {% block css %}{% endblock %}
    </head>

    <body>
        <div class="container">
            <br />
            {% include 'layout/header.html.twig' %}
            <br />
            {% include 'layout/nav.html.twig' %}

            {% block body %}{% endblock %}
        </div>
    </body>
</html>
```
Code:view/layout/base.html.twig

Avec le résultat suivant :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
  <head>
      <link rel="stylesheet" href="./assets/css/global.css">
      <link rel="stylesheet" href="./assets/css/bootstrap.min.css">
      {% block css %}{% endblock %}
  </head>

  <body>
      <div class="container">
          <br />
          {% include 'layout/header.html.twig' %}
          <br />
          {% include 'layout/nav.html.twig' %}

          {% block body %}{% endblock %}
      </div>
  </body>
</html>

view/layout/base.html.twig

+0 -0

Voici l'index.html.twig. Cela fonctionne parfaitement.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{% extends "layout/base.html.twig" %}

{% block body %}
    <div class="row">
    {% for info in news %}
        {{ info.date|date("d M Y") }}
        <br />
        {{ info.content }}
    {% endfor %}
    </div>
{% endblock %}

En fait, j'ai tout à fait compris comment on affiche le contenue dans la vue.

En fait, ma requete est tout autre mais pas vraiment facile à expliquer.

J'ai mon site et sur ce site des membres et par exemple, les membres pourront avoir un grade : - Utilisateur - Modérateur - Administrateur - Chuck Norris

Et selon le grade, le menu affichera des catégories/menus visible ou non aux droits donnés (Un peu comme le système des forums).

Par exemple le modérateur pourra voir dans le menu le lien pour accéder a son panel Modérateur mais l'utilisateur lui ne verra pas ses options.

Le tout étant stocké dans une base SQL et tout le tralalala

Ce qui correspond à ce code :

 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
27
28
29
30
31
32
33
34
35
36
37
<?php
    # FOR TEST
    $userGroupID    = 0;

    $request_menu   = $sql->query("SELECT   *,
                                            " . MENU_CATEGORY_TABLE . ".position AS category_position,
                                            " . MENU_ITEMS_TABLE . ".position AS items_position,
                                            " . MENU_ITEMS_TABLE . ".id AS item_id,
                                            " . MENU_CATEGORY_TABLE . ".name AS category_name
                                     FROM   " . MENU_CATEGORY_TABLE . "," . MENU_ITEMS_TABLE . "
                                     WHERE  " . MENU_ITEMS_TABLE . ".category = " . MENU_CATEGORY_TABLE . ".id
                                     ORDER BY " . MENU_CATEGORY_TABLE . ".position," . MENU_ITEMS_TABLE . ".position");

    $array_menu     = array();
    $array_perm     = array();

    $request_perm   = $sql->query("SELECT   *
                                   FROM     " . MENU_PERMISSIONS_TABLE . "
                                   WHERE    `id_group`      = '" . $userGroupID . "'
                                   AND      `permission`    = '1'");

    while ($return_perm = $request_perm->fetch(PDO::FETCH_ASSOC))
    {
        $array_perm[]   = $return_perm['id_item'];
    }
    $request_perm->closeCursor();

    while ($return_menu = $request_menu->fetch(PDO::FETCH_ASSOC))
    {
        if (in_array($return_menu['item_id'], $array_perm))
        {
            if (!in_array($return_menu['category_position'], $array_menu))
            {
                $array_menu[]   = $return_menu['category_position'];
            }
        }
    }

Mais, étant quelqu'un de totalement fou, je souhaiterai que les résultats fournis dans ce code soient envoyés sur la portion de code qui est évidemment appelé partout (dans nav.html.twig) qui, fait parti de la structure globale du site.

Donc, j'avoue que ma question sur le premier message n’était pas vraiment clair (et je me demande si, selon mes explications c'est pas pire).

Ah, donc tu souhaites avoir un template enfant avec sa propre logique de fonctionnemment…

Dans ce cas, je pense qu'il faudrait trouver une manière d'appeler le code que tu cites, et faire en sorte que ce code rende ton template nav.html.twig. Avec Symfony, il y a la fonction {{ render(…) }} qui répondrait à ton besoin, mais justement, c'est Symfony qui ajoute cette méthode à Twig. Peut-être que tu pourrais t'inspirer de son code pour l'intégrer dans ton site ?

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte