Changeset 42256 in spip-zone


Ignore:
Timestamp:
Nov 13, 2010, 3:22:57 PM (10 years ago)
Author:
eric@…
Message:

Finalisation du formulaire de recherche avec toutes les options nécessaires
Mise au point de l'onglet ajouter des plugins avec le même fonctionnement (un par un) qu'actuellement.

Location:
_plugins_/svp
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/svp/formulaires/charger_plugin.html

    r42244 r42256  
    3939                                                                </select>
    4040                                                        </li>
    41                                                         <li class="editer_mode obligatoire[(#ENV{erreurs}|table_valeur{mode}|oui) erreur]">
    42                                                                 <label for="mode">Mode (debug)</label>
    43                                                                 [<span class="erreur_message">(#ENV{erreurs}|table_valeur{mode})</span>]
    44                                                                 <select name="mode" id="mode">
    45                                                                         <option value="spip"[ (#ENV{mode}|=={spip}|oui)selected="selected"]>Recherche type SPIP</option>
    46                                                                         <option value="svp"[ (#ENV{mode}|=={svp}|oui)selected="selected"]>Recherche type SVP</option>
     41                                                        <li class="editer_doublon obligatoire[(#ENV{erreurs}|table_valeur{doublon}|oui) erreur]">
     42                                                                <label for="doublon"><:svp:label_critere_doublon:></label>
     43                                                                [<span class="erreur_message">(#ENV{erreurs}|table_valeur{doublon})</span>]
     44                                                                <select name="doublon" id="doublon">
     45                                                                        <option value="non"[ (#ENV{doublon}|=={non}|oui)selected="selected"]><:svp:option_doublon_non:></option>
     46                                                                        <option value="oui"[ (#ENV{doublon}|=={oui}|oui)selected="selected"]><:svp:option_doublon_oui:></option>
    4747                                                                </select>
    4848                                                        </li>
  • _plugins_/svp/formulaires/charger_plugin.php

    r42214 r42256  
    88        return array('phrase' => _request('phrase'),
    99                                'categorie' => _request('categorie'),
    10                                 'etat' => _request('etat'));
     10                                'etat' => _request('etat'),
     11                                'doublon' => _request('doublon'));
    1112}
    1213
     
    2122        $categorie = _request('categorie');
    2223        $etat = _request('etat');
    23         $mode = _request('mode');
     24        $doublon = (_request('doublon') == 'oui') ? true : false;
     25        $tri = ($phrase) ? 'score' : 'nom';
     26        $version_spip = $GLOBALS['spip_version_branche'].".".$GLOBALS['spip_version_code'];
    2427
    2528        // On recupere la liste des paquets:
     
    2831        // - compatible avec la version SPIP installee sur le site
    2932        // - et n'etant pas deja installes
    30         if ($mode == 'spip')
    31                 $plugins = svp_rechercher_plugins_spip($phrase, $categorie, $etat, false, svp_lister_plugins_installes());
    32         else
    33                 $plugins = svp_rechercher_plugins($phrase, $categorie, $etat, false, svp_lister_plugins_installes());
     33        // tries selon la methode choisie ou nom si pas de phrase fournie
     34        $plugins = svp_rechercher_plugins_spip($phrase, $categorie, $etat, $version_spip,
     35                                                                                        svp_lister_plugins_installes(), $doublon, $tri);
    3436
    3537        // Determination des messages de retour
  • _plugins_/svp/inc/svp_depoter.php

    r42244 r42256  
    568568// ----------------------- Recherches de plugins ---------------------------------
    569569
    570 function svp_rechercher_plugins_spip($phrase, $categorie, $etat, $doublons=false, $exclusions=array(), $version='') {
     570function svp_rechercher_plugins_spip($phrase, $categorie, $etat, $version_spip='', $exclusions=array(), $doublon=false, $tri='nom') {
    571571
    572572        include_spip('inc/rechercher');
     573       
    573574        $plugins = array();
     575        $scores = array();
     576        $resultats = array();
     577        $ids_paquets = array();
    574578
    575579        // On prepare l'utilisation de la recherche en base SPIP en la limitant aux tables spip_plugins
    576         // et spip_paquets
    577         $liste = liste_des_champs();
    578         $tables = array('plugin' => $liste['plugin'], 'paquet' =>$liste['paquet']);
    579         $options = array('jointures' => true, 'score' => true);
    580 
    581         // On cherche dans tous les enregistrements de ces tables des correspondances les plugins qui
    582         // correspondent a la phrase recherchee
    583         // -- On obtient une liste d'id de plugins et d'id de paquets
    584         $resultats = recherche_en_base($phrase, $tables, $options);
    585         // -- On prepare le tableau des scores avec les paquets trouves par la recherche
    586         $scores = array();
    587         foreach ($resultats['paquet'] as $_id => $_score) {
    588                 $scores[$_id] = intval($resultats['paquet'][$_id]['score']);
    589         }
    590         // -- On convertit les id de plugins en id de paquets
    591         $ids_plugin = array_keys($resultats['plugin']);
    592         $where[] = sql_in('id_plugin', $ids_plugin);
    593         $ids = sql_allfetsel('id_paquet, id_plugin', 'spip_paquets', $where);
    594         // -- On merge les deux tableaux de paquets sans doublon en mettant a jour un tableau des scores
    595         $ids_paquets = array_keys($resultats['paquet']);
    596         foreach ($ids as $_ids) {
    597                 $id_paquet = intval($_ids['id_paquet']);
    598                 $id_plugin = intval($_ids['id_plugin']);
    599                 if (array_search($id_paquet, $ids_paquets) === false) {
    600                         $ids_paquets[] = $id_paquet;
    601                         $scores[$id_paquet] = intval($resultats['plugin'][$id_plugin]['score']);
    602                 }
    603                 else {
    604                         $scores[$id_paquet] = intval($resultats['paquet'][$id_paquet]['score'])
    605                                                                 + intval($resultats['plugin'][$id_plugin]['score']);
     580        // et spip_paquets  si elle n'est pas vide
     581        if ($phrase) {
     582                $liste = liste_des_champs();
     583                $tables = array('plugin' => $liste['plugin'], 'paquet' =>$liste['paquet']);
     584                $options = array('jointures' => true, 'score' => true);
     585       
     586                // On cherche dans tous les enregistrements de ces tables des correspondances les plugins qui
     587                // correspondent a la phrase recherchee
     588                // -- On obtient une liste d'id de plugins et d'id de paquets
     589                $resultats = recherche_en_base($phrase, $tables, $options);
     590                // -- On prepare le tableau des scores avec les paquets trouves par la recherche
     591                if ($resultats) {
     592                        foreach ($resultats['paquet'] as $_id => $_score) {
     593                                $scores[$_id] = intval($resultats['paquet'][$_id]['score']);
     594                        }
     595                        // -- On convertit les id de plugins en id de paquets
     596                        $ids_plugin = array_keys($resultats['plugin']);
     597                        $where[] = sql_in('id_plugin', $ids_plugin);
     598                        $ids = sql_allfetsel('id_paquet, id_plugin', 'spip_paquets', $where);
     599                        // -- On merge les deux tableaux de paquets sans doublon en mettant a jour un tableau des scores
     600                        $ids_paquets = array_keys($resultats['paquet']);
     601                        foreach ($ids as $_ids) {
     602                                $id_paquet = intval($_ids['id_paquet']);
     603                                $id_plugin = intval($_ids['id_plugin']);
     604                                if (array_search($id_paquet, $ids_paquets) === false) {
     605                                        $ids_paquets[] = $id_paquet;
     606                                        $scores[$id_paquet] = intval($resultats['plugin'][$id_plugin]['score']);
     607                                }
     608                                else {
     609                                        $scores[$id_paquet] = intval($resultats['paquet'][$id_paquet]['score'])
     610                                                                                + intval($resultats['plugin'][$id_plugin]['score']);
     611                                }
     612                        }
    606613                }
    607614        }
     
    609616        // Maintenant, on continue la recherche en appliquant, sur la liste des id de paquets,
    610617        // les filtres complementaires : categorie, etat, exclusions et compatibilite spip
     618        // si on a bien trouve des resultats precedemment ou si aucune phrase n'a ete saisie
    611619        // -- Preparation de la requete
    612         $from = array('spip_plugins AS t1', 'spip_paquets AS t2');
    613         $select = array('t1.nom AS nom', 't1.slogan AS slogan', 't1.prefixe AS prefixe',
    614                                         't2.id_paquet AS id_paquet', 't2.description AS description', 't2.version_spip AS version_spip',
    615                                         't2.auteur AS auteur', 't2.licence AS licence', 't2.etat AS etat',
    616                                         't2.logo AS logo', 't2.version AS version', 't2.id_paquet AS id_paquet');
    617         $where = array('t1.id_plugin=t2.id_plugin');
    618         if ($ids_paquets)
    619                 $where[] = sql_in('t2.id_paquet', $ids_paquets);
    620         if (($categorie) AND ($categorie != 'toute_categorie'))
    621                 $where[] = 't1.categorie=' . sql_quote($categorie);
    622         if (($etat) AND ($etat != 'tout_etat'))
    623                 $where[] = 't2.etat=' . sql_quote($etat);
    624         if ($exclusions)
    625                 $where[] = sql_in('t2.id_plugin', $exclusions, 'NOT');
    626 
    627         if ($resultats = sql_select($select, $from, $where)) {
    628                 while ($paquets = sql_fetch($resultats)) {
    629                         $prefixe = $paquets['prefixe'];
    630                         $version = $paquets['version'];
    631                         $nom = extraire_multi($paquets['nom']);
    632                         $slogan = extraire_multi($paquets['slogan']);
    633                         $description = extraire_multi($paquets['description']);
    634                         if (svp_verifier_compatibilite_spip($paquets['version_spip'])) {
    635                                 // Le paquet remplit tous les criteres, on peut le selectionner
    636                                 // -- on utilise uniquement la langue du site et on ajoute le score
    637                                 $paquets['nom'] = $nom;
    638                                 $paquets['slogan'] = $slogan;
    639                                 $paquets['description'] = $description;
    640                                 $paquets['score'] = $scores[intval($paquets['id_paquet'])];
    641                                 if ($doublons)
    642                                         // ajout systematique du paquet
    643                                         $plugins[] = $paquets;
    644                                 else {
    645                                         // ajout
    646                                         // - si pas encore trouve
    647                                         // - ou si sa version est inferieure (on garde que la derniere version)
    648                                         if (!$plugins[$prefixe]
    649                                         OR ($plugins[$prefixe] AND spip_version_compare($plugins[$prefixe]['version'], $version, '<'))) {
    650                                                 $plugins[$prefixe] = $paquets;
     620        if (!$phrase OR $resultats) {
     621                $from = array('spip_plugins AS t1', 'spip_paquets AS t2', 'spip_depots AS t3');
     622                $select = array('t1.nom AS nom', 't1.slogan AS slogan', 't1.prefixe AS prefixe',
     623                                                't2.id_paquet AS id_paquet', 't2.description AS description', 't2.version_spip AS version_spip',
     624                                                't2.auteur AS auteur', 't2.licence AS licence', 't2.etat AS etat',
     625                                                't2.logo AS logo', 't2.version AS version', 't2.nom_archive AS nom_archive',
     626                                                't3.url_paquets AS url_paquets', );
     627                $where = array('t1.id_plugin=t2.id_plugin', 't2.id_depot=t3.id_depot');
     628                if ($ids_paquets)
     629                        $where[] = sql_in('t2.id_paquet', $ids_paquets);
     630                if (($categorie) AND ($categorie != 'toute_categorie'))
     631                        $where[] = 't1.categorie=' . sql_quote($categorie);
     632                if (($etat) AND ($etat != 'tout_etat'))
     633                        $where[] = 't2.etat=' . sql_quote($etat);
     634                if ($exclusions)
     635                        $where[] = sql_in('t2.id_plugin', $exclusions, 'NOT');
     636       
     637                if ($resultats = sql_select($select, $from, $where)) {
     638                        while ($paquets = sql_fetch($resultats)) {
     639                                $prefixe = $paquets['prefixe'];
     640                                $version = $paquets['version'];
     641                                $nom = extraire_multi($paquets['nom']);
     642                                $slogan = extraire_multi($paquets['slogan']);
     643                                $description = extraire_multi($paquets['description']);
     644                                if (svp_verifier_compatibilite_spip($paquets['version_spip'], $version_spip)) {
     645                                        // Le paquet remplit tous les criteres, on peut le selectionner
     646                                        // -- on utilise uniquement la langue du site
     647                                        $paquets['nom'] = $nom;
     648                                        $paquets['slogan'] = $slogan;
     649                                        $paquets['description'] = $description;
     650                                        // -- on ajoute le score si on a bien saisi une phrase
     651                                        if ($phrase)
     652                                                $paquets['score'] = $scores[intval($paquets['id_paquet'])];
     653                                        else
     654                                                $paquets['score'] = 0;
     655                                        // -- on construit l'url de l'archive
     656                                        $paquets['url_archive'] = dirname($paquets['url_paquets']) . '/' . $paquets['nom_archive'];
     657                                        if ($doublon)
     658                                                // ajout systematique du paquet
     659                                                $plugins[] = $paquets;
     660                                        else {
     661                                                // ajout
     662                                                // - si pas encore trouve
     663                                                // - ou si sa version est inferieure (on garde que la derniere version)
     664                                                if (!$plugins[$prefixe]
     665                                                OR ($plugins[$prefixe] AND spip_version_compare($plugins[$prefixe]['version'], $version, '<'))) {
     666                                                        $plugins[$prefixe] = $paquets;
     667                                                }
    651668                                        }
    652669                                }
    653670                        }
    654671                }
    655         }
    656        
    657         // On trie les tableau par score décroissant
    658         if ($doublons)
    659                 usort($plugins, 'svp_trier_par_score');
    660         else
    661                 uasort($plugins, 'svp_trier_par_score');
    662 
    663         return $plugins;
    664 }
    665 
    666 
    667 function svp_trier_par_score($p1, $p2){
    668        
    669         if ($p1['score'] == $p2['score'])
    670                 $retour = 0;
    671         else
    672                 $retour = ($p1['score'] < $p2['score']) ? 1 : -1;
    673 
    674         return $retour;
    675 }
    676 
    677 
    678 /**
    679  * Actualisation des plugins du depot uniquement. Sert aussi pour une premiere insertion
    680  *
    681  * @param string $phrase
    682  * @param string $categorie
    683  * @param string $etat
    684  * @param string $doublons
    685  * @param array $exclusions
    686  * @param string $version
    687  * @return array
    688  */
    689 
    690 // $version             => version SPIP affichee
    691 // $doublons    => indique si on accepte des doublons de plugins (meme prefixe, version differente)
    692 // $exclusions  => tableau d'id de plugin
    693 function svp_rechercher_plugins($phrase, $categorie, $etat, $doublons=false, $exclusions=array(), $version='') {
    694 
    695         $plugins = array();
    696        
    697         // Selectionne les informations completes des paquets qui repondent aux criteres categorie, etat et exclusions
    698         // -- Preparation de la requete
    699         $from = array('spip_plugins AS t1', 'spip_paquets AS t2');
    700         $select = array('t1.nom AS nom', 't1.slogan AS slogan', 't1.prefixe AS prefixe',
    701                                         't2.description AS description', 't2.version_spip AS version_spip',
    702                                         't2.auteur AS auteur', 't2.licence AS licence', 't2.etat AS etat',
    703                                         't2.logo AS logo', 't2.version AS version', 't2.id_paquet AS id_paquet');
    704         $where = array('t1.id_plugin=t2.id_plugin');
    705         if (($categorie) AND ($categorie != 'toute_categorie'))
    706                 $where[] = 't1.categorie=' . sql_quote($categorie);
    707         if (($etat) AND ($etat != 'tout_etat'))
    708                 $where[] = 't2.etat=' . sql_quote($etat);
    709         if ($exclusions)
    710                 $where[] = sql_in('t2.id_plugin', $exclusions, 'NOT');
    711 
    712         // -- Controle des resultats avec la compatibilite SPIP et la phrase
    713         if ($resultats = sql_select($select, $from, $where)) {
    714                 // On normalise la phrase a chercher en une regexp utilisable
    715                 $phrase = svp_normaliser_phrase($phrase);
    716 
    717                 while ($paquets = sql_fetch($resultats)) {
    718                         $prefixe = $paquets['prefixe'];
    719                         $version = $paquets['version'];
    720                         $nom = extraire_multi($paquets['nom']);
    721                         $slogan = extraire_multi($paquets['slogan']);
    722                         $description = extraire_multi($paquets['description']);
    723                         if (svp_verifier_compatibilite_spip($paquets['version_spip'])
    724                         AND svp_rechercher_phrase($phrase, $nom, $slogan, $description, $score)) {
    725                                 // Le paquet remplit tous les criteres, on peut le selectionner
    726                                 // -- on utilise uniquement la langue du site et on ajoute le score
    727                                 $paquets['nom'] = $nom;
    728                                 $paquets['slogan'] = $slogan;
    729                                 $paquets['description'] = $description;
    730                                 $paquets['score'] = $score;
    731                                 if ($doublons)
    732                                         // ajout systematique du paquet
    733                                         $plugins[] = $paquets;
    734                                 else {
    735                                         // ajout
    736                                         // - si pas encore trouve
    737                                         // - ou si sa version est inferieure (on garde que la derniere version)
    738                                         if (!$plugins[$prefixe]
    739                                         OR ($plugins[$prefixe] AND spip_version_compare($plugins[$prefixe]['version'], $version, '<'))) {
    740                                                 $plugins[$prefixe] = $paquets;
    741                                         }
    742                                 }
    743                         }
    744                 }
     672               
     673                // On trie le tableau par score décroissant ou nom croissant
     674                $fonction = 'svp_trier_par_' . $tri;
     675                if ($doublon)
     676                        usort($plugins, $fonction);
     677                else
     678                        uasort($plugins, $fonction);
    745679        }
    746680       
     
    775709}
    776710
    777 function svp_rechercher_phrase($phrase, $nom, $slogan, $description, &$score){
    778         $trouve = false;
    779         $score = 0;
    780 
    781         if (!$phrase)
    782                 $trouve = true;
    783         else {
    784                 if (stripos($nom, $phrase) !== false)
    785                         $score += 8;
    786                 if (stripos($slogan, $phrase) !== false)
    787                         $score += 4;
    788                 if (stripos($description, $phrase) !== false)
    789                         $score += 2;
    790                 $trouve = ($score>0);
    791         }
    792         return $trouve;
    793 }
    794 
    795 function svp_verifier_compatibilite_spip($version){
     711
     712/**
     713 * Test de la compatibilite du plugin avec une version donnee de SPIP
     714 *
     715 * @return boolean
     716 */
     717function svp_verifier_compatibilite_spip($version, $version_spip) {
    796718        include_spip('inc/plugin');
    797         $version_spip = $GLOBALS['spip_version_branche'].".".$GLOBALS['spip_version_code'];
     719        if (!$version_spip)
     720                $version_spip = $GLOBALS['spip_version_branche'].".".$GLOBALS['spip_version_code'];
    798721        return plugin_version_compatible($version, $version_spip);
    799722}
    800723
    801 function svp_normaliser_phrase($phrase){
    802         return $phrase;
    803 }
    804 
     724
     725/**
     726 * Tri decroissant des resultats par score.
     727 * Cette fonction est appelee par un usort ou uasort
     728 *
     729 * @return int
     730 */
     731function svp_trier_par_score($p1, $p2){
     732        if ($p1['score'] == $p2['score'])
     733                $retour = 0;
     734        else
     735                $retour = ($p1['score'] < $p2['score']) ? 1 : -1;
     736        return $retour;
     737}
     738
     739
     740/**
     741 * Tri croissant des resultats par nom.
     742 * Si le nom est didentique on classe par version decroissante
     743 * Cette fonction est appelee par un usort ou uasort
     744 *
     745 * @return int
     746 */
     747function svp_trier_par_nom($p1, $p2){
     748        $c1 = strcasecmp($p1['nom'], $p2['nom']);
     749        if ($c1 == 0) {
     750                $c2 = spip_version_compare($p1['version'], $p1['version'], '<');
     751                $retour = ($c2) ? 1 : -1;
     752        }
     753        else
     754                $retour = ($c1 < 0) ? -1 : 1;
     755        return $retour;
     756}
    805757
    806758?>
  • _plugins_/svp/lang/svp_fr.php

    r42143 r42256  
    8989        'label_critere_phrase' => 'Rechercher des plugins',
    9090        'label_critere_categorie' => 'dans',
    91         'label_critere_etat' => 'et pour',
     91        'label_critere_etat' => 'pour',
     92        'label_critere_doublon' => 'et',
    9293        'label_fichier_depot' => 'Fichier des paquets du d&eacute;p&ocirc;t',
    9394        'label_modifier_depot' => 'Modifier le d&eacute;p&ocirc;t',
     
    130131        'onglet_plugins' => 'Rechercher un plugin',
    131132        'option_categorie_toute' => 'Toutes les cat&eacute;gories',
     133        'option_doublon_non' => 'La version la plus r&eacute;cente',
     134        'option_doublon_oui' => 'Toutes les versions compatibles',
    132135        'option_etat_tout' => 'Tous les &eacute;tats',
    133136
  • _plugins_/svp/modeles/charger_plugin.html

    r42244 r42256  
    22        [(#REM) <!-- Icone de telechargement -->]
    33        <div class="download">
     4                <a[ href="(#URL_ACTION_AUTEUR{charger_plugin, charger_zip,./}|parametre_url{url_zip_plugin, #ENV{url_archive}})"] title="<:plugin_charger:>">
     5                        [(#CHEMIN{images/telecharger-16.png}|balise_img{<:plugin_charger:>e})]
     6                </a>
    47        </div>
    58
Note: See TracChangeset for help on using the changeset viewer.