Problème de Get

KalistaKalista Member
Hello,

Après m'avoir demandé un design en navigation "sans reload" (c'est-à-dire que la navigation dans le site se fait en AJAX, sans changement réel d'URL - tout se passe sur la page d'accueil et des scripts chargent les articles au fur et à mesure), un client a décidé de revenir vers moi pour me demander... d'ajouter un système d'URLs.

A priori j'essaie de faire ça avec $_GET, mais en l'état ça ne marche juste pas et je reçois ceci à la place (URL tapée : http://localhost/plu/?test=r):
[== Undefined ==]
ERROR
Page non trouvée


Warning: include(C:\xampp\htdocs\plu\themes\custom/sidebar.php): failed to open stream: No such file or directory in C:\xampp\htdocs\plu\themes\custom\erreur.php on line 27

Warning: include(): Failed opening 'C:\xampp\htdocs\plu\themes\plu/sidebar.php' for inclusion (include_path='C:\xampp\php\PEAR') in C:\xampp\htdocs\plu\themes\custom\erreur.php on line 27

L'URL de base du site (en local) est localhost/plu/, qui correspond donc à la page d'accueil.

Ce que j'aimerais faire, c'est pouvoir écrire localhost/plu/?article=28 dans la barre d'adresse, et pouvoir récupérer $_GET (et donc obtenir 28) côté PHP pour ensuite passer ça à mon JavaScript lorsque c'est effectivement l'URL entrée par l'utilisateur. (Et en parallèle mettre à jour l'URL au fil de la navigation en AJAX, mais ça je suppose que je le règle dans un deuxième temps...)

Je crois que le problème c'est que de base PluXML utilise GET pour sélectionner la page qu'il affiche (ce que du coup je ne fais pas, étant dans une navigation en AJAX), donc je suppose que dans l'idée je cherche soit à contourner ça, soit à désactiver ce fonctionnement...

Any hint?

Réponses

  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    juin 2018 modifié
    Tes explications ne sont pas très claires.
    J'ai du mal à comprendre ce que tu fais déjà et ce que tu veux faire

    PluXml ne connait pas Ajax, pas plus que JSON.
    A mon grand regret !
    Cela permettrait de charger au fur et à mesure les articles quand on scrolle la page d'accueil.
    I y a pas mal de sites qui font cela et c'est assez sympa.
    Il n'y rien d'impossible.
    L'an dernier, j'avais commencé à développer un plugin qui permettait de télécharger les articles en json au fur à mesure du scrolling en arrière plan plutôt que de cliquer sur les boutons de pagination. Je l'avais employé dans un thème perso et cela fonctionnait bien
    Sauf que je ne suis pas graphiste et que la charte graphique piquait les yeux.

    Il y toujours eu une inertie forte pour corriger les expressions régulières et virer cet antique XML_parseur au profit de SImple XML.
    De plus, le projet s'enfonce lentement dans une profonde léthargie
    Ce qui fait que je ne suis pas trop motivé pour finaliser mon thème ou intégrer json dans pluXml pour ouvrir la porte à l'ajax

    L'url exacte pour un article est http://localhost/plu/index.php?article28
    Si a la place tu veux juste taper http://localhost/plu/?article28, il faut mettre une règle de ré-écriture dans le .htaccess à la racine du site ou modifie le fichier de config de Nginx
    Et tu peux simplifier encore plus par http://localhost/plu/article/28

    Avec une version modifiée de PluXml et sans modifier la config du serveur, j'ai un site qui tourne avec des adresses de la forme :
    https://mon-site.com/article/mon-titre-de-larticle
    https://mon-site.com/categorie/ma-categorie
    https://mon-site.com/tag/mon-tag
    ....
    Les sources sont sur Github pour l'instant. L'arrivée fracassante de M$ peut faire évoluer les choses. Pour l'instant wait and see

    Si c'est juste pour récupérer le numéro de l'article de l'url: pas besoin de taquiner le serveur avec PHP, on peut faire cela directement dans le navigateur à partir de window.location.href

    Je crois qu'il te manque quelques compétences ...
  • Ce que je fais déjà (désolée, je peux pas montrer le site) : quand tu arrives sur la page d'accueil du site, il n'y a aucun "vrai" lien. Tous les trucs qui ressemblent à des liens sont en fait des boutons qu'écoute un script JavaScript ; cliquer sur l'un d'eux fait apparaître une div vide dans laquelle est ensuite chargée la page correspondant au bouton (donc : c'est de l'AJAX, dans PluXML).

    La page d'accueil utilise un template construit pour faire ça, et les pages chargées utilisent deux templates différent (un pour afficher les catégories, un pour afficher les articles). Puisque les articles ne sont jamais affichés "normalement" (dans leur propre page) mais seulement en tant qu'éléments chargés à l'intérieur de la page d'accueil, leur template est minimaliste.

    La difficulté est que comme, précisément, tout a été fait pour que tout se passe sur la page d'accueil (cahier des charges du client), l'URL affichée dans la barre d'adresse ne change jamais.

    Donc pour résumer, le comportement actuel :
    - Page d'accueil http://localhost/plu.
    - Sur cette page, je clique sur le bouton "Article 1".
    - AJAX charge l'article 1 (qui existe bien du côté de Plu, donc) dans une div prévue pour ça.
    - L'URL n'a pas changé, c'est toujours http://localhost/plu.
    - Si je cliquais ensuite sur "Article 2", la div réceptacle serait purgée puis l'article 2 serait chargé à son tour.
    - Etc..

    Le comportement visé :
    - Tout pareil, sauf que lorsque la page d'accueil est chargée (côté PHP/Plu) elle check le GET de l'URL (donc par exemple si je mets http://localhost/plu?article=1, je passe la variable "Article = 1" dans mon PHP, lequel la passe à JavaScript, lequel comprend qu'un article spécifique est visé et AJAX immédiatement cet article plutôt que de passer par la case "div réceptacle vide").
    - (S'il n'y a pas de GET, rien ne diffère du fonctionnement actuel.)
    - A chaque fois qu'un article est chargé par AJAX, l'URL est modifiée pour pouvoir être utilisée directement (cf. ce que je viens de décrire juste au-dessus). Mais ça c'est a priori trivial.
    - J'ai donc besoin de savoir où mettre le GET dans mon URL pour que Plu ne m'insulte pas.

    Le problème c'est que Plu utilise le GET pour viser les articles par défaut (l'URL canonique est http://localhost/plu/index.php?article29), or précisément si je tape ça j'arrive... sur la page de l'article, qui est donc lue avec le template (minimaliste et quasiment vide) des articles.

    J'ai besoin d'arriver sur la page d'accueil et de juste récupérer le contenu du GET, sans que Plu y réagisse de son côté. (Donc par exemple, http://localhost/plu?article=1 doit charger la page d'accueil et passer la variable "article = 1" à JavaScript.)

    Effectivement je pense que creuser du côté du .htaccess a des chances de marcher (vu que c'est vraiment sur la structure des URL spécifique à Plu que je bute), je vais aller voir de ce côté. Merci pour le tuyau !
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    Je vois bien ce que tu veux faire:

    - Tu as une homepage ou onepage avec une <div> vide.
    - tu cliques sur un bouton pour réveiller Ajax
    - Ajax envoie une requête asynchrone au serveur en réclamant le contenu ( au sens large ) de l'article, soit un fragment HTML tout prêt, soit le fichier xml de l'article, soit la même chose en json ( plus facile à traiter en JS
    - A réception de la réponse, un callback de Ajax insèé la réponse dans la <div>, soit directement si c'est un fragment HTML, soit après traitement si on cause XML ou JSON

    C'est là où cela coince. PluXml ne sait que servir que des pages HTML prêtes à afficher. Donc il va falloir parser ces pages avec un DOMDocument pour extraire ce qui t'intéressent. Je le fais pour un site pour des récupérer des résultats sur le site d'une fédération sportive pour l'afficher dans mon club sans garder le look de la fédé. mais je le fais côté serveur. Côté navigateur cela doit être faisable mais ça complique.

    Pour éviter cela, il faut créer dans l'installation de PluXml, soit au niveau du dossier core/admin, ou de du dossier plugins/ton-plugin-ki-va-bien, un script PHP qui va créer une instance de $plxAdmin ou $plxMotor. Cette instance est alors capable de chercher le contenu de l'article demandé, soit au format XML comme c'est stocké dans le fichier article, soit au format JSON plus commode pour travailler en JS, ou mieux un fragment HTML prêt à être insérer dans la <div> précèdente.

    Si tu connais bien le fonctionnement du core de PluXml, Ajax ou XMLHttpRequest et manipuler le DOM avec JS, c'est faisable.
    Sinon, il faut que je récupère dans mes dossiers le script PHP que j'avais écrit.
    Mon idée était de supprimer ces vieux boutons de pagination et d'afficher les chapos des articles au fur et à mesure que l'on scrolle la homepage.
    C'était le même besoin que toi récupérer seulement le contenu de l'article sans se taper la page HTML complète.

    Ton problème, ce n'est $_GET, c'est REST API.
    Et cela n'existe pas dans la version "officielle" de PluXml et c'est pas pour demain apparemment.
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    juin 2018 modifié
    Je t'ai mis un ligne une démo du thème que j'ai évoqué ci-avant.
    Disons qu'il y a un effet Brickout comme le jeu de casse-briques

    http://jeveuxpartir.lan/PluXml/

    A chaque fois qu'on scrolle la page d'accueil, un script JS dans footer.php du thème envoie une requête XMLHttpRequest vers le serveur pour récupérer les articles 1 par 1 ou par petit lot.
    Côté PluXml il y a un plugin qui traite directement la demande.

    Ouvre l'inspecteur de ton navigateur et regarde dans l'onglet réseau les requêtes qui sont envoyées au serveur et les réponses qui sont données.

    Ton thème est plus statique puisque tu n'affiches qu'un article et qu'il n'y pas un flux continu d'articles à gérer

    Dis-moi si cela t'inspire
  • Pardon d'insister, mais le AJAX marche déjà parfaitement (comme mentionné plus haut). Ce n'est pas AJAX le problème. (Fonctions ci-dessous, elles marchent. Pas besoin de bidouiller Plu non plus, juste de bien câbler dans les templates.)
    [== PHP ==]
    <li class="menu-item" id="menu-bibliographie" onclick='reveal("categorie4/cat-biblio", contentFoe, event)'>bibliographie</li>
    

    Cet exemple correspond à un bouton qui appellera la page d'index de la catégorie "bibliographie". Ca marche évidemment aussi avec les articles (dans les deux cas, les templates catégorie et article sont ultra-minimalistes et ne font qu'afficher la liste / le contenu, ce qui est exactement ce que je veux - pas besoin de parse quoi que ce soit).
    [== JavaScript ==]
    // AJAX HANDLER
    // This handles AJAX loading.
    
    // urlRacine is added at the beginning of the URL, should usually be empty.
    var urlRacine = "";
    
    // contentFoe is the default target for AJAX.
    var contentFoe = "mask-content";
    
    // loadDoc is where the magic happens.
    // x determines what is being loaded.
    // y determines where it is being loaded.
    function loadDoc(x, y) {
    var loader = new XMLHttpRequest();
    loader.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
         document.getElementById(y).innerHTML = this.responseText;
         console.log(this);
        }
      };
      loader.open("GET", urlRacine + x, true);
      loader.send();
      console.log(urlRacine + x);
    }
    

    (mask-content correspond à la div vide qui est remplie lors du call, donc.)

    Le problème c'est que j'ai besoin de pouvoir sortir un loadDoc arbitraire défini par l'URL entrée dans le navigateur, si (et seulement si) celle-ci contient un GET (donc, par exemple, localhost/plu/?article=01 ou localhost/plu/?article=robert, peu importe, je parse ça de mon côté en JavaScript). C'est tout.

    Sauf que si je tape ça, Plu me répond simplement qu'il ne trouve pas la ressource demandée (erreur 404). Ce qui est logique, parce que pour Plu, ce que j'ai fait là, c'est juste lui dire "sors moi l'article 01 / robert dans le template adéquat".

    J'avais trouvé ce thread - http://forum.pluxml.org/viewtopic.php?id=3381 - mais je n'arrive pas à trouver comment l'URL devrait être écrite à la racine du site pour quand même passer une variable (taper localhost/plu/index.php marche (aucun GET explicite), mais pas localhost/plu/index.php?test qui me renvoie un 404 - j'ai bien désactivé la réécriture d'URL dans l'admin).

    Tout ça pour dire qu'au choix, il me faut rendre Plu plus bête qu'il ne l'est en lui interdisant de réagir directement au GET (ce qui cause les erreurs 404) ou trouver l'orthographe exacte à utiliser dans une URL pour lui passer un GET auquel il ne réagisse pas. C'est "juste" ça qui me bloque.
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    Pour savoir quel URL envoyer à PluXml pour avoir un article, désactive l'URL-rewriting
    Va dans la homepage et regade comment sont faits les liens pour charger un article.
    Mais si tu utilises cet URL à XMLHttpRequest, au retour "this.responseText" va contenir la page complète avec son <head>, la barre de navigation, la sidebar.
    PluXml ne sait faire que cela.
    Et quand tu vas passer cela à "document.getElementById(y).innerHTML" ça va être un joyeux bordel dans la page

    L'erreur 404 est renvoyée par la methode plxMotor::prechauffage() du fichier core/lib/class.plx.motor.php ($this->error404(L_UNKNOWN_ARTICLE);)

    Je crois que je vais devoir t'envoyer mon plugin mais je n'ai pas rédigé de doc.
  • "Mais si tu utilises cet URL à XMLHttpRequest, au retour "this.responseText" va contenir la page complète avec son <head>, la barre de navigation, la sidebar."

    Non, cela n'arrive que si le template contient effectivement un head, une barre de navigation et une sidebar (ce qui n'est en aucun cas requis). Voici mon template d'article en entier :
    [== PHP ==]
    <?php $plxShow->catList('', '
    		<div class="category-toggle" id="#cat_id" onclick="reveal(`#cat_url`, contentFoe, event)">#cat_name</div>
    	', '', '001|002|007') ?>
    
    <div class="clear"></div>
    <hr>
    
    <h1><?php $plxShow->artTitle() ?></h1>
    
    <?php $plxShow->artContent(false) ?>
    

    (Ca pourrait être encore plus simple, je pourrais retirer tout ce qui est au-dessus du <hr> voire même tout à part la toute dernière ligne.)

    Je vais me coucher pour l'instant, je jette un oeil à plxMotor::prechauffage() demain (En creusant un peu j'étais tombée sur le moteur, pas loin !). Merci beaucoup pour ton aide, j'ai la vague intuition qu'effectivement c'est par là que ça va se passer.
  • bazooka07bazooka07 PluXml Lead Developer, Moderator
    juin 2018 modifié
    Je me suis replongé dans mon thème que j'ai écrit il y aplusieurs mois

    Cela se passe en 4 temps :
    - on ajoute un marqueur à l'url de XMLHttpRequest. Par exemple http://monsite/plux/index.php?article54/titre-de-l-article va devenir http://monsite/plux/index.php?article54/marqueur
    titre-de-l-article dans la version officielle de PluXml ne sert qu'à faire joli
    - on utilise un petit plugin qui va vérifier s'il y a ce marqueur dans l'url demandée. Si c'est le cas on définit une constante PHP, par exemple
    [== PHP ==]
    define('MARQUEUR', true);
    
    La valeur n'a aucune importance, pourvu que la constante existe
    - on laisse PluXml se préchauffait et démarrait
    - C'est quand il vient traiter le thème que ça change. Dans les fichiers indésirables du thême (top.php, footer.php, sidebar.php ..), on va tester la présence de notre nouvelle constante
    Si la constante existe alors on fait brutalement un exit en début du fiichier de la même manière que si la constante PLX_ROOT de PluXml n'existe pas.
    En clair, pour chaque fichier php qui ne doit pas être utilise par XMLHttpRequest, on ajoute au début
    [== PHP ==]
    <?php if(!defined('PLX_ROOT') or !defined('MARQUEUR') { exit; } ?>
    

    Si tu sais écrire un plugin pour PluXml, il faut utiliser le hook plxMotorPreChauffageBegin avec l'expression régulière qui va bien
    Comme cela, on peut garder la version officielle de PluXml et ajuster légèrement le thème
    Comme cela this.responseText contient seulement la valeur de innerHTML.

    Demain, je suis pas mal occupé.
Connectez-vous ou Inscrivez-vous pour répondre.