New file |
0,0 → 1,330 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Classe implémentant l'API d'eFlore Publications pour le projet Biblio bota. |
* |
* @see http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=EfloreApi01Publications |
* |
* @package eFlore/services |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version 1.0 |
* @copyright 1999-2011 Tela Botanica (accueil@tela-botanica.org) |
*/ |
// TODO : Config et Outils sont des classes statiques qui doivent poser des pb pour les tests... |
class Publications extends Commun{ |
|
protected $parametres; |
protected $ressources; |
private $Bdd; |
private $config; |
private $nbrePublications; |
private $masque_taxon; |
protected $service = 'publications'; |
|
public function __construct(Bdd $bdd = null, Array $config = null, Utilisateurs $utilisateurs = null, Url $url = null) { |
$this->Bdd = is_null($bdd) ? new Bdd() : $bdd; |
$this->UrlNavigation = is_null($url) ? new Url($this->config['url_service']) : $url; |
} |
|
public function consulter($ressources, $parametres) { |
|
$resultat = new ResultatService(); |
$this->parametres = $parametres; |
$this->ressources = $ressources; |
|
$this->definirValeurParDefautDesParametres(); |
$this->verifierParametres(); |
$this->recupererParametresMasque(); |
$this->chargerNbrePublicationsTotal(); |
|
$publications = $this->getPublications($this->masque_taxon); |
$resultat->corps = $this->formaterPublications($publications); |
|
return $resultat; |
} |
|
public function getPublications($cherche) { |
|
$depart = $this->parametres['navigation.depart']; |
$limite = $this->parametres['navigation.limite']; |
|
$tab_mots = preg_split('~ ~', $cherche, -1, PREG_SPLIT_NO_EMPTY); |
$sql = 'SELECT DISTINCT B_C_CRAI, B_C_NOMCOMPLET, B_C_ABREGE, ' . |
' B_F_NUMERO, B_F_TITRE, B_F_DATE, B_F_CRAICOLL, '. |
' B_SER_SOUSTITRE, '. |
' B_A_PAGEDEBUT, B_A_PAGEFIN, B_A_CRAIFASC, B_A_CRAISERIE, ' . |
' B_D_ID, B_D_LABEL, ' . |
' B_S_IDSTR, B_S_NOM, ' . |
' B_AS_LIBELLE, '. |
' biblio_serie.*, biblio_item.*, biblio_item_typlog.*, biblio_item_typphy.* '. |
'FROM biblio_item '. |
' LEFT JOIN biblio_aut_saisie ON (b_i_auteursaisie = b_as_id) '. |
' LEFT JOIN biblio_article ON (b_i_iditem = b_a_idart) '. |
' LEFT JOIN biblio_fasc ON '. |
' (B_F_CRAICOLL = B_A_CRAICOLL '. |
' AND B_F_CRAISERIE = B_A_CRAISERIE '. |
' AND B_F_NUMERO = B_A_CRAIFASC)' . |
' LEFT JOIN biblio_serie ON ' . |
' (b_f_craicoll = b_ser_craicoll ' . |
' AND b_f_craiserie = b_ser_idserie) '. |
' LEFT JOIN biblio_collection ON (b_ser_craicoll = b_c_crai) '. |
' LEFT JOIN biblio_str ON (B_C_LKSTR = B_S_IDSTR) '. |
' LEFT JOIN biblio_domaine_lier ON (b_i_iditem = b_dl_iditem) ' . |
' LEFT JOIN biblio_domaine ON (b_dl_iddom = b_d_id) ' . |
' LEFT JOIN biblio_item_typphy ON (b_i_typphy = b_ip_id) ' . |
' LEFT JOIN biblio_item_typlog ON (b_i_typlog = b_il_id) ' . |
' WHERE B_I_TYPLOG = 1 AND B_I_TYPPHY = 2 AND B_I_CACHER = 0 '. |
' AND B_D_ID = 1 '; |
|
foreach ($tab_mots as $mot) { |
$sql .= " AND (B_I_TITRE LIKE '%$mot%' ". |
" OR B_I_RESUMCLE LIKE '%$mot%' ". |
" OR B_I_COMMENT LIKE '%$mot%') "; |
} |
$sql .= 'ORDER BY B_I_AUTEURS LIMIT '.$depart.', '.$limite; |
|
$publications = $this->Bdd->recupererTous($sql); |
return $publications; |
} |
|
function formaterPublications($publications) { |
|
$resultats = array(); |
|
foreach($publications as $publication) { |
|
$id_a = $publication['B_I_IDITEM']; |
$titre = $publication['B_I_TITRE']; |
$auteurs = $publication['B_I_AUTEURS']; |
$geo = $publication['B_I_GEO']; |
$langue = $publication['B_I_LANGUE']; |
$resum = $publication['B_I_RESUMCLE']; |
$image = $publication['B_I_IMAGE']; |
$comment = $publication['B_I_COMMENT']; |
// Table Auteur Saisie |
$saisie = $publication['B_AS_LIBELLE']; |
// Table Domaine |
$domaine_id = $publication['B_D_ID']; |
$domaine_nom = $publication['B_D_LABEL']; |
// Table Collection |
$coll_nom = $publication['B_C_NOMCOMPLET']; |
$coll_abreviation = $publication['B_C_ABREGE']; |
// Table S�rie |
$serie_titre = $publication['B_SER_SOUSTITRE']; |
// Table Fascicule |
$craicoll = $publication['B_F_CRAICOLL']; |
$date = $publication['B_F_DATE']; |
$fascicule_titre = $publication['B_F_TITRE']; |
// Table Article |
$craifasc = $publication['B_A_CRAIFASC']; |
$craiserie = $publication['B_A_CRAISERIE']; |
$page_debut = $publication['B_A_PAGEDEBUT']; |
$page_fin = $publication['B_A_PAGEFIN']; |
// Table Structure |
$nomstr = $publication['B_S_NOM']; |
|
// Formatage de la chaine de publication |
$chainePublication = ""; |
if (isset($domaine_nom)) { |
$chainePublication .= '<span class="texte_inactif">['.$domaine_nom.']</span>'; |
} |
|
if (isset($auteurs)) { |
$chainePublication .= $auteurs; |
} |
|
if (isset($titre)) { |
$chainePublication .= " - <strong>$titre</strong>"; |
} |
|
if (isset($date)) { |
$chainePublication .= " - $date"; |
} |
|
if (isset($mots_cles)) { |
$chainePublication .= " - <em>$mots_cles</em>"; |
} |
|
if (isset($page_debut)) { |
$chainePublication .= ", p. $page_debut"; |
if (isset($page_fin)) { |
$chainePublication .= "- $page_fin"; |
} |
} |
|
if (isset($geo)) { |
$chainePublication .= " - Départ./Région : <em>$geo</em>"; |
} |
|
if (isset($structure)) { |
$chainePublication .= " - $structure"; |
} |
|
if (isset($coll_nom)) { |
$chainePublication .= ", $coll_nom"; |
} |
|
if (isset($craiserie)) { |
$chainePublication .= ", $craiserie"; |
} |
|
if (isset($lien)) { |
$chainePublication .= ", <a class=\"lien_ext\" href=\"$lien_url\">$fascicule_titre</a>"; |
} else { |
$chainePublication .= ", $fascicule_titre"; |
} |
|
if (isset($saisie_auteur)) { |
$chainePublication .= " - <span class=\"texte_inactif\">Saisie : $saisie_auteur - Art. n°$article_id</span>"; |
} |
|
$resultats[$id_a]['reference_html'] = $chainePublication; |
} |
|
$retour = array('entete' => $this->construireEntete(), 'resultats' => $resultats); |
return $retour; |
|
} |
|
private function definirValeurParDefautDesParametres() { |
if (isset($this->parametres['navigation.depart']) == false) { |
$this->parametres['navigation.depart'] = 0; |
} |
if (isset($this->parametres['navigation.limite']) == false) { |
$this->parametres['navigation.limite'] = 10; |
} |
} |
|
private function verifierParametres() { |
$erreurs = array(); |
|
if ($this->verifierValeurParametreNavigationDepart() == false) { |
$erreurs[] = "Le paramètre 'navigation.depart' doit possèder un valeur numérique."; |
} |
|
if ($this->verifierValeurParametreNavigationLimite() == false) { |
$erreurs[] = "Le paramètre 'navigation.limite' doit possèder un valeur numérique supérieure à 0."; |
} |
|
if (count($erreurs) > 0) { |
$message = implode('<br />', $erreurs); |
$code = RestServeur::HTTP_CODE_MAUVAISE_REQUETE; |
throw new Exception($message, $code); |
} |
} |
|
private function verifierValeurParametreNavigationDepart() { |
$depart = $this->parametres['navigation.depart']; |
$ok = is_numeric($depart) ? true : false; |
return $ok; |
} |
|
private function verifierValeurParametreNavigationLimite() { |
$limite = $this->parametres['navigation.limite']; |
$ok = (is_numeric($limite) && $limite != 0) ? true : false; |
return $ok; |
} |
|
private function recupererParametresMasque() { |
if (isset($this->parametres['masque.taxon'])) { |
$this->masque_taxon = $this->parametres['masque.taxon']; |
} else { |
$this->masque_taxon = ""; |
} |
} |
|
private function chargerNbrePublicationsTotal() { |
$tab_mots = preg_split('~ ~', $this->masque_taxon, -1, PREG_SPLIT_NO_EMPTY); |
$requete = 'SELECT COUNT(B_I_IDITEM) AS nbre '. |
'FROM biblio_item '. |
' LEFT JOIN biblio_aut_saisie ON (b_i_auteursaisie = b_as_id) '. |
' LEFT JOIN biblio_article ON (b_i_iditem = b_a_idart) '. |
' LEFT JOIN biblio_fasc ON '. |
' (B_F_CRAICOLL = B_A_CRAICOLL '. |
' AND B_F_CRAISERIE = B_A_CRAISERIE '. |
' AND B_F_NUMERO = B_A_CRAIFASC)' . |
' LEFT JOIN biblio_serie ON ' . |
' (b_f_craicoll = b_ser_craicoll ' . |
' AND b_f_craiserie = b_ser_idserie) '. |
' LEFT JOIN biblio_collection ON (b_ser_craicoll = b_c_crai) '. |
' LEFT JOIN biblio_str ON (B_C_LKSTR = B_S_IDSTR) '. |
' LEFT JOIN biblio_domaine_lier ON (b_i_iditem = b_dl_iditem) ' . |
' LEFT JOIN biblio_domaine ON (b_dl_iddom = b_d_id) ' . |
' LEFT JOIN biblio_item_typphy ON (b_i_typphy = b_ip_id) ' . |
' LEFT JOIN biblio_item_typlog ON (b_i_typlog = b_il_id) ' . |
' WHERE B_I_TYPLOG = 1 AND B_I_TYPPHY = 2 AND B_I_CACHER = 0 '. |
' AND B_D_ID = 1 '; |
foreach ($tab_mots as $mot) { |
$requete .= " AND (B_I_TITRE LIKE '%$mot%' ". |
" OR B_I_RESUMCLE LIKE '%$mot%' ". |
" OR B_I_COMMENT LIKE '%$mot%') "; |
} |
$resultats = $this->Bdd->recuperer($requete); |
$this->nbrePublications = (int) $resultats['nbre']; |
} |
|
private function construireEntete() { |
$entete = array('masque' => '', 'depart' => 0, 'limite' => 10, 'total' => 0); |
|
$entete['masque'] = $this->recupererMasque(); |
$entete['depart'] = (int) $this->parametres['navigation.depart']; |
$entete['limite'] = (int) $this->parametres['navigation.limite']; |
$entete['total'] = $this->nbrePublications; |
if ($hrefPrecedent = $this->recupererHrefPrecedent()) { |
$entete['href.precedent'] = $hrefPrecedent; |
} |
if ($hrefSuivant = $this->recupererHrefSuivant()) { |
$entete['href.suivant'] = $hrefSuivant; |
} |
|
return $entete; |
} |
|
private function recupererMasque() { |
$masqueEntete = ''; |
if ($this->masque_taxon) { |
$masqueEntete = "masque.taxon=$this->masque_taxon"; |
} |
return $masqueEntete; |
} |
|
private function recupererHrefPrecedent() { |
$departActuel = $this->parametres['navigation.depart']; |
$limite = $this->parametres['navigation.limite']; |
$departPrecedent = $departActuel - $limite; |
$url = null; |
if ($departPrecedent >= 0) { |
$url = $this->obtenirUrlNavigation($departPrecedent, $limite, array('masque.taxon' => $this->masque_taxon)); |
} |
return $url; |
} |
|
private function recupererHrefSuivant() { |
$departActuel = $this->parametres['navigation.depart']; |
$limite = $this->parametres['navigation.limite']; |
$departSuivant = $departActuel + $limite; |
|
$url = null; |
if ($departSuivant < $this->nbrePublications) { |
$url = $this->obtenirUrlNavigation($departSuivant, $limite, array('masque.taxon' => $this->masque_taxon)); |
} |
return $url; |
} |
|
private function obtenirUrlNavigation($depart, $limite, $parametresAdditionnels) { |
$parametres = array( |
'navigation.depart' => $depart, |
'navigation.limite' => $limite); |
|
if ($parametresAdditionnels != null) { |
$parametres = array_merge($parametres, $parametresAdditionnels); |
} |
$this->UrlNavigation->setRequete($parametres); |
$url = $this->UrlNavigation->getURL(); |
return $url; |
} |
} |
?> |