Bonjour,

J'ai récemment décidé de refaire un de mes exercices de cours car tous les fichiers étaient à la racine donc j'ai modifié la structure. Mais j'ai 2 problèmes qui persitent :

•Layout.phtml ne veut pas récupérer mes fichiers CSS alors qu'il s'agit du même chemin que sur l'exercice de base, même si la structure des dossiers a été modifiée cela reste le même chemin que l'exercice de base.

•Mon second problème concerne le chemin de l'URL : quand je clique et que j'arrivre sur une autre page type page admin, utilisateur ou autre, puis que je clique sur le menu géré par le Layout, l'URL ajoute le chemin de base de la page, comme par exemple :
localhost/blog/application/php/show_post.php?id=2 et ensuite cela passe à localhost/blog/application/blog/application/php/admin.php lorsque je clique sur le bouton admin . Le problème vient forcément de mon include et/ou mon template.

Voilà le include et le template dans mon index.php : $template = 'application/views/index';
include = 'application/views/layout.phtml';
Voilà le include et le template dans mon admin.php : $template = '../views/admin/admin';
include = '../views/layout.phtml';

Merci d'avance pour vos réponses.

16 réponses


Kaimite
Réponse acceptée

Font awesome charge une police pour les icones.
Avoir si elle est sur ton serveur et que le chemin est ok.

Tu peux essayer de passer par un CDN pour voir si ça fonctionne mieux.

https://www.bootstrapcdn.com/fontawesome/

<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous">

Kaimite

Layout.phtml est la page qui gère mon contenu php. Je vous mets une partie de mon code si cela peut aider à mieux comprendre mon problème.

layout.phtml :

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="utf-8">
    <title>Encore un Blog ?! #nonMaisAllo</title>

    <!-- Feuilles de style externes -->
    <link rel="stylesheet" href="css/normalize-3.0.3.min.css">
    <link rel="stylesheet" href="css/font-awesome.min.css">
    <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Open+Sans">

    <!-- Feuilles de style de l'application -->
    <link rel="stylesheet" href="css/blog-main.css">
    <link rel="stylesheet" href="css/blog-theme.css">
    <link rel="stylesheet" href="css/ui-button.css">
    <link rel="stylesheet" href="css/ui-form.css">
</head>
<body>
    <!-- En-tête commune de l'application -->
    <header class="blog-header">
        <h1><a href="../blog_modif/index.php"><i class="fa fa-microphone"></i> Encore un Blog ?! #nonMaisAllo</a></h1>
        <nav>
            <a href="../blog_modif/application/php/admin.php"><i class="fa fa-cogs"></i> Administration</a>
        </nav>
    </header>

    <main>
        <!-- Chargement du template PHTML spécifié par le programme PHP -->
        <?php include $template.'.phtml' ?>
    </main>

    <!-- Pied de page commun de l'application -->
    <footer class="blog-footer">
        <small>Le blog des élèves de la 3W Academy</small>
    </footer>
</body>
</html>

index.php :

<?php

    include 'application/config/database.php';

    // Récupération de tous les articles du blog classés par ordre antéchronologique.
    $query =
    '
        SELECT
            Post.Id,
            Title,
            Contents,
            CreationTimestamp,
            FirstName,
            LastName
        FROM
            Post
        INNER JOIN
            Author
        ON
            Post.Author_Id = Author.Id
        ORDER BY
            CreationTimestamp DESC
    ';
    $resultSet = $pdo->query($query);
    $posts = $resultSet->fetchAll();

    // Sélection et affichage du template PHTML.
    $template = 'application/views/index';
    include 'application/views/layout.phtml';

index.phtml :

<!-- Page d'accueil -->
<h2><i class="fa fa-home"></i> Accueil</h2>

<!-- Liste des articles du blog -->
<ul class="post-list">
    <?php foreach($posts as $post): ?>
        <li class="post">
            <h3>
                <i class="fa fa-hand-o-right"></i>&nbsp;
                <!-- Lien vers article de blog détaillé avec les commentaires -->
                <a href="../blog_modif/application/php/show_post.php?id=<?= intval($post['Id']) ?>" title="Consulter l'article">
                    <?= htmlspecialchars($post['Title']) ?>
                </a>
            </h3>
            <!-- Seul un extrait de l'article du blog est affiché -->
            <article><?= substr(htmlspecialchars($post['Contents']), 0, 100) ?>&nbsp;[...]</article>
            <small>
                Rédigé par <?= htmlspecialchars($post['FirstName']) ?> <?= htmlspecialchars($post['LastName']) ?>
                le <?= htmlspecialchars($post['CreationTimestamp']) ?>
            </small>
        </li>
    <?php endforeach; ?>
</ul>

admin.php :

<?php

    include '../config/database.php';

    // Récupération de tous les articles du blog classés par ordre antéchronologique.
    $query =
    '
        SELECT
            Post.Id,
            Title,
            Contents,
            CreationTimestamp,
            FirstName,
            LastName,
            Category.Name AS Category_Name
        FROM
            Post
        INNER JOIN
            Author
        ON
            Post.Author_Id = Author.Id
        INNER JOIN
            Category
        ON
            Post.Category_Id = Category.Id
        ORDER BY
            CreationTimestamp DESC
    ';
    $resultSet = $pdo->query($query);
    $posts = $resultSet->fetchAll();

    // Sélection et affichage du template PHTML.
    $template = '../views/admin/admin';
    include '../views/layout.phtml';

admin.phtml :

<h2><i class="fa fa-cogs"></i> Panneau d'administration</h2>

<nav>
    <a href="../php/add_post.php">Rédiger un nouvel article</a>
</nav>

<table>
    <caption>Liste des articles</caption>
    <thead>
        <tr>
            <th>Titre</th>
            <th>Article</th>
            <th>Auteur</th>
            <th>Catégorie</th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        <?php foreach($posts as $post): ?>
            <tr>
                <td><a href="../php/show_post.php?id=<?= intval($post['Id']) ?>" target="_blank"><?= htmlspecialchars($post['Title']) ?></a></td>
                <td><?= substr(htmlspecialchars($post['Contents']), 0, 200) ?></td>
                <td><?= htmlspecialchars($post['FirstName']) ?> <?= htmlspecialchars($post['LastName']) ?></td>
                <td><?= htmlspecialchars($post['Category_Name']) ?></td>
                <td>
                    <a class="edit" href="../php/edit_post.php?id=<?= intval($post['Id']) ?>"><i class="fa fa-pencil"></i></a>
                    <a class="remove" href="../php/delete_post.php?id=<?= intval($post['Id']) ?>"><i class="fa fa-remove"></i></a>
                </td>
            </tr>
        <?php endforeach ?>
    </tbody>
</table>

Bonsoir.
Si tu commençais par nous montrer un peu l'architecture de tes dossiers/fichiers, ça nous aiderais à pouvoir te répondre et aussi où pointe le serveur.
Car tu nous montre le contenu de tes fichiers, mais ça ne nous permet de comprendre où se trouvent exactements le fichiers que tu cherches à inclure, ni où se situent ceux qui incluent d'autres fichiers.

Je suis désolé, je voulais mettre une capture d'écran à la base pour qu'on voit le chemin mais c'est la première fois que je viens sur le forum et je ne comprend pas trop le fontionnement.

blog_modif (site): - index.php

                    - application (dossier) :  - config (dossier) :  - database.php

                                               - fonts (dossier) : - fontawesome-webfont.eot
                                                               - fontawesome-webfont.svg
                                                               - fontawesome-webfont.ttf
                                                               - fontawesome-webfont.woff
                                                               - fontawesome-webfont.woff2
                                                               - FontAwesome.otf

                                               - php (dossier) : - add_comment.php
                                                                           - add_post.php
                                                                           - admin.php
                                                                           - delete_post.php
                                                                           - edit_post.php
                                                                           - show_post.php

                                              - views (dossier) : - index.phtml
                                                                  - layout.phtml

                                                                  - add_post (dossier) : - add_post.phtml

                                                                  - admin (dossier) : - admin.phtml

                                                                  - css (dossier) : - blog-main.css
                                                                                    - blog-theme.css
                                                                                    - font-awesome.min.css
                                                                                    - normalize-3.0.3.min.css
                                                                                    - ui-button.css
                                                                                    - ui-form.css

                                                                  -  edit_post (dossier) : - edit_post.phtml

                                                                  - images(dossier) : - theme (dossier) : - paper.png

                                                                  - show_post(dossier) : - show_post.phtml

Le site a décalé mon texte pour le contenu de mes dossiers "fonts" et "php" mais normalement tout est aligné.

deux chose que je comprend pas:

pourquoi:
../php/add_post.php

et non pas:
/php/add_post.php

pourquoi tu utilise deux extensions différentes?

.phtml
.php

a savoir que phtml n'est pas reconnu par tous les serveurs

J'utlise "../php/add_post.php" au lieu de "/php/add_post.php" car si j'utilise le deuxième choix il y a un problème de chemin et ça bug. J'obtiens par exemple "localhost/blog_modif/application/php/add_post.php" avec mon "../php/add_post.php" et sinon "localhost/php/add_post.php" avec "/php/add_post.php".

Pour le deuxième point, il s'agit d'un exercice de cours que je modifie donc je n'y peux rien, c'est l'exercice qui est comme ça de base et en plus, je n'ai pas vu d'autres manières que celle-ci.

je te demandais car
.phtml est la même chose que .php

à la conditions que le serveur soit configuré de sorte que php execute les fichier *.phtml sinon le code seras simplement affiché et non exécuté tout depend de la configuration d'apache et des virtualhost.
En hébergement mutualisé ce n'est pas toujours le cas

pour tes liens tu doit donc faire:
/blog_modif/application/php/add_post.php

par contre pour ton souci d'include essaie voir de faire dans ce genre:
include "".$_SERVER['DOCUMENT_ROOT']."/include/mysql_connect.php";

la tu arrive à la racine du serveur->include->ton_fichier

c'est ce que j'utilise

Salut,

Juste pour infos j'utilise également des extensions en .phtml pour mes fichiers de vues. ça me permet différencier l'utlisation du fichier.

Comme j'utilise également des fichiers en *.conf.php mais c'est très personnel ja vous l'accorde.

Pour les histoires de chemins j'ai pris l'habitude de me créer un fichier de configuration avec différentes constantes qui définissent les chemins depuis la racine du site / serveur.

J'ai deux "types" de constantes :

define("CSS_DIR", "/home/site/application/views/css"); // pour PHP (include, file_exists, autre)
define("CSS_SRC", "/application/views/css"); // pour le HTML

Par convention je ne mais jamais le "/" à la fin dans les définitions.

Comme ça pas besoin de me prendre la tête à réfléchir s'il faut remoter de 3 crans l'arbo par rapport à mon script.

Imagineons le fichier paths.php dans application/config/paths.php

Dans le fichier index.php :

<?php
include( __DIR__ . "/application/config/paths.php" );

et dans le paths.php

define("HOME_DIR", str_replace('/application/config', '', str_replace('\\', '/', __DIR__) ));
define("HOME_SRC", "");

define ("APP_DIR", HOME_DIR . "/application");
define ("APP_SRC", HOME_SRC . "/application");

define ("CONFIG_DIR", APP_DIR . "/config");

Et maintenant tu peux définir les chemins de ton architecture selon tes besoins :

define("PHP_DIR", APP_DIR . "/php");
define("PHP_SRC", APP_SRC . "/php");

define("VIEWS_DIR", APP_DIR . "/views");
define("VIEWS_SRC", APP_SRC . "/views");

define("CSS_DIR", VIEWS_DIR . "/css");
define("CSS_SRC", VIEWS_SRC . "/css");

define("IMAGES_DIR", VIEWS_DIR . "/images/theme");
define("IMAGES_SRC", VIEWS_SRC . "/images/theme");
...
...
...

Je ne définie pas tous les dossiers / sous-dossiers mais les principaux que je vais utiliser.

Donc maintenant dans mon code je fait soit :

<?php

include CONFIG_DIR . '/database.php';

include VIEWS_DIR . '/layout.phtml';

et

<?php foreach($posts as $post): ?>
            <tr>
                <td><a href="<?= PHP_SRC ?>/show_post.php?id=<?= intval($post['Id']) ?>" target="_blank"><?= htmlspecialchars($post['Title']) ?></a></td>
                <td><?= substr(htmlspecialchars($post['Contents']), 0, 200) ?></td>
                <td><?= htmlspecialchars($post['FirstName']) ?> <?= htmlspecialchars($post['LastName']) ?></td>
                <td><?= htmlspecialchars($post['Category_Name']) ?></td>
                <td>
                    <a class="edit" href="<?= PHP_SRC ?>/edit_post.php?id=<?= intval($post['Id']) ?>"><i class="fa fa-pencil"></i></a>
                    <a class="remove" href="<?= PHP_SRC ?>/delete_post.php?id=<?= intval($post['Id']) ?>"><i class="fa fa-remove"></i></a>
                </td>
            </tr>
        <?php endforeach ?>

Voilà,
C'est une habitude que j'ai pris et qui évite pas mal de soucis d'inclusions php.

J'espère que ça va t'aider.

Kaimite

@Kaimite: Pourrais-tu éviter de donner des conseils inutiles s'il te plaît ?
Car le plus flagrant dans le code que tu montres, c'est la ligne suivante :

define("HOME_SRC", "");

Pourrais-tu nous expliquer quelle est la moindre utilité de définir comme valeur une chaîne vide à une constante ?
Car en l'étant, utiliser la constante ou non ne fait absolument aucune différence.
Pour imager la chose, c'est un peu comme dire :

Je voulais te dire quelque chose, mais ce n'est pas la peine.

Ou alors ça peut vouloir dire que c'est une constante qui peut prendre une valeur diférente mais que dans ce cas là sa valeur est juste vide.

Si le DocumentRoot de ton site est le même que le dossier HOME_DIR alors, effectivement elle ne sert pas.

Mais si tu as un site http://www.example.com et que tu développes une sous partie du site dans, par exemple http://www.example.com/espace-membre

Pour une raison ou une autre tu ne peux pas ou ne veux pas faire de sous domaine. Pour reprende l'arborescence l'exemple de Valentin on a donc :

blog_modif/espace-membre
blog_modif/espace-membre/application
blog_modif/espace-membre/application/php
blog_modif/espace-membre/application/php/views
...
...
...

Tes liens ne sont plus des liens du style

<a href="/application/php/post.php">les posts</a>

mais

<a href="/espace-membre/application/php/post.php">les posts</a>

Donc dans ce cas là tu fais ça

define("HOME_SRC","/espace-membre");

et tous les liens vers tes images, tes css, tes pages, etc. sont valides et pas besoin de rechercher partout dans ton code pour les corriger.

C'est un peu le même principe que les variables par défaut dans les fonctions :

function maFonction ($maVar, $varDefaut = false) {
}

Si je reprends ta façon de voir je pourais te dire que c'est inutile de faire çà car ca va pas te servir dans xx% des cas... c'est une façon de voir !

Voilà, j'espère que ca t'a un peu eclairé.

Kaimite

Je viens de tester ta méthode Kaimite. Je constate que mon problème de chemin dans mon URL est plus lier à mes fichiers ".phtml" dans le dossier "views" qu'au contenu des fichiers de mon dossier "php" ou que de mon "index.php".

J'ai fait "paths.php" dans "config" comme tu me l'as conseillé. Le système <?= PHP_SRC ?> n'a pas l'air de fonctionner dans mes pages ".phtml", sauf "index" qui récupère bien les bonnes URL (comme avant) mais cette fois c'est lui qui a le contenu css qui s'affiche et pas les autres pages.

Quand je passe d'index à une autre page en cliquant sur les liens, les nouvelles pages, elles ne peuvent pas accèder à leurs liens. J'obtiens par exemple "http://localhost/blog_modif/application/php/%3Cbr%20/%3E%3Cb%3ENotice%3C/b%3E:%20%20Use%20of%20undefined%20constant%20PHP_SRC%20-%20assumed%20'PHP_SRC'%20in%20%3Cb%3E/Applications/XAMPP/xamppfiles/htdocs/blog_modif/application/views/layout.phtml%3C/b%3E%20on%20line%20%3Cb%3E27%3C/b%3E%3Cbr%20/%3EPHP_SRC/admin.php" si je clique sur le lien admin dans l'une de mes pages show_post.

Salut,

Si tu regarde bien le lien il y a un message d'erreur de PHP :

"http://localhost/blog_modif/application/php/<br /><b>Notice</b>:  Use of undefined constant PHP_SRC - assumed 'PHP_SRC' in <b>/Applications/XAMPP/xamppfiles/htdocs/blog_modif/application/views/layout.phtml</b> on line <b>27</b><br />PHP_SRC/admin.php" si je clique sur le lien admin dans l'une de mes pages show_post.

Ta constante PHP_SRC n'est pas définie, donc soit le fichier paths.php n'est pas inclus correctement soit il y a une erreur de frappe ou autre.

Le fichier path doit être inclus dans tous les fichiers donc si tu fait un lien vers un fichier application/post/show_post.php
dans ce fichier tu devrais inclure également

Si tu as l'arborescence suivante :
/application/config/paths.php
/application/php/show_post.php

<?php

include (__DIR__ . '/../config/paths.php');

__DIR__ est une constante qui te donne le chemin complet du fichier

Kaimite

Merci beaucoup Kaimite, tout le système des pages marche niquel maintenant.

Le CSS marche partout, juste un dernier petit souci, les balises i comme

<i class="fa fa-microphone"></i>

n'affichent pas le signe qui correspond mais un carré vide.

J'ai vérifié et le problème vient de ce lien :

<link rel="stylesheet" href="<?= CSS_SRC ?>/font-awesome.min.css">

Merci encore pour ton aide qui m'a été précieuse.

J'ai testé le lien que tu m'as donné, les îcones s'affichent maintenant.

Merci pour tout !

De rien :)