Problème de modication du code html d'un site en CURL et DOM PHP

Nouveau WRInaute
Bonsoir tout le monde.
J’essaye de développer un composant pour l’optimisation des sites web et je test cet composant sur joomla .
Donc, je récupère le contenu du site avec CURL PHP et je parse le contenu avec DOM pour modifier le code par exemple je modifier les balise <b> par <strong> , la position des scripts javascript …. Ensuite il faut appliquer ses modifications au site (charger ses modifications « le nouveau code html modifié » dans le site) mais j'ai pas trouver une solution pour modifier le site :(
Donc, comment je peux le faire avec CURL ou avec une autre solution si existe ?
vous trouvez un exemple de script que j'ai développé:
Code:
<?php
$URLs = "http://localhost/...";// url of site 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $URLs);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
$source = curl_exec($ch);
libxml_use_internal_errors(true);
$dom = new DOMDocument();   
 $dom->recover = true;
 $dom->substituteEntities = true;
 $xhtml = (preg_match('/XHTML/', $source)) ? true : false;
        switch ($xhtml) {
            case true:
                $dom->loadXML($source);
                break;
            case false:
                $dom->loadHTML($source);
                break;
        }
libxml_use_internal_errors(false);
$body = @$dom->getElementsByTagName('body')->item(0);
        foreach (@$dom->getElementsByTagName('head') as $head) {
            foreach (@$head->childNodes as $node) {
                if ($node instanceof DOMComment) {
                    if (preg_match('/<script/i', $node->nodeValue)){
                        $src = $node->nodeValue;
                         $moveme[] = $node;
                    unset($src);
                    }
                }
                if ($node->nodeName == 'script' && $node->attributes->getNamedItem('type')->nodeValue == 'text/javascript') {
                    if (@$src = $node->attributes->getNamedItem('src')->nodeValue) {
                                        } else {
                        $src = $node->nodeValue;

                    }
                     $moveme[] = $node;
                    unset($src);
                }                
            }
        }
          foreach ($moveme as $moveit) {
            $body->appendChild($moveit->cloneNode(true));
            $moveit->parentNode->removeChild($moveit);
        } 
         $body = $xhtml ? $dom->saveXML() : $dom->saveHTML();
//ici manque le code pour enregistrer les modifications dans le site

Et merci d’avance pour votre aide. :wink:
 
WRInaute impliqué
Pour l'enregistrement c'est possible via SSH2 (une extension PHP) MAIS ce que tu veux faire est impossible.
Tu récupères une page générée par plein de fichiers et qui produisent un résultat. Tu modifies ce résultat et tu voudrais enregistrer... quoi, où ? Il faudrait retrouver la position de tous les bouts de codes éparpillés qui ont permis de générer la page (et redécomposer les boucles etc : bref, analyser le code d'une manière extrêmement évoluée, chose que seul un humain peut faire à l'heure actuelle, je pense).

Si tu veux ce que tu veux faire revient à faire une capture d'écran d'un page web, appliquer un filtre Photoshop et chercher la commande "Enregistrer" qui modifie la page (composée de CSS, Images découpées, polices de caractères...).

Ce que tu peux faire c'est éventuellement ajouter ton code qui modifie la page avant de l'envoyer au navigateur mais même ce genre de choses, simples en apparences peut se révéler bien compliquées.

Au fait, je ne sais pas trop ce que tu cherches à faire : modifier les <b> par <strong>, par exemple. C'est pour la sémantique ? Mais si la CSS modifie <b>, tu vas changer l'apparence de la page.
Si c'est pour optimiser le chargement (position des scripts), si c'est pour obtenir quelque chose qui marche et non juste pour le plaisir de coder, il y a déjà Google qui propose quelque chose : https://developers.google.com/speed/pagespeed/
 
Nouveau WRInaute
Je vous explique plus ce que je suis entrain de faire.
Tous d’abord, je suis étudiante, Mon projet de fin d’étude consiste à développer un outil pour l’analyse des sites web et un composant adaptable a tout site CMS pour l’optimisation.
J’essaye de développer un composant comme les composants et les plugins de joomla mais la différence est que mon composant est développé en PHP (donc je n’utilise pas le JFACTORY …. De joomla)
Donc le composant va être installé dans les sites CMS, lorsque l’administrateur du site veut optimiser par exemple en javascript, je le propose quelque optimisation : la position du javascript, minifier les fichiers js..Et exécute mon script.
Le but de mon composant est effectué quelque optimisation au site automatiquement sans que l’administrateur du site l’applique lui même
Oui, c’est pour la sémantique .Pour la balise <b> je test s’il est modifié en css si oui je ne change pas sinon je change par <strong>.
 
WRInaute accro
Je ne comprends pas plus après ton dernier message. Ton outil est un plugin Joomla! développé sans utiliser le framework natif de Joomla! ?
 
Nouveau WRInaute
oui c'est un composant qui a la même architecture que les composants de joomla (fichier xml ....) installé sous joomla mais au développent de mes codes je n'utilise pas les classes de joomla telque JFactory, JResponse..... j'utilise que php .
 
WRInaute accro
je connais pas assez joomla pour dire autre chose que c'est une usine a gaz mais concrètement ce que tu tente de faire touche a deux choses :
* le code lié au template utilisé par le CMS
* le contenu

Hors si on ne prend qu'un CMS et un seul ce qui est déjà ambitieux. Cela implique que tu ai étudié tous les template possibles pour leur apporter des modifications ce qui ne pourra se faire que par modification directe des fichier sur le serveur.
Et pour ce qui est du contenu tes optimisations une fois définies genre b en strong pour reprendre ton exemple c'est juste une requête dans la base de données ce qui n'est pas la mer a boire.

Après de ce que je sais de joomla, il y a un si fort couplage entre la vue et l'applicatif parfois que c'est quasiment impossible a faire sans prendre de gros risques ou en accomplissant un travail de titan pour presque rien.

Tu ferais peut être mieux de te borner a la partie analyse en fournissant un "rapport d'optimisation", ce qui au passage te rendrais plus transparent vis a vis du CMS utilisé.

Après perso un truc qui me modifie le site en live comme ça c'est direct poubelle pas question qu'il touche au code sans m'avoir convaincu avant ... Si tu veux convaincre les pro faudrait vraiment rester au stade de l'audit
 
WRInaute impliqué
@Rihab.bs : ce que tu veux faire est impossible. Relis ce que j'ai écrit : tu veux travailler sur le code généré et le redispatcher dans les fichiers qui le génèrent mais ça n'est pas possible. A la limite tu pourrais travailler sur des templates mis en cache qui eux servent à générer le code, mais dans ce cas tu dois lire les fichiers sur le disque directement et non pas passer par CURL pour récupérer le résultat de leur utilisation.

Au fait, même pour le passage de b à strong, il est impossible d'être certain que ça ne va pas casser quelque chose. Tu dis tester les CSS mais lesquelles ? tu vérifies les <link>, les <style>, les @import dans les styles, les styles chargés en javascript, le javascript qui peut être appliqué aux <b>, en code natif et via des librairies type jQuery avec des choses comme $('.uneclasse b").click(...) ?

Tu vois un peu le travail : on ne change pas le HTML à la volée. On ne peut même pas supprimer les commentaires HTML sans être certain que ça n'aura aucun impact : certains stockent du code Javascript dans des commentaires HTML et l'exécutent que s'ils en ont besoin.
 
Nouveau WRInaute
Mais il existe des plugins et des composants dans joomla qui modifie au niveau code pour améliorer la performance des sites (par exemple « scripts down », il modifie les postions des script js ,il existe autre qui combine tout les fichiers css en un seul, aussi les fichires js , telque jbetol,jch optimize …il existe aussi pour le SEO(ajout des balises metas, balise titres lorsqu’il n’existe pas…)tel que le Header tag ,SEO Simple,Tag Meta et toujours en trouve des nouveaux plugins et composants joomla et qui on le même fonctionnalité mais avec un peu de différence ou une petite mise à jour et ce que je suis entrain de faire c’est le même juste que mon composant va avoir plus de fonctionnalité et j’essaie de trouver des fonctionnalités qui n’existe pas au niveau des plugins déjà développer pour améliorer mon composant puisque c’est un projet de fin d’étude .
 
WRInaute impliqué
Mais il existe des plugins et des composants dans joomla qui modifie au niveau code pour améliorer la performance des sites (par exemple « scripts down », il modifie les postions des script js
oui mais il traite les données à la volée : c'est un plugin qui s'installe dans Joomla. Quand Joomla a fini de générer la page, il appelle le plugin script down qui récupère alors le HTML de la page générée et le modifie AVANT l'envoi au navigateur. Mais il n'enregistre rien, ça c'est pas possible à faire.

tu peux créer un produit qui va modifier le code généré par le CMS, mais tu ne pourras pas sauvegarder les optimisations.
elles devront sans cesse être appliquées par le CMS qui appellera ton code via un plugin à chaque fois qu'une page sera générée par le serveur (ce qui implique que ton produit doit être rapide, sinon le temps passé à optimiser peut excéder les gains de l'optimisation).

voilà comment on peut faire ce que tu veux faire :
- créer une classe avec une méthode qui optimise une chaine (qui contient le code HTML d'une page) et renvoie une chaine avec le HTML optimisé
- créer des plugins pour les CMS qui s'occuperont de faire l'interface entre le CMS et ta classe

Tu ne pourras pas créer un produit universel qui applique les optimisations à n'importe quel CMS sans avoir à créer des plugins, du moins pas en PHP.
c'est ce que fait Google, mais pour ça il faut créer un composant pour le serveur web (un module Apache par exemple) qui va traiter directement les données que le serveur envoie : peu importe quel CMS a généré la page, peu importe le langage, il peut appliquer ses traitement au dernier moment, quand les données quittent le serveur pour rejoindre le navigateur de l'internaute.
 
Nouveau WRInaute
@colonie : si je ne vous dérange pas, vous pouvez m’expliquer un peu plus c’est quoi l’impossible de ce que j’ai écrit ci-dessous ? C’est quoi le possible et comment je peux corriger au niveau code ? et merci .c 'est mon projet de pfe et j'espère trouver une solution.
J’ai mon site joomla et mon composant qui est installé coté administrateur du site .je travaille toujours en local. Lorsque j’active une des fonctionnalités du composant il va récupère l’url du site avec le $-SERVER et j’ai utilisé curl pour récupérer le contenu en suite je le parse pour que je puise manipuler les balises.
 
WRInaute impliqué
parce que les pages complètes que tu optimises n'existent pas. elles sont construites à chaque fois qu'une page est visualisée en combinant plusieurs fichiers HTML, en modifiant des parties pour ajouter des données qui viennent de la base de données, etc.

ce que tu optimises, c'est en quelque sorte une page à usage unique parce qu'on lui a injecté du contenu : une liste d'articles qui sera périmée quand un nouveau sera publié, le login de la personne connectée, des dates affichées sous la forme "il y a 3 minutes" qui changeront la minute d'après...

ça ne sert à rien de l'optimiser, elle ne sera plus jamais utilisable. ce qu'il faut c'est :
- soit optimiser les fichiers qui servent à créer cette page (et pas la page récupérée par http://...)
- soit placer le code qui optimise à la fin de la génération de la page par le CMS.

La deuxième solution est celle de scripts down. Télécharge-le et examine le code. Les plugins fonctionnent avec un système dit de "hooks" : à divers endroit, le CMS permet de lancer du code. Pour scripts down, c'est onAfterRender (quand la page a été générée), et il récupère le code HTML de la page par JResponse::getBody().

J'ai l'impression tes connaissances du fonctionnement des CMS sont assez "légères". Il faut au moins que tu saches comment fonctionnent des templates et/ou un système de plugins pour pouvoir faire ce que tu veux faire.

Mais peut-être que tu t'es fixé un objectif trop haut ? Si tout ce qu'on attend de toi est de faire une démonstration et non un produit fini, tu peux peut-être te limiter à faire un truc du genre : on saisit une URL et il affiche le code optimisé. De toute façon c'est par là qu'il faut commencer : l'optimisation du code.

Après, l'intégration aux CMS c'est simplement du packaging. Si tu as conçu ton optimiseur de code de manière à ce qu'on puisse l'appeler par un appel à une fonction, ça se fera assez simplement.
 
Nouveau WRInaute
Oui ,j’ai téléchargé quelque composant pour savoir leur mode de fonctionnement et ce que je voulais faire est de chercher une solution en php au lieu d’utiliser le JResponse ::setBody()
 
Discussions similaires
Haut