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] – créée vincentclients:impl:php_coredem [2013/04/05 17:12] (Version actuelle) – modification externe 127.0.0.1
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 de vincent
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0