Salut à vous,

Voila pour me remettre à faire du php, je veux faire un projet qui demande un petit site. Je le code à la main en POO et en essayant d'utiliser une structure MVC.

Mon soucis c'est que la page s'affiche bien mais pas le css alors que le lien est bon. J'ai deja reussi à l'afficher en bidouillant la façon dont je require le layout, mais depuis que j'ai rajouté une methode sur le controller permettant d'ajouter des css directement depuis l'html, il ne se charge plus (le css).

Alors le code est surement déguelasse est désolé d'avance

Le Controlleur de l'index

class IndexController extends Controller
{
    public function __construct()
    {
        $this->render("default");
    }
}

Le Controller principal

class Controller
{
    public function render($layout)
    {
        $vars = Config::utils();
        $access = "{$vars['root']}Views/Layouts/{$layout}.php";
            //"C:/wamp64/www/Dupres/Views/Layouts/$layout.php"
        if (file_exists($access))
            return require $access;
    }

    public function css($css)
    {
        $vars = Config::utils();
        $access = "{$vars['webroot']}css/{$css}.css";
            //"C:/wamp64/www/Dupres/webroot/css/$css.css"
        if (file_exists($access))
            return "<link rel='stylesheet' type='text/css' href='{$access}'>";
        else
            return "<!-- Css : {$css} Introuvable :( -->";
    }

    public function script($script)
    {
        $vars = Config::utils();
        $access = "{$vars['webroot']}js/{$script}.js";
            //"C:/wamp64/www/Dupres/webroot/js/$script.js"
        if (file_exists($access))
            return "<script src='{$access}'></script>";
        else
            return "<!-- Js : {$script} Introuvable :( -->";
    }
}

le layout en question : default.php

<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Dupres</title>
        <?= $this->css("app") ?> <!-- href="C:/wamp64/www/Dupres/webroot/css/app.css" -->
    </head>
    <body>
        <header>
            <div class="header-title">
                <p>Dupres</p>
            </div>
            <div>
                <div>
                    <img src="#" alt="switch">
                </div>
            </div>
            <span></span>
        </header>
    </body>
</html>

Pour info car ça peut paraitre bizarre en le lisant mais la methode static de l'objet Config me renvoie un tableau de variables pour que je puisse y avoir acces partout. Ici des variables pour les chemins (il y a surement mieux mais pour le moment c'est ce que j'utilise)

Le reste du site c'est du classique je pense, rooter / dispatcher etc.
Donc voila en résumé c'est juste le css qui coince, pas d'erreur console, ni d'erreur à l'affichage.

Merci d'avance pour l'aide :)

9 réponses


Huggy
Réponse acceptée

Le plus simple c'est de se créer une constante

define ('BASE_URL', '/Dupres/');   // si wamp http://localhost/Dupres/...
et à changer suivant l'hébergement / vhost
define ('BASE_URL', '/');   // si hébergement http://Dupres.fr/...

pour générer les urls

$url = BASE_URL . 'js/' . $script_name ; 
Masso
Auteur
Réponse acceptée

J'ai reussi a afficher le css. Bizarrement un lien commancant par le dossier webroot suffisait même si je ne comprend pas comment il arrive a reperer le dossier qui devrait normalement etre à ../webroot.

Merci

Masso
Auteur

Je vais regarder ça pour les liens, mais a vu de nez j'ai remplacé mais ça ne change rien, je te redis
Voila la fonction pour que tu visualises mieux ^^ en gros je base tout sur les données de la variable _Server

public static function utils()
    {
        $vars = [
            "root" => $root = $_SERVER["DOCUMENT_ROOT"]."/",
            "webroot" => $webroot = $root."webroot/",
            "racine" => $racine = $_SERVER["REQUEST_URI"],
            "pages" => $pages = $root."Views/Pages/"
        ];
        return $vars;
    }

Bonjour,
Je ne sais pas ce qu'il y a dans $vars['ds'] mais ce ne doit surtout pas être DS de php
le Directory Separator sous Windows c'est l'anti-slash '\', dans les urls c'est le Slash'/'
le DS ne doit pas servir à contruire quoi que ce soit car le slash '/' fonctionne sur tous les systèmes;
le DS sert à parser des chemins fournis par le système , par exemple DIR ou FILE

Masso
Auteur

Merci du tuyau Huggy je retiens ça.
Mais malheureusement ce n'est pas une question de slash ou d'anti-slash.
Je viens d'effectuer les changements mais idem :/

Masso
Auteur

Ha ouai define j'avais oublier ^^.
Dans mon cas ça ne fonctionne pas, j'ai un virtualhost http://dupres
il ne comprend pas que la base du projet est le dossier Dupres, il va deux dossier parent au dessus xD
En gros tant que mon url ne precise pas /wamp64/www/... il ne comprend pas

Dans ton VirtualHost, tu devrais normalement avoir
DocumentRoot "C:/wamp64/www/Dupres"

Masso
Auteur

Oui, c'est d'ailleurs pourquoi je l'ai pris comme variable root.
J'ai define une constante dans la base de mon site (l'index.php à la racine), j'ai essayé de la remplacer par l'utilisation que je faisais de $vars['root'] mais il ne recupere plus la page.

Masso
Auteur

Merci pour votre aide mais le sujet a dérivé sur la maniere de codé et non sur le problème que je rencontre.
J'utilise maintenant les constantes (j'avais oublié ^^), mais aucun changement.
Le sujet est encore actif si vous voulez proposer des idées. Je retournerai la solution si je la trouve