======PHP : Lecture de fichier html ou xml======
=====Présentation=====
====But====
Générer automatiquement la liste des ponts disponibles sur notre site afin de n'avoir qu'a ajouter les nouvelles pages sans toucher au sommaire.
====Activité====
{{ :clubinfo:site_v3.jpg?200|}}
Il va falloir :
* Déterminer les différentes pages (décrivant un pont) placées sur notre site.
* Trouver pour chaque page le nom du pont concerné.
* Trier la liste des ponts dans l'ordre alphabétique pour plus de clarté.
* Afficher la liste sur la page.
=====Connaissances et savoir faire=====
* Revoir le cours sur le [[clubinfo:PHP]]
====Connaissances supplémentaires====
Il existe de nombreuses bibliothèques PHP contenant des fonctions utiles aux différentes tâches à réaliser. Voir sur [[https://www.php.net/manual/fr/funcref.php|Références PHP]] le détail des différentes fonctions ci-dessous grâce a son moteur de recherche.
====Parcourir le système de fichier====
Il faut donc parcourir le système de fichier de notre site pour traiter tous les fichiers HTML sauf index.html.
* Le système de fichier correspond à l'arborescence des adresses URL ( (dossier /) fichier.extension).
* Le dossier courant peut être représenté par un point '.' et le dossier parent par '..'.
* Un dossier est un espace de données qui contient des pointeurs sur le contenu des fichiers.
* Un fichier est identifié par son chemin (liste des dossiers successifs, un nom et une extension (fonction de son contenu).
Si un fichier est connu, on peut y accéder directement : fopen ($chemin, 'r'); (r = lecture et w = écriture).
Pour parcourir ou chercher les fichier d'un dossier, il est nécessaire de :
* Pointer sur le dossier courant (ou sont enregistrées nos pages) : **$dir = opendir($chemin)**
* Lire les fichiers qui s'y trouvent : **$fic = readdir($dir)**
* Décomposer le nom du fichier dans un tableau : **$tabinfo = pathinfos($fic)**
* Conserver les fichiers qui contiennent du HTML sauf index.html ($tabinfo["extension"] et $tabinfo["basename"])
{{:cours:cp.png?20 |}}++++Coup de pouce |
++++
====Lire le contenu d'un fichier HTML====
Nous avons trouvé le fichier concernant un pont. Pour connaître le nom nom du pont, il faut lire le contenu de la balise
// Ouvre le fichier pour en lire le contenu ($page = contenue de la balise HTML)
$page = new SimpleXMLElement('./' . $fichier, 0, TRUE);
// Récupère le nom du pont dans la balise et l'ajoute dans une liste (tableau)
$nom = $page->body->h2->a;
++++
====Les tableaux====
Un tableau est un objet particulier contenant une liste de clé->valeur. Une fois le tableau créé, je peux ajouter de nouvelle clé->valeur ou en lire le contenue. Les clés (série de nombres débutant à 0 ou série de mots uniques dans la liste) permettent d'accéder aux différentes valeurs. Les tableaux peuvent être "multidimensionnel" (la valeur est elle même un tableau). Ils peuvent aussi être parcourus de manière itérative.
Il faut :
* Créer un tableau pour contenir la liste (avant d'accéder au système de fichier) : **$tab = array();**.
* Ajouter dans la liste, pour chaque pont, son nom et son fichier : **$tab[] = array("nom" => $nom, "fich" => $info["basename"]);**
* Trier la liste dans l'ordre alphabétique (lorsque tous les fichiers ont étés lus) : **$tab->asort();**
====Affichage de chaînes de caractères====
Nous avons vu que 2 chaînes de caractères pouvaient être concaténées grâce à l'opérateur '.' mais il existe aussi de nombreuses fonctions comme : chercher la position d'une sous chaîne, extraire une sous chaîne, convertir la chaîne (minuscule/majuscule ...), remplacer une partie de chaîne, formater une chaîne ... Concernant l'affichage d'un résultat, c'est sa mise en forme qui nous importe le plus.
* Indiquer le nombre d'élément d'une liste : **count($liste);**
* Créer une boucle pour traiter tous les éléments de la liste des ponts : **foreach()**
* Afficher chaque élément de la liste de manière formatée : **printf()**
{{:cours:cp.png?20 |}}++++Coup de pouce |
// Afficher le nombre de pont
echo "\tLa collection possède " . count($liste) . " ponts :
\n";
// Début de liste et parcourir la liste des ponts
echo "\t\n";
foreach ($ponts as $pont)
// créer les balises HTML pour mettre en place chaque élément de la liste de liens utiles
printf("\t\t- %s
\n", $pont["fic"], $pont["nom"]);
// Fin de la liste
echo "\t
\n";
++++
=====Pour finir=====
* Ne pas oublier d'enregistrer ce nouveau fichier sous le nom de "index.php" puisqu'il contient du PHP à interpréter.
* Corriger le lien de retour de chaque page concernant un pont de "index.html" en "index.php".
* Tester et corriger le code si besoin.
Ponts du monde
Ponts du monde
Ce site présente les pont les plus remarquables dans le monde. Il est destiné à s'agrandir en fonction de mes découvertes.
Liste des ponts
$page->body->h2->a, "fich" => $info["filename"]);
}
}
}
// Trie alphabétiquement la liste
asort($liste);
// Afficher le nombre de pont
echo "\tLa collection possède " . count($liste) . " ponts :
\n";
// Début de liste et parcourir la liste des ponts
echo "\t\n";
foreach ($liste as $pont)
// créer les balises HTML pour mettre en place chaque élément de la liste de liens utiles
printf("\t\t- %s
\n", $pont["fich"], $pont["nom"]);
// Fin de la liste
echo "\t
\n";
?>
++++