Différences
Ci-dessous, les différences entre deux révisions de la page.
clients:impl:php_coredem [2012/02/02 19:34] vincent |
clients:impl:php_coredem [2013/04/05 17:12] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== 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 ===== | ||
- | |||
- | <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)) { | ||
- | $motcleCount = count($codemotcleArray); | ||
- | $codemotcleArray = $fiche['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>'."\n"; | ||
- | } | ||
- | $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_def,msoustitre_def,mcomplements_def,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> | ||