Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
scrutaridata:exportapi:php [2010/02/11 19:50] vincentscrutaridata:exportapi:php [2016/09/21 18:19] (Version actuelle) vincent
Ligne 1: Ligne 1:
 ====== Implémentation de l'API en PHP ====== ====== Implémentation de l'API en PHP ======
  
-L'implémentation de l'API se présente sous la forme d'une série de fichiers correspondant chacun à une classe PHP. Toutes les classes et les constantes commencent par le préfixe **SED_** afin de minimiser le risque de conflits de noms avec d'autres classes PHPCes classes sont toutes présentes dans un même répertoire appelé //ScrutariDataExportLib//. Cette implémentation fonctionne avec PHP 5Elle est sous licence GPL v2.+L'implémentation de l'API se présente sous la forme d'un fichier unique qui comprend les différentes classes de l'API ainsi que des classes utilitairesLa dernière version stable de ce fichier est disponible à cette adresse : http://dataexport.scrutari.net/impl/php/scrutaridataexport.txt (remplacez .txt par .php pour l'exécution)
  
-  Répertoire //ScrutariDataExportLib// compressé : [[http://dataexport.scrutari.net/impl/php/ScrutariDataExportLib.zip]]+Toutes les classes et constantes de ce fichier commence par le suffixe **SDE_** afin de minimiser le risque de conflits de noms avec d'autres classes PHPCette implémentation fonctionne avec PHP 5Elle est sous licence MIT.
  
-===== Utilisation de l'implémentation =====+Ces scripts sont accessibles avec Git via https://framagit.org/Scrutari/export-php
  
-Pour utiliser cette implémentation, il suffit de décompresser l'archive et de faire appel au fichier //class-ScrutariDataExport.php// dans son code PHP, ce fichier se charge d'inclure tous les autres fichiers PHP de l'implémentation.+Un autre accès avec Subversion :
  
-Tous les fichiers reprennent les noms de classe de l'API à l'exception du fichier ''class-XmlWriter.php'' qui définit la classe ''SED_XmlWriter''. C'est une instance de cette classe qu'il faut créer tout d'abord pour indiquer la destination du code XML qui va être produitLa classe ''SED_XmlWriter'' possède un constructeur qui prend comme unique argument un pointeur vers un fichier (construit avec la fonction PHP //file()//)Si la valeur nulle est transmise au constructeur, le code XML sera renvoyé vers la sortie standard (fonction //echo//).+  svn co http://depot.exemole.fr/svn/web/apps/scrutari.net/php
  
-L'instance de ''SED_XmlWriter'' est alors passé en argument au constructeur de la classe ''SED_ScrutariDataExport'' (fichier //class-ScrutariDataExport.php//). Ensuite, le comportement est celui indiqué dans l'API. 
  
-===== Exemple d'Utilisation =====+===== Exemple du site www.comedie.org ===== 
 + 
 +L'exemple suivant est celui du site www.comedie.org. Celui-ci est en Wordpress. La structure des données de Wordpress étant assez simple, il a été choisi d'écrire un script interrogeant directement les données de la base MySQl plutôt que de passer par une procédure plus lourde d'extension Wordpress. 
 + 
 +Outre le fichier scrutaridataexport.php, cette extraction est basé sur deux fichiers : comedie.scrutari-data.php qui comprend la configuration de l'accès (voir http://dataexport.scrutari.net/impl/php/comedie.scrutari-data.txt et ci-dessous) et comedie.php qui comprend l'extraction proprement dite (voir http://dataexport.scrutari.net/impl/php/comedie.txt). 
 + 
 +=== Fichier comedie.scrutari-data.php === 
 + 
 +Ce fichier contient les informations de la configuration (accès à la base de données).
  
 <code php> <code php>
-/* Chargement de la bibliothèque ScrutariDataExportLib +<?php 
-*+//Indication que les données transmises sont du XML 
-require_once("/home/vic/dev/php/ScrutariDataExportLib/class-ScrutariDataExport.php");+header("content-type: text/xml;charset=UTF-8");
  
- /* Ouverture d'un fichier en écriture +// Nom de la base de données de WordPress. 
- *+define('DB_NAME''*');
-$file = fopen("test.scrutari-data.xml""w");+
  
- /* Construction d'une instance SED_XmlWriter +// Utilisateur de la base de données MySQL. 
- Pour que le code XML s'affiche dans la sortie standardon écrirait $xmlWriter = new SED_XmlWriter(NULL); +define('DB_USER', '*');
- *+
-$xmlWriter = new SED_XmlWriter($file);+
  
-/* On inclus préalablement la déclaration XML : <?xml version="1.0" encoding="UTF-8"?> +// Mot de passe de la base de données MySQL
-(méthode hors API) +define('DB_PASSWORD', '*');
-*+
-$xmlWriter->appendDeclaration();+
  
-/* Construction d'une instance de SED_ScrutariDataExport qui suit l'API de ScrutariDataExport +// Adresse de l'hébergement MySQL. 
-*/ +define('DB_HOST', 'localhost');
-$scrutariDataExport = new SED_ScrutariDataExport($xmlWriter);+
  
-/* Début de l'export, $baseMetadataExport est une instance de SED_BaseMetadataExport +// Jeu de caractères à utiliser par la base de données 
-*/ +define('DB_CHARSET', 'utf8');
-$baseMetadataExport = $scrutariDataExport->startExport();+
  
-/* Définition des métadonnées de la base +// Chaine vide pour SCRUTARIDATA_PATHles données XML sont affichées directement en sortie 
-SED_INTITULE_SHORT correspond à la constante INTITULE_SHORT de l'API +define('SCRUTARIDATA_PATH''');
-*/ +
-$baseMetadataExport->setAuthorityUUID("e17a05b0-c45e-11d8-9669-0800200c9a66"); +
-$baseMetadataExport->setBaseName("test"); +
-$baseMetadataExport->setBaseIcon("http://monsite.net/icon-16x16pixels.png"); +
-$baseMetadataExport->setIntitule(SED_INTITULE_SHORT"fr", "Test"); +
-$baseMetadataExport->setIntitule(SED_INTITULE_SHORT, "en", "Test"); +
-$baseMetadataExport->setIntitule(SED_INTITULE_LONG"fr", "Test du format scrutariData"); +
-$baseMetadataExport->setIntitule(SED_INTITULE_LONG, "en", "ScrutariData Format Test"); +
-$baseMetadataExport->addLangUI("fr"); +
-$baseMetadataExport->addLangUI("en");+
  
-/* Insertion d'un corpus avec de nom « fiches » +// Appel de comedie.php 
-$corpusMetadataExport est une instance de SED_CorpusMetadataExport +require("comedie.php"); 
-*/ +</code>
-$corpusMetadataExport = $scrutariDataExport->newCorpus("fiches");+
  
-/* Définition des métadonnées du corpus +Si on avait voulu que l'extraction soit enregistrée dans un fichier, on aurait cette définition pour //SCRUTARIDATA_PATH// :
-*/ +
-$corpusMetadataExport->setCorpusType("EXP"); +
-$corpusMetadataExport->setIntitule(SED_INTITULE_CORPUS, "fr","Fiches d'expérience"); +
-$corpusMetadataExport->setIntitule(SED_INTITULE_FICHE, "fr", "Fiche d'expérience n° ");+
  
-/* Définition de deux champs complémentaires +<code php
-*/ +define('SCRUTARIDATA_PATH''/path/to/directory/comedie.scrutari-data.xml'); 
-$numero = $corpusMetadataExport->addComplement(); +</code>
-$corpusMetadataExport->setComplementIntitule($numero,"fr","Auteurs"); +
-$corpusMetadataExport->setComplementIntitule($numero,"en","Authors"); +
-$numero = $corpusMetadataExport->addComplement(); +
-$corpusMetadataExport->setComplementIntitule($numero,"fr","Organismes");+
  
-/* Premier exemple d'une fiche +=== Fichier comedie.php ===
-$ficheExport est une instance de SED_FicheExport +
-*/ +
-$ficheExport $scrutariDataExport->newFiche("1"); +
-$ficheExport->setTitre("Première fiche"); +
-$ficheExport->setDate("2006-03"); +
-$ficheExport->setFicheType("DOC"); +
-$ficheExport->setFicheIcon("http://monsite.net/icon2-16x16pixels.png"); +
-$ficheExport->addComplement(2,"Collectif");+
  
-/*Second exemple de fiche+Ce fichier (http://dataexport.scrutari.net/impl/php/comedie.txt) comprend plusieurs parties. 
 + 
 +Le fichier commence par l'appel à scrutaridataexport.php 
 + 
 +<code php> 
 +//Chargement de la bibliothèque ScrutariDataExport, supposée être dans le même répertoire que ce script 
 +require_once("scrutaridataexport.php"); 
 +</code> 
 + 
 +Vient ensuite la déclaration d'une classe utilitaire : 
 + 
 +<code php> 
 +/** 
 +* Recensement des posts Wordpress retenus pour l'extraction, avec indication du nom du corpus correspondant
 */ */
-$ficheExport = $scrutariDataExport->newFiche("2"); +class PostCensus {
-$ficheExport->setTitre("Seconde fiche"); +
-$ficheExport->setSoustitre("le sous titre"); +
-$ficheExport->setDate("2006-03"); +
-$ficheExport->setLang("fr"); +
-$ficheExport->setHref("http://monsite.net/ma-fiche-1.html"); +
-$ficheExport->addComplement(2,"L'ASSO"); +
-$ficheExport->addComplement(1,"Martin Dupont");+
  
-/* Exemple d'indexation : celle-ci peut de se faire à n'importe quel moment +    private $map; 
-même s'il ne s'agit du mot-clé ou de la fiche en cours ou que le thésaurus ou le corpus + 
-n'ont pas encore été définis.+    function __construct() { 
 +        $this->map = array(); 
 +    } 
 +     
 +    function put($id, $corpus) { 
 +        $this->map["id_".$id] = $corpus; 
 +    } 
 +     
 +    function get($id) { 
 +        return $this->map["id_".$id]; 
 +    } 
 + 
 +
 +</code> 
 + 
 +Puis la définit des fonctions. 
 + 
 +<code php> 
 +/** 
 +* Ajoute les posts appartenant à la catégorie indiquée par $termTaxonomyId, 
 +* ces posts étant destiné à être inclus dans le corpus de nom $corpusName
 */ */
-$scrutariDataExport->addIndexation("fiches", "1", "motscles", "A01",1);+function addPosts($pdo, $scrutariDataExport, $termTaxonomyId, $postCensus, $corpusName) { 
 +    $statement = $pdo->query('SELECT object_id FROM `wp_term_relationships` WHERE `term_taxonomy_id` = '.$termTaxonomyId); 
 +    $array = array(); 
 +    while ($row = $statement->fetch(PDO::FETCH_NUM)) { 
 +        $array[] = $row[0]; 
 +    } 
 +    foreach($array as $postId) { 
 +        $postStatement =  $pdo->query('SELECT * FROM `wp_posts` WHERE `ID` = '.$postId.AND post_status='publish'"); 
 +        $postRow = $postStatement->fetch(PDO::FETCH_ASSOC); 
 +        if ($postRow) { 
 +            $postCensus->put($postId$corpusName); 
 +              $titre = $postRow['post_title']; 
 +            $soustitre = ""; 
 +            $date = ""; 
 +            $auteurs = ""; 
 +            $publication_annee = ""; 
 +            $publication_auteur = ""; 
 +            $publication_editeur = ""; 
 +            $metaStatement =  $pdo->query('SELECT * FROM `wp_postmeta` WHERE `post_id` = '.$postId); //Interrogation de postmeta pour récupérer les données associées au post 
 +            $dateDone = false; 
 +            while($metaRow = $metaStatement->fetch(PDO::FETCH_ASSOC)) { 
 +                $metaKey = $metaRow['meta_key']; 
 +                $value = $metaRow['meta_value']; 
 +                 if ($metaKey == 'sous-titre') { 
 +                    $soustitre = $value; 
 +                } else if ($metaKey == 'annee_debut') { 
 +                    if ((!$dateDone) && (strlen($value) > 0)) { 
 +                        $date = $value; 
 +                    } 
 +                } else if ($metaKey == 'annee_creation') { 
 +                    if (strlen($value) > 0) { 
 +                        $date = $value; 
 +                        $dateDone = true; 
 +                    } 
 +                } else if ($metaKey == 'auteurs_plus') { 
 +                    $auteurs = $value; 
 +                } else if ($metaKey == 'publication_annee_publication') { 
 +                    $publication_annee = $value; 
 +                } else if ($metaKey == 'publication_auteur') { 
 +                    $publication_auteur = $value; 
 +                } else if ($metaKey == 'publication_editeur') { 
 +                    $publication_editeur = $value; 
 +                } 
 +            } 
 +            if ($corpusName == 'lecture') { //Traitement particulier au corpus des notes de lecture 
 +                $titre = "Note de lecture : ".$titre; //le titre étant celui de l'ouvrage, Note de lecture est ajouté avant 
 +                if (strlen($soustitre) > 0) { 
 +                    if (substr($titre, strlen($titre) -1,1) != ".") { 
 +                        $titre .= "."; 
 +                    } 
 +                    $titre .= " ".$soustitre; //le sous-titre étant celui de l'ouvrageil est placé à la suite du titre 
 +                    $soustitre = ""
 +                } 
 +                $soustitre = appendInfo($soustitre$publication_auteur); 
 +                $soustitre = appendInfo($soustitre, $publication_editeur); 
 +                $soustitre = appendInfo($soustitre, $publication_annee); 
 +            } 
 +            $ficheExport = $scrutariDataExport->newFiche($postId); 
 +            $ficheExport->setTitre($titre); 
 +            $ficheExport->setSoustitre($soustitre); 
 +            $ficheExport->setHref("http://www.comedie.org/?p=".$postId); 
 +            $ficheExport->setLang('fr'); 
 +            if (strlen($date) > 0) { 
 +                $ficheExport->setDate($date); 
 +            } 
 +            if (strlen($auteurs) > 0) { 
 +                parseAuteurs($auteurs$pdo, $ficheExport); 
 +            } 
 +        } 
 +    } 
 +}
  
-/* Insertion d'un thésaurus de nom « motscles » +/** 
-$thesaurusMetadataExport est une instance de SED_ThesaurusMetadataExport+* Ajoute $value à la fin de $text en rajoutant une virgule si nécessaire
 */ */
-$thesaurusMetadataExport = $scrutariDataExport->newThesaurus("motscles");+function appendInfo($text, $value) { 
 +    $value trim($value); 
 +    $value = str_replace(" ;", ",", $value); 
 +    if (substr($value, strlen($value) -1,1) == ".") { 
 +        $value = substr($value, 0, strlen($value) -1); 
 +    } 
 +    if (strlen($value) == 0) { 
 +        return $text; 
 +    } 
 +    if (strlen($text) > 0) { 
 +        $text .= ", "; 
 +    } 
 +    $text .= $value; 
 +    return $text; 
 +}
  
-/* Définition des métadonnées du thésaurus+/*
 +* Récupère le nom des auteurs d'un post. Sur le site comedie.org, les véritables auteurs d'un post sont indiqués 
 +* par meta_key=auteurs_plus dans la table wp_postmeta et sous la forme a:1:{i:0;s:2:"67";}. 67 est ici 
 +* l'identifiant du post correspondant à l'auteur (le nom complet de l'auteur est le titre du post)
 */ */
-$thesaurusMetadataExport->setIntitule(SED_INTITULE_THESAURUS,"fr","Mots-clés"); +function parseAuteurs($auteurs, $pdo, $ficheExport) { 
-$thesaurusMetadataExport->setIntitule(SED_INTITULE_THESAURUS,"en","Keywords");+    $idx1 = strpos($auteurs, "\""); 
 +    if ($idx1 < 1) { 
 +        return; 
 +    } 
 +    $idx2 = strpos($auteurs, "\"", $idx1 + 1); 
 +    if ($idx2 < 1) { 
 +        return; 
 +    } 
 +    $auteurId = substr($auteurs, $idx1 + 1, $idx2 - ($idx1 + 1)); 
 +    if ($auteurId == 572) { //l'auteur générique Comédie est ignoré 
 +        return; 
 +    } 
 +    $authorStatement = $pdo->query('SELECT post_title FROM `wp_posts` WHERE `ID` = '.$auteurId); 
 +    $auteur = $authorStatement->fetchColumn(); 
 +    if ($auteur) { 
 +        $ficheExport->addAttributeValue("sct", "authors", $auteur); 
 +    } 
 +}
  
-/* Exemple d'insertion d'un mot-clé au sein du thésaurus en cours+/*
 +* Ajoute les termes de la taxonomie $taxonomy sous la forme de mots-clés du thésaurus de nom $thesaurusName, 
 +* la fonction récupère également les posts liés au terme et crée une indexation si le post a bien été recensé 
 +* préalablement dans $postCensus
 */ */
-$motcleExport = $scrutariDataExport->newMotcle("1"); +function addTerms($pdo, $scrutariDataExport, $taxonomy, $postCensus, $thesaurusName) { 
-$motcleExport->setLibelle("fr","Eau");+    $statement = $pdo->query("SELECT wp_term_taxonomy.term_taxonomy_id, wp_terms.name  FROM wp_terms,wp_term_taxonomy WHERE wp_term_taxonomy.term_id = wp_terms.term_id AND wp_term_taxonomy.taxonomy = '".$taxonomy."'"); 
 +    $array = array(); 
 +    while ($row = $statement->fetch(PDO::FETCH_NUM)) { 
 +        $id = $row[0]; 
 +        $name = $row[1]; 
 +        if ((strlen($name) > 0) && (strpos($name, "MOT"!== 0)) { 
 +            $array[] = $id
 +            $motcleExport = $scrutariDataExport->newMotcle($id); 
 +            $motcleExport->setLibelle("fr", $name); 
 +        } 
 +    } 
 +    foreach($array as $termId) { 
 +        $postStatement = $pdo->query("SELECT object_id FROM wp_term_relationships WHERE term_taxonomy_id=".$termId); 
 +        while ($postId = $postStatement->fetchColumn(0)) { 
 +            $corpusName = $postCensus->get($postId); 
 +            if (strlen($corpusName) > 0) { 
 +                $scrutariDataExport->addIndexation($corpusName, $postId, $thesaurusName, $termId,1); 
 +            } 
 +        } 
 +    } 
 +
 +</code>
  
-/* Autre exemple d'insertion d'indexation n'importe où*/ +C'est alors que commmence l'initialisation avec l'utilisation des constantes définies dans comedie.scrutari-data.php pour l'accès aux données :
-$scrutariDataExport->addIndexation("fiches", "fiche2", "motscles", "A01",4);+
  
-/* L'indexation précédente n'a pas changé l'état de l'export, on travaille +<code php> 
-toujours sur le premier mot-clé */ +//Test si l'extraction est écrite dans un fichier ou directement vers la sortie 
-$motcleExport->setLibelle("en","Water");+$file = false; 
 +if (strlen(SCRUTARIDATA_PATH) 0) { 
 +    $file = fopen(SCRUTARIDATA_PATH, "w"); 
 +}
  
-/* Fin de l'export +//Accès à la base de données 
-*/ +$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHARSET, DB_USER, DB_PASSWORD);
-$scrutariDataExport->endExport();+
  
-/* Fermeture du fichier *+// Instance de PostCensus recensant les posts inclus dans l'extraction 
-fclose($file);+$postCensus = new  PostCensus(); 
 + 
 +// Instance de SDE_XmlWriter recensant les posts inclus dans l'extraction 
 +$xmlWriter = new SDE_XmlWriter($file, true, true); 
 +$scrutariDataExport = new SDE_ScrutariDataExport($xmlWriter);
 </code> </code>
 +
 +Vient ensuite l'extraction proprement dite avec la définition des méta-données, des corpus et thésaurus et les appels aux fonctions pour la récupération des données et la fin de l'extraction.
 +
 +<code php>
 +//Démarrage de l'export avec la définition des méta-données
 +$baseMetadataExport = $scrutariDataExport->startExport();
 +$baseMetadataExport->setAuthority("comedie.org");
 +$baseMetadataExport->setBaseName("site");
 +$baseMetadataExport->setBaseIcon("http://scrutari.coredem.info/comedie.png");
 +$baseMetadataExport->setIntitule(SDE_INTITULE_SHORT, "fr", "Comédie");
 +$baseMetadataExport->setIntitule(SDE_INTITULE_LONG, "fr", "Comédie - Concertation, participation et médiation appliquées à l’environnement et au territoire");
 +$baseMetadataExport->addLangUI("fr");
 +
 +//Création du corpus experience correspondant aux fiches de http://www.comedie.org/ressources/fiches-experiences/
 +$corpusMetadataExport = $scrutariDataExport->newCorpus("experience");
 +$corpusMetadataExport->setIntitule(SDE_INTITULE_CORPUS, "fr","Expériences");
 +$corpusMetadataExport->setIntitule(SDE_INTITULE_FICHE, "fr", "Expérience n°");
 +
 +//Ajout des posts des expériences (12 est l'identifiant du terme correspondant à la catégorie des expériences)
 +addPosts($pdo, $scrutariDataExport, 12, $postCensus, "experience");
 +
 +//Création du corpus monographie correspondant aux fiches de http://www.comedie.org/ressources/monographies/
 +$corpusMetadataExport = $scrutariDataExport->newCorpus("monographie");
 +$corpusMetadataExport->setIntitule(SDE_INTITULE_CORPUS, "fr","Monographies");
 +$corpusMetadataExport->setIntitule(SDE_INTITULE_FICHE, "fr", "Monographie n°");
 +
 +//Ajout des posts des monographies
 +addPosts($pdo, $scrutariDataExport, 15, $postCensus, "monographie");
 +
 +//Création du corpus video correspondant aux fiches de http://www.comedie.org/ressources/videos/
 +$corpusMetadataExport = $scrutariDataExport->newCorpus("video");
 +$corpusMetadataExport->setIntitule(SDE_INTITULE_CORPUS, "fr","Vidéos");
 +$corpusMetadataExport->setIntitule(SDE_INTITULE_FICHE, "fr", "Vidéo n°");
 +
 +//Ajout des posts des vidéos
 +addPosts($pdo, $scrutariDataExport, 18, $postCensus, "video");
 +
 +//Création du corpus lecture correspondant aux fiches de http://www.comedie.org/ressources/notes-de-lecture/
 +$corpusMetadataExport = $scrutariDataExport->newCorpus("lecture");
 +$corpusMetadataExport->setIntitule(SDE_INTITULE_CORPUS, "fr","Notes de lecture");
 +$corpusMetadataExport->setIntitule(SDE_INTITULE_FICHE, "fr", "Note de lecture n°");
 +
 +//Ajout des posts des notes de lecture
 +addPosts($pdo, $scrutariDataExport, 14, $postCensus, "lecture");
 +
 +//Création du thésaurus motcle
 +$thesaurusMetadataExport = $scrutariDataExport->newThesaurus("motcle");
 +$thesaurusMetadataExport->setIntitule(SDE_INTITULE_THESAURUS,"fr","Mots-clés");
 +
 +//Ajout des termes, les mots-clés sont distingués des autres termes par la taxonomie mots-clefs
 +addTerms($pdo, $scrutariDataExport, "mots-clefs", $postCensus, "motcle");
 +
 +//Fin de l'export
 +$scrutariDataExport->endExport();
 +</code>
 +
 +Ce script peut facilement être adapté à un autre site sous Wordpress. Les grandes différences d'un site à l'autre sont la façon avec laquelle les posts que l'on veut extraire sont distingués des autres. Ici, la sélection se fait grâce à des termes (table wp_term et wp_term_taxonomy) spécifique. 
 +
 +
 +
  
scrutaridata/exportapi/php.1265914216.txt.gz · Dernière modification : 2010/02/11 19:50 de vincent
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0