Table des matières
Implémentation sur le site de la Coredem
L'implémentation en PHP est composé des éléments suivants :
- Un fichier fonctions.php qui comprend l'essentiel du code sous la forme d“une fonction principale et d'une classe d'accompagnement
- Une série de fichiers de langues pour gérer les libellés à traduire
- Quelques lignes de code PHP inclues dans un squelette Spip
Le fichier fonctions.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; } }
Les fichiers de langue
Ce sont des fichiers .ini chargé par la fonction parse_ini_file
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"
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.
$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); }