Browse Source

Boîtes privées/Les tris d’auteurs : fonctionne désormais sur champ 'ordre' sous SPIP>=2.1

+ MAJ de ce champ en base pour tous les articles ayant 2 auteurs ou plus.
svn/attic/couteau_suisse/118435
patfr@ifrance.com 9 years ago
parent
commit
6ca6b1bdc6
  1. 2
      config_outils.php
  2. 6
      couteau_suisse_administrations.php
  3. 6
      formulaires/tri_auteurs.html
  4. 9
      formulaires/tri_auteurs.php
  5. 66
      outils/boites_privees.php
  6. 21
      outils/boites_privees_action_rapide.php
  7. 4
      paquet.xml
  8. 4
      plugin.xml

2
config_outils.php

@ -583,7 +583,7 @@ add_outil( array(
'pipeline:affiche_droite' => 'boites_privees_affiche_droite',
'pipeline:affiche_gauche' => 'boites_privees_affiche_gauche',
// controle de la boucle AUTEURS afin de respecter l'ordre des auteurs stockes en base
'pipeline:pre_boucle' => defined('_SPIP30000')?'boites_privees_pre_boucle':'',
'pipeline:pre_boucle' => defined('_SPIP20100')?'boites_privees_pre_boucle':'',
'code:fonctions' => 'include_spip("outils/boites_privees");',
// Pour la constante _CS_RSS_SOURCE
# 'pipelinecode:pre_description_outil' => 'if($id=="boites_privees") include_spip("cout_define");',

6
couteau_suisse_administrations.php

@ -98,6 +98,12 @@ if(defined('_LOG_CS')) cs_log("cout_upgrade : $nom_meta_base_version => $version
cs_maj_forcee(array('masquer', 'jcorner'));
ecrire_meta($nom_meta_base_version, $current_version=$tmp);
}
if (cs_le_test($current_version, $tmp, '1.5')){
// nouveau champ 'ordre'
include_spip('outils/boites_privees');
tri_auteurs_verifie_table(true);
ecrire_meta($nom_meta_base_version, $current_version=$tmp);
}
ecrire_metas(); # Pour SPIP 1.92
}
}

6
formulaires/tri_auteurs.html

@ -1,6 +1,6 @@
#CACHE{0}
[(#REM)
formulaire utilisable sous SPIP v3.x mini
formulaire utilisable sous SPIP v2.1 mini
champs disponibles : objet (article a priori), id_objet
il faut 2 auteurs minimum
]
@ -18,8 +18,8 @@
<BOUCLE_aut1(AUTEURS){id_article=#ENV{id_objet}}{doublons}> </BOUCLE_aut1>
#SET{nb,#TOTAL_BOUCLE|plus{1}}
#SET{val,javascript:document.getElementsByName('bp_auteur')[0].value}
#SET{desc, #EVAL{chemin_image('tri-asc-16.png')}
#SET{mont, #EVAL{chemin_image('tri-desc-16.png')}
#SET{desc, #EVAL{defined('_SPIP30000')?chemin_image('tri-asc-16.png'):_DIR_IMG_PACK.'descendre-16.png'}}
#SET{mont, #EVAL{defined('_SPIP30000')?chemin_image('tri-desc-16.png'):_DIR_IMG_PACK.'monter-16.png'}}
<BOUCLE_art(ARTICLES){id_article=#ENV{id_objet}}{statut!='poubelle'}>
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="text-align:left">
<BOUCLE_aut2(AUTEURS){id_article=#ENV{id_objet}}>

9
formulaires/tri_auteurs.php

@ -34,7 +34,9 @@ function formulaires_tri_auteurs_traiter_dist($id_objet=0, $objet='article'){
$monter = _request('bp_auteur')>0;
include_spip('base/abstract_sql');
// liste des auteurs de l'article
$a = sql_allfetsel('id_auteur, ordre', 'spip_auteurs_liens', "objet='article' AND id_objet=$id_article", '', 'ordre');
$a = defined('_SPIP30000')
?sql_allfetsel('id_auteur, ordre', 'spip_auteurs_liens', "objet='article' AND id_objet=$id_article", '', 'ordre')
:sql_allfetsel('id_auteur, ordre', 'spip_auteurs_articles', "id_article=$id_article", '', 'ordre');
$c = count($a);
// recherche des auteurs a permuter
for($i=$j=0;$i<$c;$i++)
@ -44,8 +46,9 @@ function formulaires_tri_auteurs_traiter_dist($id_objet=0, $objet='article'){
$tmp = $a[$i]; $a[$i] = $a[$j]; $a[$j] = $tmp;
// mise a jour en base
// note : l'ordre est un nombre negatif, permettant aux auteurs ajoutes ulterieurement d'etre les derniers (ordre 0 par defaut)
for($i=0;$i<$c;$i++)
sql_update('spip_auteurs_liens', array('ordre'=>$i-$c), "objet='article' AND id_objet=$id_article AND id_auteur=".$a[$i]['id_auteur']);
for($i=0;$i<$c;$i++) defined('_SPIP30000')
?sql_update('spip_auteurs_liens', array('ordre'=>$i-$c), "objet='article' AND id_objet=$id_article AND id_auteur=".$a[$i]['id_auteur'])
:sql_update('spip_auteurs_articles', array('ordre'=>$i-$c), "id_article=$id_article AND id_auteur=".$a[$i]['id_auteur']);
include_spip('inc/invalideur');
suivre_invalideur("id='$objet/$id_objet'");

66
outils/boites_privees.php

@ -21,12 +21,7 @@ if(!defined('_SPIP19300')) {
// cette fonction appelee automatiquement a chaque affichage de la page privee du Couteau Suisse renvoie un tableau
function boites_privees_installe_dist(){
if(defined('_SPIP30000') && defined('boites_privees_TRI_AUTEURS')) {
include_spip('base/abstract_sql');
// verifier que le champ 'ordre' est bien present, sinon on le cree
if(!sql_count(spip_query("SHOW COLUMNS FROM spip_auteurs_liens LIKE 'ordre'")))
spip_query("ALTER TABLE spip_auteurs_liens ADD ordre INT NOT NULL");
}
tri_auteurs_verifie_table(); // OPTIM : ne le faire qu'a l'activation de la lame ou de la boite ?
return false;
}
@ -96,26 +91,69 @@ function cs_pipeline_boite_privee(&$flux, $endroit) {
return $flux;
}
// pipeline utilise sous SPIP>=3, histoire de respecter l'ordre de stockage des auteurs d'objets
// pipeline utilise sous SPIP>=2.1, histoire de respecter l'ordre de stockage des auteurs d'objets
function boites_privees_pre_boucle($flux) {
if(defined('boites_privees_TRI_AUTEURS') && $flux->type_requete=='auteurs'
&& count($L1 = $flux->join) && count($w = &$flux->where)>1 && $w[0][0]=="'='" && $w[1][0]=="'='") {
$L1 = array_keys($L1); // alias de la jointure
$flux->order[] = 'sqlfield_auteurs_objet('.$w[0][2].','.$w[1][2].','._q($L1[0]).','._q($flux->serveur).')';
}
if(!defined('boites_privees_TRI_AUTEURS') || $flux->type_requete!='auteurs'
|| !count($L1 = $flux->join) || !count($w = &$flux->where)>1) return $flux;
// alias de la jointure
$L1 = array_keys($L1);
if(defined('_SPIP30000')) {
if($w[0][0]=="'='" && $w[1][0]=="'='")
// SPIP v3 : 2 liens (sur objet et id_objet)
$flux->order[] = 'tri_auteurs_sqlfield('.$w[0][2].','.$w[1][2].','._q($L1[0]).','._q($flux->serveur).')';
} elseif($w[0][0]=="'='")
// SPIP v2.1 : 1 lien (sur id_article)
$flux->order[] = 'tri_auteurs_sqlfield('.$w[0][2].',\'article\','._q($L1[0]).','._q($flux->serveur).')';
return $flux;
}
// function listant les auteurs d'un objet, tries suivant le champ 'ordre'
function sqlfield_auteurs_objet($id_objet, $type_objet, $alias, $serveur) {
function tri_auteurs_sqlfield($id_objet, $type_objet, $alias, $serveur) {
static $res = array();
if(!isset($r[$i = "$id_objet,$type_objet,$serveur"])) {
$t = sql_allfetsel('id_auteur','spip_auteurs_liens', "(objet=$type_objet) AND (id_objet = $id_objet)", '','ordre','','',$serveur);
$t = defined('_SPIP30000')
?sql_allfetsel('id_auteur','spip_auteurs_liens', "(objet='$type_objet') AND (id_objet = $id_objet)", '','ordre','','',$serveur)
:sql_allfetsel('id_auteur','spip_auteurs_articles', "id_article = $id_objet", '','ordre','','',$serveur);
$r[$i] = count($t)>1?'FIELD('.$alias.'.id_auteur,'.join(array_map('reset', $t), ',').')':'';
}
return $r[$i];
}
// verifier que le champ 'ordre' est bien present dans la table des liens, sinon on le cree
// cette fonction ($complet=true) permet egalement une mise a jour en cas de creation du champ 'ordre' sur un site existant
function tri_auteurs_verifie_table($complet=false) {
global $metas_outils;
if(!defined('_SPIP20100') || //!defined('boites_privees_TRI_AUTEURS')) return;
!isset($metas_outils['boites_privees']['actif']) || !$metas_outils['boites_privees']['actif']) return;
include_spip('base/abstract_sql');
$table = defined('_SPIP30000')?'spip_auteurs_liens':'spip_auteurs_articles';
if(!sql_count(spip_query("SHOW COLUMNS FROM $table LIKE 'ordre'")))
spip_query("ALTER TABLE $table ADD ordre INT NOT NULL");
if($complet) {
// mise a jour du champ 'ordre' pour les articles a plusieurs auteurs et n'ayant jamais ete tries grace a ce champ
if(defined('_SPIP30000')) {
$q1 = sql_select('id_objet, COUNT(*) as nb', $table, "objet='article' AND ordre=0", 'id_objet', '','', "nb>1");
while($r1 = sql_fetch($q1)) {
$q2 = sql_select('id_auteur', $table, "objet='article' AND ordre=0 AND id_objet=".$r1['id_objet']);
$j = $r1['nb'] + 999; $i = 0;
while($r2 = sql_fetch($q2))
sql_update($table, array('ordre'=>$i++ - $j),
"objet='article' AND ordre=0 AND id_objet=$r1[id_objet] AND id_auteur=".$r2['id_auteur']);
}
} else {
$q1 = sql_select('id_article, COUNT(*) as nb', $table, "ordre=0", 'id_article', '','', "nb>1");
while($r1 = sql_fetch($q1)) {
$q2 = sql_select('id_auteur', $table, "ordre=0 AND id_article=".$r1['id_article']);
$j = $r1['nb'] + 999; $i = 0;
while($r2 = sql_fetch($q2))
sql_update($table, array('ordre'=>$i++ - $j),
"ordre=0 AND id_article=$r1[id_article] AND id_auteur=".$r2['id_auteur']);
}
}
} // $complet
}
function cs_boite_rss() {
include_spip('inc/autoriser');
if (!defined('boites_privees_CS') || !autoriser('configurer','csinfosrss')) return '';

21
outils/boites_privees_action_rapide.php

@ -6,10 +6,10 @@ module mon_outil_action_rapide.php inclu :
- apres l'appel de ?exec=action_rapide&arg=boites_privees|argument
*/
if(defined('_SPIP30000')) {
if(defined('_SPIP20100')) {
// Nouveaute SPIP 2.1 : se baser sur un nouveau champ 'ordre' de la table spip_auteurs_liens
// Fonction qui affiche le formulaire CVT triant les auteurs d'un article :
// Nouveauté SPIP 3 : se baser sur un nouveau champ 'ordre' de la table spip_auteurs_liens
function action_rapide_tri_auteurs($id_article=0) {
return cadre_depliable(find_in_path('img/couteau-24.gif'),
cs_div_configuration().'<b>'._T('couteau:tri_auteurs').'</b>',
@ -71,9 +71,7 @@ if(defined('_SPIP30000')) {
$monter = _request('bp_auteur')>0;
if(!defined('_SPIP19300')) include_spip('outils/boites_privees'); // pour les fonctions SQL
$s = defined('_SPIP30000')
?sql_select('id_auteur', 'spip_auteurs_liens', "objet='article' AND id_objet=$id_article")
:sql_select('id_auteur', 'spip_auteurs_articles', "id_article=$id_article");
$s = sql_select('id_auteur', 'spip_auteurs_articles', "id_article=$id_article");
$i=0; $j=0;
while ($a = sql_fetch($s)) {
if($a['id_auteur']==$id_auteur) { $i = $a['id_auteur']; break; }
@ -83,16 +81,9 @@ if(defined('_SPIP30000')) {
if(!$monter && $i && ($a = sql_fetch($s))) $j = $a['id_auteur'];
spip_log("action_rapide_tri_auteurs, article $id_article : echange entre l'auteur $i et l'auteur $j");
if($i && $j) {
if(defined('_SPIP30000')) {
// SPIP >= 3.0
sql_update('spip_auteurs_liens', array('id_auteur'=>-99), "objet='article' AND id_objet=$id_article AND id_auteur=$i");
sql_update('spip_auteurs_liens', array('id_auteur'=>$i), "objet='article' AND id_objet=$id_article AND id_auteur=$j");
sql_update('spip_auteurs_liens', array('id_auteur'=>$j), "objet='article' AND id_objet=$id_article AND id_auteur=-99");
} else {
sql_update('spip_auteurs_articles', array('id_auteur'=>-99), "id_article=$id_article AND id_auteur=$i");
sql_update('spip_auteurs_articles', array('id_auteur'=>$i), "id_article=$id_article AND id_auteur=$j");
sql_update('spip_auteurs_articles', array('id_auteur'=>$j), "id_article=$id_article AND id_auteur=-99");
}
sql_update('spip_auteurs_articles', array('id_auteur'=>-99), "id_article=$id_article AND id_auteur=$i");
sql_update('spip_auteurs_articles', array('id_auteur'=>$i), "id_article=$id_article AND id_auteur=$j");
sql_update('spip_auteurs_articles', array('id_auteur'=>$j), "id_article=$id_article AND id_auteur=-99");
}
// action terminee, pret pour la redirection exec !
return;

4
paquet.xml

@ -1,11 +1,11 @@
<paquet
prefix="couteau_suisse"
categorie="maintenance"
version="1.8.83"
version="1.8.84"
etat="stable"
compatibilite="[1.9.2;3.0.99]"
logo="img/couteau-50.gif"
schema="1.4"
schema="1.5"
documentation="http://www.spip-contrib.net/Le-Couteau-Suisse"
>
<nom>&lt;multi>[en]Swiss Knife[fr]Le Couteau Suisse[ca]El Ganivet Su&#237;s[ar]&#1587;&#1603;&#1610;&#1606; &#1575;&#1604;&#1580;&#1610;&#1576;[nl]Het Zwitserland Mes[gl]A navalla su&#237;za[es]La Navaja Suiza[de]Schweizer Taschenmesser[tr]&#304;svi&#231;re &#199;ak&#305;s&#305;[br]Ar Gontell Suis[pt_br]Canivete Su&#237;&#231;o[ast]La Navaya Suiza[gl]A navalla su&#237;za[ro]Cu&#355;itul Elve&#355;ian[it]Coltellino Svizzero&lt;/multi></nom>

4
plugin.xml

@ -2,8 +2,8 @@
<nom><multi>[en]Swiss Knife[fr]Le Couteau Suisse[ca]El Ganivet Su&#237;s[ar]&#1587;&#1603;&#1610;&#1606; &#1575;&#1604;&#1580;&#1610;&#1576;[nl]Het Zwitserland Mes[gl]A navalla su&#237;za[es]La Navaja Suiza[de]Schweizer Taschenmesser[tr]&#304;svi&#231;re &#199;ak&#305;s&#305;[br]Ar Gontell Suis[pt_br]Canivete Su&#237;&#231;o[ast]La Navaya Suiza[gl]A navalla su&#237;za[ro]Cu&#355;itul Elve&#355;ian[it]Coltellino Svizzero</multi></nom>
<slogan>... ou plus de fonctionnalit&#233;s pour SPIP !</slogan>
<icon>img/couteau-50.gif</icon>
<version>1.8.83</version>
<version_base>1.4</version_base>
<version>1.8.84</version>
<version_base>1.5</version_base>
<auteur>Patrice Vanneufville
_ &#169; 2007-2012 - Distribu&#233; sous licence GPL
</auteur>

Loading…
Cancel
Save