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 [2016/07/07 13:10] 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 **SDE_** 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 MIT.+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)
  
-Le répertoire //ScrutariDataExportLib// complet peut être téléchargé à cette adresse : [[http://dataexport.scrutari.net/impl/php/ScrutariDataExportLib.zip]] ou via le dépôt Subversion+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.
  
-  svn co http://depot.exemole.fr/svn/web/libs/ScrutariDataExportLib+Ces scripts sont accessibles avec Git via https://framagit.org/Scrutari/export-php
  
-===== Utilisation de l'implémentation =====+Un autre accès avec Subversion :
  
-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.+  svn co http://depot.exemole.fr/svn/web/apps/scrutari.net/php
  
-Tous les fichiers reprennent les noms de classe de l'API à l'exception du fichier ''class-XmlWriter.php'' qui définit la classe ''SDE_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 produit. La classe ''SDE_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//). 
  
-L'instance de ''SDE_XmlWriter'' est alors passé en argument au constructeur de la classe ''SDE_ScrutariDataExport'' (fichier //class-ScrutariDataExport.php//). Ensuite, le comportement est celui indiqué dans l'API.+===== Exemple du site www.comedie.org =====
  
-===== Exemple d'Utilisation =====+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>
 <?php <?php
-/* Chargement de la bibliothèque ScrutariDataExportLib+//Indication que les données transmises sont du XML 
 +header("content-type: text/xml;charset=UTF-8"); 
 + 
 +// Nom de la base de données de WordPress. 
 +define('DB_NAME', '*'); 
 + 
 +// Utilisateur de la base de données MySQL. 
 +define('DB_USER', '*'); 
 + 
 +// Mot de passe de la base de données MySQL. 
 +define('DB_PASSWORD', '*'); 
 + 
 +// Adresse de l'hébergement MySQL. 
 +define('DB_HOST', 'localhost'); 
 + 
 +// Jeu de caractères à utiliser par la base de données 
 +define('DB_CHARSET', 'utf8'); 
 + 
 +// Chaine vide pour SCRUTARIDATA_PATH, les données XML sont affichées directement en sortie 
 +define('SCRUTARIDATA_PATH', ''); 
 + 
 +// Appel de comedie.php 
 +require("comedie.php"); 
 +</code> 
 + 
 +Si on avait voulu que l'extraction soit enregistrée dans un fichier, on aurait cette définition pour //SCRUTARIDATA_PATH//
 + 
 +<code php> 
 +define('SCRUTARIDATA_PATH', '/path/to/directory/comedie.scrutari-data.xml'); 
 +</code> 
 + 
 +=== Fichier comedie.php === 
 + 
 +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
 */ */
-require_once("ScrutariDataExportLib/class-ScrutariDataExport.php");+class PostCensus {
  
- /* Ouverture d'un fichier en écriture +    private $map;
- */ +
-$file = fopen("test.scrutari-data.xml", "w");+
  
- /* Construction d'une instance SDE_XmlWriter +    function __construct() { 
- Pour que le code XML s'affiche dans la sortie standard, on écrirait $xmlWriter new SDE_XmlWriter(NULL); +        $this->map array(); 
- */ +    } 
-$xmlWriter new SDE_XmlWriter($file);+     
 +    function put($id, $corpus) { 
 +        $this->map["id_".$id] $corpus; 
 +    } 
 +     
 +    function get($id
 +        return $this->map["id_".$id]; 
 +    }
  
-/* On inclus préalablement la déclaration XML : <?xml version="1.0" encoding="UTF-8"?+
-(méthode hors API)+</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
 */ */
-$xmlWriter->appendDeclaration();+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'ouvrage, il 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); 
 +            } 
 +        } 
 +    } 
 +}
  
-/* Construction d'une instance de SDE_ScrutariDataExport qui suit l'API de ScrutariDataExport+/*
 +* Ajoute $value à la fin de $text en rajoutant une virgule si nécessaire
 */ */
-$scrutariDataExport new SDE_ScrutariDataExport($xmlWriter);+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ébut de l'export$baseMetadataExport est une instance de SDE_BaseMetadataExport+/*
 +* Récupère le nom des auteurs d'un post. Sur le site comedie.orgles 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)
 */ */
-$baseMetadataExport = $scrutariDataExport->startExport();+function parseAuteurs($auteurs, $pdo, $ficheExport) { 
 +    $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); 
 +    } 
 +}
  
-/* Définition des métadonnées de la base +/*
-SDE_INTITULE_SHORT correspond à la constante INTITULE_SHORT de l'API+* 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
 */ */
-$baseMetadataExport->setAuthority("e17a05b0-c45e-11d8-9669-0800200c9a66"); +function addTerms($pdo, $scrutariDataExport, $taxonomy, $postCensus, $thesaurusName) { 
-$baseMetadataExport->setBaseName("test"); +    $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."'"); 
-$baseMetadataExport->setBaseIcon("http://monsite.net/icon-16x16pixels.png"); +    $array = array(); 
-$baseMetadataExport->setIntitule(SDE_INTITULE_SHORT, "fr", "Test"); +    while ($row = $statement->fetch(PDO::FETCH_NUM)) { 
-$baseMetadataExport->setIntitule(SDE_INTITULE_SHORT, "en", "Test"); +        $id = $row[0]; 
-$baseMetadataExport->setIntitule(SDE_INTITULE_LONG, "fr", "Test du format scrutariData"); +        $name = $row[1]; 
-$baseMetadataExport->setIntitule(SDE_INTITULE_LONG, "en", "ScrutariData Format Test");+        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> 
 + 
 +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 : 
 + 
 +<code php> 
 +//Test si l'extraction est écrite dans un fichier ou directement vers la sortie 
 +$file = false; 
 +if (strlen(SCRUTARIDATA_PATH) > 0) { 
 +    $file = fopen(SCRUTARIDATA_PATH, "w"); 
 +
 + 
 +//Accès à la base de données 
 +$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHARSET, DB_USER, DB_PASSWORD); 
 + 
 +// Instance de PostCensus recensant les posts inclus dans l'extraction 
 +$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> 
 + 
 +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"); $baseMetadataExport->addLangUI("fr");
-$baseMetadataExport->addLangUI("en"); 
  
-/* Insertion d'un corpus avec de nom « fiches » +//Création du corpus experience correspondant aux fiches de http://www.comedie.org/ressources/fiches-experiences
-$corpusMetadataExport est une instance de SDE_CorpusMetadataExport +$corpusMetadataExport = $scrutariDataExport->newCorpus("experience"); 
-*+$corpusMetadataExport->setIntitule(SDE_INTITULE_CORPUS, "fr","Expériences"); 
-$corpusMetadataExport = $scrutariDataExport->newCorpus("fiches");+$corpusMetadataExport->setIntitule(SDE_INTITULE_FICHE, "fr", "Expérience n°");
  
-/* Définition des métadonnées du corpus +//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");
-$corpusMetadataExport->setIntitule(SDE_INTITULE_CORPUS"fr","Fiches d'expérience"); +
-$corpusMetadataExport->setIntitule(SDE_INTITULE_FICHE, "fr", "Fiche d'expérience n° ");+
  
-/* Définition de deux champs complémentaires +//Création du corpus monographie correspondant aux fiches de http://www.comedie.org/ressources/monographies
-*+$corpusMetadataExport = $scrutariDataExport->newCorpus("monographie"); 
-$numero = $corpusMetadataExport->addComplement(); +$corpusMetadataExport->setIntitule(SDE_INTITULE_CORPUS, "fr","Monographies"); 
-$corpusMetadataExport->setComplementIntitule($numero,"fr","Auteurs"); +$corpusMetadataExport->setIntitule(SDE_INTITULE_FICHE, "fr", "Monographie n°");
-$corpusMetadataExport->setComplementIntitule($numero,"en","Authors"); +
-$numero = $corpusMetadataExport->addComplement(); +
-$corpusMetadataExport->setComplementIntitule($numero,"fr","Organismes");+
  
-/* Premier exemple d'une fiche +//Ajout des posts des monographies 
-$ficheExport est une instance de SDE_FicheExport +addPosts($pdo, $scrutariDataExport, 15, $postCensus, "monographie");
-*+
-$ficheExport = $scrutariDataExport->newFiche("1"); +
-$ficheExport->setTitre("Première fiche"); +
-$ficheExport->setDate("2006-03"); +
-$ficheExport->setFicheIcon("http://monsite.net/icon2-16x16pixels.png"); +
-$ficheExport->addComplement(2,"Collectif");+
  
-/*Second exemple de fiche +//Création du corpus video correspondant aux fiches de http://www.comedie.org/ressources/videos
-*+$corpusMetadataExport = $scrutariDataExport->newCorpus("video"); 
-$ficheExport = $scrutariDataExport->newFiche("2"); +$corpusMetadataExport->setIntitule(SDE_INTITULE_CORPUS, "fr","Vidéos"); 
-$ficheExport->setTitre("Seconde fiche"); +$corpusMetadataExport->setIntitule(SDE_INTITULE_FICHE, "fr", "Vidéo n°");
-$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 +//Ajout des posts des vidéos 
-même s'il ne s'agit du mot-clé ou de la fiche en cours ou que le thésaurus ou le corpus +addPosts($pdo, $scrutariDataExport, 18$postCensus, "video");
-n'ont pas encore été définis. +
-*+
-$scrutariDataExport->addIndexation("fiches""1""motscles", "A01",1);+
  
-/* Insertion d'un thésaurus de nom « motscles » +//Création du corpus lecture correspondant aux fiches de http://www.comedie.org/ressources/notes-de-lecture
-$thesaurusMetadataExport est une instance de SDE_ThesaurusMetadataExport +$corpusMetadataExport = $scrutariDataExport->newCorpus("lecture"); 
-*+$corpusMetadataExport->setIntitule(SDE_INTITULE_CORPUS, "fr","Notes de lecture"); 
-$thesaurusMetadataExport = $scrutariDataExport->newThesaurus("motscles");+$corpusMetadataExport->setIntitule(SDE_INTITULE_FICHE, "fr", "Note de lecture n°");
  
-/* Définition des métadonnées du thésaurus +//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"); $thesaurusMetadataExport->setIntitule(SDE_INTITULE_THESAURUS,"fr","Mots-clés");
-$thesaurusMetadataExport->setIntitule(SDE_INTITULE_THESAURUS,"en","Keywords"); 
  
-/* Exemple d'insertion d'un mot-clé au sein du thésaurus en cours +//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");
-$motcleExport = $scrutariDataExport->newMotcle("1"); +
-$motcleExport->setLibelle("fr","Eau");+
  
-/* Autre exemple d'insertion d'indexation n'importe où*+//Fin de l'export 
-$scrutariDataExport->addIndexation("fiches", "fiche2", "motscles", "A01",4);+$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. 
  
-/* L'indexation précédente n'a pas changé l'état de l'export, on travaille 
-toujours sur le premier mot-clé */ 
-$motcleExport->setLibelle("en","Water"); 
  
-/* Fin de l'export 
-*/ 
-$scrutariDataExport->endExport(); 
  
-/* Fermeture du fichier */ 
-fclose($file); 
-</code> 
  
scrutaridata/exportapi/php.1467889842.txt.gz · Dernière modification : 2016/07/07 13:10 de vincent
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0