Différences

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

Lien vers cette vue comparative

Prochaine révision
Révision précédente
clients:impl:php_coredem [2012/02/02 18:21]
vincent créée
clients:impl:php_coredem [2013/04/05 17:12] (Version actuelle)
Ligne 8: Ligne 8:
  
  
 +===== Le fichier fonctions.php =====
 +
 +<code php>
 +<?php
 +
 +/*
 +* Fonction principale qui effectue la requête auprès du serveur Scrutari, récupère le résultat
 +* au format JSON et le traduit en HTML.
 +* La valeur de retour est une chaine.
 +* - $url : l'url du serveur Scrutari avec la barre oblique de fin (exemple : http://​sct1.scrutari.net/​sct/​coredem/​)
 +* - $query : la chaine avec les paramètres de recherche (sera concaténé avec $url sous la forme $url.'​JSON?'​.$query pour construire
 +* l'​interrogation auprès du serveur Scrutari), $query doit comprendre le paramètre type=q-fiche et doit également définir la langue
 +* de l'​interface avec le paramètre langui
 +*/
 +
 +function Sct_getResult($url,​ $query) {
 +
 +    ​
 +    /*
 +    * Récupération de la réponse JSON  sous forme de chaine et transformation sous la forme d'​objet PHP.
 +    * $obj est en fait un tableau, on pourrait récupérer $obj sous forme d'​objet avec json_decode(false)
 +    */
 +    $jsonString ​ = file_get_contents($url.'​JSON?'​.$query);​
 +    $obj = json_decode($jsonString,​ true);
 +    ​
 +    /*
 +    * $ficheSearchResult est l'​élément racine de l'​objet JSON
 +    * (ici, on ne fait pas de traitement d'​erreur,​ on suppose que $query est bien construit)
 +    */
 +    $ficheSearchResult = $obj['​ficheSearchResult'​];​
 +    ​
 +    /*
 +    * Récupération de la langue d'​interface et initialisation d'un tableau
 +    * avec les éléments d'​interface traduits
 +    */
 +    $langUi = $ficheSearchResult['​langUi'​];​
 +    $locArray = parse_ini_file("​scrutariloc_"​.$langUi."​.ini"​);​
 +    ​
 +    /*
 +    * Récupération des mots de la recherche tels qu'​envoyés au serveur Scrutari
 +    */
 +    $qSource = $ficheSearchResult['​qSource'​];​
 +    ​
 +    /*
 +    * Récupération du nombre de fiches dans le résultat
 +    * S'il est égal à 0, on arrête le traitement en retournant le message
 +    */
 +    $ficheCount = $ficheSearchResult['​ficheCount'​];​
 +    if ($ficheCount == 0) {
 +       ​return '<​h2>'​.$locArray["​sct_resultat_zero"​].$qSource.$locArray["​sct_finguillemet"​]."</​h2>";​
 +    }
 +    ​
 +    /*
 +    * Initialisation de la chaine à retourner et insertion de l'​entête
 +    */
 +    $resultString = "";​
 +    if ($ficheCount == 1)  {
 +        $resultString .= '<​h2>'​.$locArray["​sct_resultat_un"​].$qSource.$locArray["​sct_finguillemet"​]."</​h2>";​
 +    } else {
 +        $resultString .= '<​h2>'​.$ficheCount.'​ '​.$locArray["​sct_resultat_plusieurs"​].$qSource.$locArray["​sct_finguillemet"​]."</​h2>";​
 +    }
 +    ​
 +    /*
 +    * Insertion du lien vers la version ods, le chemin est construit avec l'​identifiant du résultat de la recherche ($ficheSearchResult['​qId'​])
 +    */
 +    $resultString .= '<​p><​a href="'​.$url.'​export/​result_'​.$ficheSearchResult['​qId'​].'​_'​.$langUi.'​.ods">'​.$locArray["​sct_lien_ods"​].'</​a></​p>';​
 +    ​
 +    /*
 +    * Création d'une instance de la classe Sct_FicheSearchResultWrapper qui permettre un certain nombre de traitement
 +    * sur le résultat. '​SCT_Marque'​ est le nom de la classe appliquée aux balises <​span>​ qui servent à surligner les termes
 +    * de la recherche
 +    */
 +    $sctFicheSearchResultWrapper = new Sct_FicheSearchResultWrapper($ficheSearchResult,​ '​SCT_Marque'​);​
 +
 +    /*
 +    * Récupération du tableau des groupes de fiches et itération
 +    */
 +    $ficheGroupArray = $ficheSearchResult['​ficheGroupArray'​];​
 +    $groupCount = count($ficheGroupArray);​
 +    for($i = 0; $i < $groupCount;​ $i++) {
 +        $ficheGroup = $ficheGroupArray[$i];​
 +        if (array_key_exists('​corpusClasse',​ $ficheGroup)) {
 +            $corpusClasse = $ficheGroup['​corpusClasse'​];​
 +            $resultString .= '<p class="​SCT_FicheGroup">';​
 +            $resultString .= $corpusClasse['​intitule'​];​
 +            $resultString .= '</​p>';​
 +        }
 +        $ficheArray = $ficheGroup['​ficheArray'​];​
 +        $count = count($ficheArray);​
 +        $resultString .= '<​ul class="​SCT_UL_Fiche">';​
 +        for($j = 0; $j < $count; $j++) {
 +            $fiche = $ficheArray[$j];​
 +            $codecorpus = $fiche['​codecorpus'​];​
 +            $resultString .= '<​li><​p class="​SCT_Fiche_Titre">';​
 +            if (array_key_exists('​icon',​ $fiche)) {
 +                $resultString .= '<​img src="'​.$fiche['​icon'​].'"​ class="​SCT_Fiche_Icon"/>';​
 +            }
 +            $resultString .= '<a href="'​.$fiche['​href'​].'">';​
 +            $resultString .= $sctFicheSearchResultWrapper->​concatWithSpan($fiche['​mtitre'​]);​
 +            $resultString .= '</​a></​p>';​
 +            if (array_key_exists('​msoustitre',​ $fiche)) {
 +                $resultString .= '<p class="​SCT_Fiche_Soustitre">';​
 +                $resultString .= $sctFicheSearchResultWrapper->​concatWithSpan($fiche['​msoustitre'​]);​
 +                $resultString .= '</​p>';​
 +            }
 +            $infoTech = "";​
 +            if (array_key_exists('​mcomplementArray',​ $fiche)) {
 +                $mcomplementArray = $fiche['​mcomplementArray'​];​
 +                $compCount = count($mcomplementArray);​
 +                for($k = 0; $k < $compCount; $k++) {
 +                    $mcomplement = $mcomplementArray[$k];​
 +                    $num = $mcomplement['​num'​];​
 +                    if ($k > 0) {
 +                        $infoTech .= ', ';
 +                    }
 +                    $infoTech .= $sctFicheSearchResultWrapper->​concatWithSpan($mcomplement['​mcomp'​]);​
 +                }
 +            }
 +            if (array_key_exists('​annee',​ $fiche)) {
 +                if (strlen($infoTech) > 0) {
 +                    $infoTech .= ' | ';
 +                }
 +                $infoTech .= $fiche['​annee'​];​
 +            }
 +            if (strlen($infoTech) > 0) {
 +                $resultString .= '<p class="​SCT_Fiche_Complement">';​
 +                $resultString .= $infoTech;
 +                $resultString .= '</​p>';​
 +            }
 +
 +            if (array_key_exists('​codemotcleArray',​ $fiche)) {
 +                $codemotcleArray = $fiche['​codemotcleArray'​];​
 +                $motcleCount = count($codemotcleArray);​
 +                $resultString .= '<p class="​SCT_Fiche_Motscles">';​
 +                $resultString .= '<​span class="​SCT_Intitule">';​
 +                if ($motcleCount == 1) {
 +                    $resultString .= $locArray['​sct_motscles_un'​];​
 +                } else {
 +                    $resultString .= $locArray['​sct_motscles_plusieurs'​];​
 +                }
 +                $resultString .= " ";
 +                $resultString .= '</​span>​ ';
 +                for($k = 0; $k < $motcleCount;​ $k++) {
 +                    if ($k > 0) {
 +                        $resultString .=  ', ';
 +                    }
 +                    $codemotcle = $codemotcleArray[$k];​
 +                    $resultString .= $sctFicheSearchResultWrapper->​getMotcleString($codemotcle);​
 +                }
 +                $resultString .= '</​p>';​
 +            }
 +            $resultString .= '</​li>';​
 +        }
 +        $resultString .= '</​ul>';​
 +    }
 +    return $resultString;​
 +}
 +
 + 
 + 
 +/**
 +* Objet encapsulant le résultat d'une recherche et proposant
 +* des fonctions utilitaires.
 +*/
 +class Sct_FicheSearchResultWrapper {
 + 
 +    var $corpusIntituleArray;​
 +    var $spanClass; //contenu de l'​attribut class des balises span
 +    var $motcleStringMap;​ //tableau associatif avec comme clé le code d'un mot-clé et comme valeur le libellé du mot-clé
 + 
 +    function __construct($ficheSearchResult,​ $spanClass) {
 +        $this->​corpusIntituleArray = $ficheSearchResult['​corpusIntituleArray'​];​
 +        $this->​spanClass = $spanClass;
 +        $this->​motcleStringMap = $this->​initMotcleStringMap($ficheSearchResult);​
 +    }
 + 
 +    /**
 +    * Retourne l'​intitulé du complément de numéro $compNum pour
 +    * le corpus de code $codecorpus
 +    */
 +    function getComplementIntitule($codecorpus,​ $compNum) {
 +        $intituleCount = count($this->​corpusIntituleArray);​
 +        for($i = 0; $i < $intituleCount;​ $i++) {
 +            $corpusIntitule = $this->​corpusIntituleArray[$i];​
 +            if ($corpusIntitule['​codecorpus'​] == $codecorpus) {
 +                return $corpusIntitule['​complement_'​.$compNum];​
 +            }
 +        }
 +        return "?";​
 +    }
 + 
 +    /**
 +    * $markedStringArray est un tableau qui contient soit des chaines soit des tableaux associatifs
 +    * comprenant une clé '​s'​ indiquant les chaines marquées. Ces dernières sont entourées d'une balise
 +    * span dont la classe est $spanClass
 +    */
 +    function concatWithSpan($markedStringArray) {
 +        $result = "";​
 +        $count = count($markedStringArray);​
 +        for($i = 0; $i < $count; $i++) {
 +            $obj = $markedStringArray[$i];​
 +            if (is_array($obj)) {
 +                $result .= '<​span class="'​.$this->​spanClass.'">';​
 +                $result .= $obj['​s'​];​
 +                $result .= '</​span>';​
 +            } else {
 +                $result .= $obj;
 +            }
 +        }
 +        return $result;
 +    }
 + 
 +    /**
 +    * Retourne le libellé du mot-clé de code $codemotcle
 +    */
 +    function getMotcleString($codemotcle) {
 +        return $this->​motcleStringMap[$codemotcle];​
 +    }
 + 
 +    /**
 +    * Initialisation du tableau associatif des codes de mots-clés et de lerus libellés
 +    */
 +    private function initMotcleStringMap($ficheSearchResult) {
 +        $motcleStringMap = array();
 +        if (!array_key_exists('​motcleArray',​ $ficheSearchResult)) {
 +            return $motcleStringMap;​
 +        }
 +        $motcleArray = $ficheSearchResult['​motcleArray'​];​
 +        $count = count($motcleArray);​
 +        for($i = 0; $i < $count; $i++) {
 +            $motcle = $motcleArray[$i];​
 +            $codemotcle = $motcle['​codemotcle'​];​
 +            $mlibelleArray = $motcle['​mlibelleArray'​];​
 +            $lib = "";​
 +            $libCount = count($mlibelleArray);​
 +            for($j = 0; $j < $libCount; $j++) {
 +                if ($j > 0) {
 +                    $lib .= "/";​
 +                }
 +                $mlib =$mlibelleArray[$j];​
 +                $lib .= $this->​concatWithSpan($mlib['​mlib'​]);​
 +            }
 +            $motcleStringMap[$codemotcle] = $lib;
 +        }
 +        return $motcleStringMap;​
 +    }
 + 
 +}
 +
 +</​code>​
 +
 +===== Les fichiers de langue =====
 +
 +Ce sont des fichiers .ini chargé par la fonction //​parse_ini_file//​
 +
 +<code php>
 +sct_motscles_un = "​Mot-clé :"
 +sct_motscles_plusieurs = "​Mots-clés :"
 +sct_deuxpoints = " :"
 +sct_resultat_zero = "Aucun résultat pour la recherche « "
 +sct_resultat_plusieurs = "​résultats pour la recherche « "
 +sct_resultat_un = "Un résultat pour la recherche « "
 +sct_finguillemet = " »."
 +sct_lien_ods = "​Récupérez l'​intégralité du résultat au format ODS"
 +</​code>​
 +
 +
 +===== Les lignes à inclure =====
 +
 +La langue de l'​interface est celle de la langue de Spip en cours. Les mots de la recherche sont indiqués par le paramètre //q// transmis à la recherche.
 +
 +**Note :** si vous effectuez une recherche sur le moteur scrutari de la Coredem, n'​oubliez pas de modifier la valeur de la variable //​$sct_site//,​ c'est la seule trace que conserve la Coredem sur l'​origine de la recherche. Si vous désirez que le moteur ne garde aucune trace de la recherche, ajoutez //&​log=0//​ à la fin //​$sct_query//​.
 +
 +
 +<​code ​ php>
 +$sct_lang = #LANG;
 +$sct_url = '​http://​sct1.scrutari.net/​sct/​coredem/';​
 +$sct_q = false;
 +if (isset($_REQUEST['​q'​])) {
 +    $sct_q = $_REQUEST['​q'​];​
 +}
 +if ($sct_q) {
 +    $sct_site = '​coredem';​ //​indication du site d'​origine de la recherche, à modifier avec une chaine identifiant l'​origine
 +    $sct_query = '​type=q-fiche&​fichefields=codecorpus,​mtitre,​msoustitre,​mcomplements,​annee,​href,​icon&​motclefields=mlibelles&​langui='​.$sct_lang.'&​intitules=complement&​q='​.urlencode($sct_q).'&​site='​.$sct_site;​
 +    include('​squelettes/​scrutari/​fonctions.php'​);​
 +    echo Sct_getResult($sct_url,​ $sct_query);​
 +}
 +
 +</​code>​
  
clients/impl/php_coredem.1328203277.txt.gz · Dernière modification: 2012/02/02 18:21 par vincent
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0