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

PHP & Base de données Discussion :

Fichiers CSS et JS ignorés (chemin absolu Apache-MVC)


Sujet :

PHP & Base de données

  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 126
    Par défaut Fichiers CSS et JS ignorés (chemin absolu Apache-MVC)
    Bonjour à tous,

    Depuis que j'ai transformé mon site en utilisant le MVC et réécriture d' Url, impossible de faire fonctionner les références aux fichiers css et js vraisemblablement causé par des chemins absolus non reconnus... (je suis en localhost avec Apache)

    J'ai essayé en spécifiant une constante ROOT renvoyant le chemin absolu correct aux dits fichiers (ROOT utilise dirname(__DIR__)):

    1/ Aucune erreur n'apparaît en console concernant les fichiers css mais celui-ci n'est quand même pas pris en compte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <link rel="stylesheet" href="<?= ROOT . '/css/styles.css'; ?>" />
    2/ Des erreurs apparaissent en console avec la référence des fichiers js par exemple :

    "Échec du chargement pour l’élément <script> dont la source est « C:\CheminDossierDeMonSite\DevWeb\NomDeMonSite\js\modals.js »."

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <script type="text/javascript" src="<?= ROOT . '/js/modals.js'; ?>"></script>
    Il y a quelque chose que je n'ai pas dû saisir correctement au niveau compréhension car les chemins renvoyés par ROOT sont pourtant corrects ...

    Si j'essaie avec des chemins absolus du genre /Dossier1/Fichier1/ cela ne change rien...

    Merci d'avance pour votre aide

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    ROOT utilise dirname(__DIR__)
    C'est pas bon, ça va te donner le chemin sur le système de fichiers du serveur, pas le chemin web.

    Il faut que tu écrives des chemins en prenant en compte ta réécriture d'URL. Tu ne donnes aucune info à ce propos.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 126
    Par défaut
    Bonjour Séb, merci de ta réponse

    La réécriturte est gérée pour l'instant grâce à un fichier .htaccess (en attendant mieux):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    RewriteEngine On
    RewriteRule ^([a-zA-Z0-9-\-\_\/]*)$ index.php?p=$1
    Curieusement cette sentence est souvent tronquée dans VSCode qui m'annule les anti-slash... je ne serai pas contre une amélioration ... Cela est peut être dû à une extension foireuse...

    Voici le routeur Main.php :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    <?php
     
    namespace App\Core;
     
    use App\Controllers\MainController;
     
    /**
     * Routeur principal
     * 
     */
     
    class Main
    {
        public function start()
        {
     
            //On retire le trailing slash éventuel de l'Url
            //On récupère l'URL
            $uri = $_SERVER['REQUEST_URI'];       
     
            //On vérifie que uri n'est pas vide et qu'elle se termine par un slash
            if (!empty($uri) && $uri != '/' && $uri[-1] === "/") {
                //On retire le slash
                $uri = substr($uri, 0, -1);         
                //On envoie un code de redirection permanente
                http_response_code(301);
                //On redirige vers l'URL sans le slash
                header('Location: ' . $uri);
            }
            //On gère les paramètres d'URL
            //p=controleur/methode/paramètres
            //On sépare les différents paramètres dans un tableau
            $params = [];
            if (isset($_GET['p'])) {
                $params = explode('/', $_GET['p']);
     
                //foreach ($params as $k => $v) {
                    //echo $k . " => " . $v . '<br>';
                //};
     
     
                if ($params[0] != '') {
                    //On a au moins un paramètre
                    //On récupère le nom du controleur à instancier
                    //On met une majuscule en premiere lettre et on
                    //ajoute le namespace complet avant et ajoute 
                    //"controller" après
                    // Attention: Si en localhost ajouter unset($params[0])!;
     
                    unset($params[0]);
     
                    $controller = '\\App\\Controllers\\' . ucfirst(array_shift($params)) . 'Controller';
     
                    //foreach ($params as $k => $v) {
                        //echo $k . " => " . $v . '<br>';
                    //}
     
                    //var_dump($controller);
     
     
                    //On instancie le controleur
                    $controller = new $controller();
     
                    //On récupère le deuxième paramètre d'URL
                    $action = (isset($params[0])) ? array_shift($params) : 'index';
                    //var_dump($action);
     
                    if (method_exists($controller, $action)) {
                        //Si il reste des paramètres on les passe en tableau à la méthode
                        (isset($params[0])) ? $controller->$action($params) : $controller->$action();
                    } else {
                        http_response_code(404);
                        echo "La page demandée n'existe pas";
                    }
                } else {
                    //On a aucun paramètre
                    //On instancie le controleur par défaut
                    $controller = new MainController;
                    //On appelle la méthode index
                    $controller->index();
                }
            }
        }
    }
    Et enfin l'autoloader.php

    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
    27
    28
    <?php
     
    namespace App;
     
    class Autoloader
    {
        static function register()
        {
            spl_autoload_register([__CLASS__, 'autoload']);
        }
        static function autoload($class)
        {
            //On récupère dans $class la totalité du namespace de la classe concernée
            //on retire App
            $class = str_replace(__NAMESPACE__ . '\\', '', $class);
     
            //On remplace les \ par des /
            $class = str_replace('\\', '/', $class);
     
            //On vérifie si le fichier existe
            $fichier = __DIR__ . '/' . $class . '.php';
     
            if (file_exists($fichier)) {
                require_once($fichier);
            }
            //echo "Classe initialisée par autoloader : " . $class . '<br>';
        }
    }
    Chose curieuse : les require_once fonctionnent tous en chemin absolu genre /dossier/fichier.php, alors pourquoi pas les adresses des css et autres js ?

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par clickandgo Voir le message
    Curieusement cette sentence est souvent tronquée dans VSCode qui m'annule les anti-slash...
    VS Code supprime des \ dans ton script ? Je n'ai jamais eu ce comportement. Désactive les extensions, oui.

    Essaie cette règle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule ^(.*)$ /index.php?p=$1
    Il faut adapter l'accès à index.php selon la config de ton serveur.
    L'exemple donné fonctionne si ton index.php est accessible à la racine de ton serveur web, ex. http://127.0.0.1:8081/index.php

    les require_once fonctionnent tous en chemin absolu genre /dossier/fichier.php, alors pourquoi pas les adresses des css et autres js ?
    Parce que les fichiers ne sont pas adressés et exécutés dans le même contexte Le navigateur n'accède qu'aux fichiers de la racine web définie sur le serveur web (et heureusement), voir la directive DocumentRoot Apache http://httpd.apache.org/docs/2.4/fr/urlmapping.html

    Sauf mention contraire, PHP fonctionne sur le système de fichiers du serveur, ex.

    require_once '/home/username/bin/mysite/lib/myfuncs.php';

    On peut imaginer la racine web à /home/username/bin/mysite/public
    Un / de la page web accédera à ce dernier répertoire

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 126
    Par défaut
    Bonjour Séb,

    La règle de réécriture ne fonctionne pas, je n'ai plus accès à rien ...

    J'ai rajouté ces deux lignes aux httpd :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    AddType text/css .css
    AddType text/javascript .js
    Aucun résultat...

    Ma config httpd sur Xampp spécifie le dossier Public comme entrée documentroot, j'ai cru comprendre qu'Apache ne remonte pas dans les dossiers du dessus or le dossier /CSS et JS sont à la racine et non pas dans Public cela viendrait il de là ?

    J'ai çà comme config :

    DocumentRoot "D:/OneDrive - Click and Go ! Informatique/DevWeb/NomDuSite/Public"
    <Directory "D:/OneDrive - Click and Go ! Informatique/DevWeb/NomDuSite">

    Peut on spécifier des accès aux dossiers se trouvant en dehors de Public ? (la deuxième ligne ne le fait elle pas ?)

    A noter que mon index.php se trouve dans le même dossier que .htAccess soit le dossier Public :

    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
     
    namespace App\Public;
     
    use App\Autoloader;
    use App\Core\Main;
     
    // On génére une constante qui contient le dossier racine
    define('ROOT', dirname(__DIR__));
     
    //echo "Dossier racine = " . ROOT . '<br>';
     
    //On importe l'autoloader
    require_once ROOT . '/Autoloader.php';
    Autoloader::register();
     
    //On instancie la class Main qui est le routeur
    $app = new Main();
     
    //On démarre l'application
    $app->start();
    Concernant les extensions : Intellisense par exemple me bloquait et ne résolvait plus les namespaces, on a passé des heures à incriminer le code pour rien sur d'autres forum ... Désinstallation de l'extension ... plus aucun problème !

    Il y a pas moyen de construire des chemins absolus en interrogeant le server via php ?

    Je suis resté en localhost... Dois-je passer à du virtualHost ?

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 126
    Par défaut
    Arrrgggghhhh !

    J'ai déplacé les dossiers /css et /js dans le dossier Public : tout remarche !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/01/2021, 18h19
  2. Chemin absolue dans fichier CSS
    Par topolino dans le forum ASP.NET
    Réponses: 6
    Dernier message: 19/08/2009, 14h59
  3. CSS pas appelé en chemin absolu
    Par Jarodd dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 09/10/2008, 12h23
  4. charger feuille CSS par chemin absolu du système de fichiers
    Par luctheo dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 26/08/2008, 08h45
  5. [langage] chemin absolu d un fichier
    Par nono1782 dans le forum Langage
    Réponses: 4
    Dernier message: 20/07/2004, 14h02

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