Browse Source

SPIP Bonux 3, pour SPIP 2.3dev, histoire de mieux voir ce qui est intégré actuellement, et de permettre des migrations d'autres plugins. Attention : plugin de transition, il risquera de disparaître au fil des intégrations diverses. Suppression de toutes les feuilles de styles présentes également.

svn/attic/spip-bonux-3/118152
marcimat@rezo.net 12 years ago
parent
commit
efd2d5eb4c
  1. 23
      .gitattributes
  2. 130
      configurer/pipelines.php
  3. 12
      connect/condition.php
  4. 12
      connect/pour.php
  5. 30
      demo/boucles_si.html
  6. 117
      demo/boucles_tableaux.html
  7. 10
      formulaires/recherche_ecrire.html
  8. 31
      formulaires/recherche_ecrire.php
  9. 1
      formulaires/selecteur/articles.html
  10. 19
      inc/config.php
  11. 196
      inc/core21_filtres.php
  12. 15
      modeles/pagination.html
  13. 16
      modeles/pagination_page.html
  14. 17
      modeles/pagination_prive.html
  15. 37
      plugin.xml
  16. 80
      prive/style_prive_plugin_bonux.html
  17. 23
      prive/style_prive_plugin_bonux_recherche.html
  18. 5
      prive/themes/spip/style_prive_bling.html
  19. 317
      public/spip_bonux_balises.php
  20. 65
      public/spip_bonux_criteres.php
  21. 547
      req/array.php
  22. 136
      spip20/inc/couleurs.php
  23. 957
      spip20/style_prive.html
  24. 395
      spip20/style_prive_formulaires.html
  25. 70
      spip21/inc/couleurs.php
  26. 965
      spip21/style_prive.html
  27. 395
      spip21/style_prive_formulaires.html
  28. 158
      spip_bonux_fonctions.php
  29. 6
      spip_bonux_options.php
  30. 122
      style_prive_plugins.html
  31. 10
      style_prive_plugins_fonctions.php

23
.gitattributes vendored

@ -1,12 +1,8 @@
* text=auto !eol
/ajax_item_pick.html -text
configurer/pipelines.php -text
connect/condition.php -text
connect/pour.php -text
demo/boucle_et_saut.html -text
demo/boucles_iterations.html -text
demo/boucles_si.html -text
demo/boucles_tableaux.html -text
demo/noeud.html -text
formulaires/dateur/datePicker.css -text
formulaires/dateur/dates.js -text
@ -15,8 +11,6 @@ formulaires/dateur/jquery.datePicker.js -text
formulaires/dateur/jquery.timePicker.js -text
formulaires/dateur/picker-16.gif -text
formulaires/dateur/timePicker.css -text
formulaires/recherche_ecrire.html -text
formulaires/recherche_ecrire.php -text
formulaires/selecteur/articles.html -text
formulaires/selecteur/inc-nav-articles.html -text
formulaires/selecteur/inc-nav-rubriques.html -text
@ -49,8 +43,6 @@ img_pack/tri_asc.png -text
img_pack/tri_desc-12.png -text
img_pack/tri_desc-16.png -text
img_pack/tri_desc-24.png -text
inc/config.php -text
inc/core21_filtres.php -text
inc/date_gestion.php -text
inc/exporter_csv.php -text
inc/importer_csv.php -text
@ -59,26 +51,11 @@ javascript/jquery.qtip.activate.js -text
lang/spip_bonux_ar.php -text
lang/spip_bonux_en.php -text
lang/spip_bonux_fr.php -text
modeles/pagination.html -text
modeles/pagination_noancre.html -text
modeles/pagination_page.html -text
modeles/pagination_prive.html -text
/plugin.xml -text
prive/style_prive_plugin_bonux.html -text
prive/style_prive_plugin_bonux_recherche.html -text
prive/themes/spip/style_prive_bling.html -text
public/spip_bonux_balises.php -text
public/spip_bonux_criteres.php -text
req/array.php -text
spip20/inc/couleurs.php -text
spip20/style_prive.html -text
spip20/style_prive_formulaires.html -text
spip21/inc/couleurs.php -text
spip21/style_prive.html -text
spip21/style_prive_formulaires.html -text
/spip_bonux_fonctions.php -text
/spip_bonux_options.php -text
/style_prive_plugins.html -text
/style_prive_plugins_fonctions.php -text
tests/balises/set_merge.html -text
tests/balises/set_push.html -text

130
configurer/pipelines.php

@ -1,6 +1,6 @@
<?php
/*
* Plugin xxx
* Plugin xxxz
* (c) 2009 xxx
* Distribue sous licence GPL
*
@ -159,44 +159,18 @@ function spip_bonux_definir_configurer_conteneur($form,$valeurs) {
function spip_bonux_configurer_stocker($form,$valeurs,$store) {
$trace = '';
list($table,$casier,$prefixe) = spip_bonux_definir_configurer_conteneur($form,$valeurs);
// stocker en base
// par defaut, dans un casier serialize dans spip_meta (idem CFG)
if (!isset($GLOBALS[$table]))
lire_metas($table);
// le casier peut etre de la forme casierprincipal/sous/casier
// on ecrit donc au bon endroit sans perdre les autres sous casier freres
$prefixe = ($prefixe ? $prefixe . '_' : '');
if ($casier) {
$c = explode('/',$casier);
$casier_principal = array_shift($c);
$st = isset($GLOBALS[$table][$casier_principal])?$GLOBALS[$table][$casier_principal]:array();
if (is_string($st) AND (count($c) OR is_array($store))) {
$st = unserialize($st);
if ($st===false)
$st=array();
}
$sc = &$st;
while (count($c) AND $cc=reset($c)) {
// creer l'entree si elle n'existe pas
if (!isset($sc[$cc]))
$sc[$cc] = array();
$sc = &$sc[$cc];
array_shift($c);
}
if (is_array($sc) AND count($sc))
$sc = array_merge($sc,$store);
else
$sc = $store;
$store = array($casier_principal => serialize($st));
$store = array($casier => $store);
}
$prefixe = ($prefixe?$prefixe.'_':'');
foreach($store as $k=>$v){
ecrire_meta($prefixe.$k, $v, true, $table);
foreach ($store as $k=>$v) {
ecrire_config("/$table/$prefixe$k", $v);
if (_request('var_mode')=='configurer' AND autoriser('webmestre')){
$trace .= "<br />table $table : ".$prefixe.$k." = $v;";
}
}
return $trace;
}
@ -205,11 +179,11 @@ function spip_bonux_configurer_lire_meta($form,&$valeurs) {
$prefixe = ($prefixe?$prefixe.'_':'');
if ($casier) {
$meta = spip_bonux_lire_config("/$table/$prefixe$casier");
$meta = lire_config("/$table/$prefixe$casier");
$prefixe = '';
}
else {
$meta = spip_bonux_lire_config("/$table");
$meta = lire_config("/$table");
}
foreach($valeurs as $k=>$v){
@ -218,94 +192,6 @@ function spip_bonux_configurer_lire_meta($form,&$valeurs) {
}
}
/**
* Lecture de la configuration
*
* lire_config() permet de recuperer une config depuis le php<br>
* memes arguments que la balise (forcement)<br>
* $cfg: la config, lire_config('montruc') est un tableau<br>
* lire_config('/table/champ') lit le valeur de champ dans la table des meta 'table'<br>
* lire_config('montruc/sub') est l'element "sub" de cette config equivalent a lire_config('/meta/montruc/sub')<br>
*
* $unserialize est mis par l'histoire
*
* @param string $cfg la config
* @param mixed $def un défaut optionnel
* @param boolean $unserialize n'affecte que le dépôt 'meta'
* @return string
*/
function spip_bonux_lire_config($cfg='', $def=null, $unserialize=true) {
// lire le stockage sous la forme /table/valeur
// ou valeur qui est en fait implicitement /meta/valeur
// ou casier/valeur qui est en fait implicitement /meta/casier/valeur
if ($cfg AND strpos($cfg,'/')===false){
return isset($GLOBALS['meta'][$cfg])?
((!$unserialize OR ($t=unserialize($GLOBALS['meta'][$cfg]))===false)?$GLOBALS['meta'][$cfg]:$t)
:$def;
}
// par defaut, sur la table des meta
$table = 'meta';
$cfg = explode('/',$cfg);
// si le premier argument est vide, c'est une syntaxe /table/ ou un appel vide ''
if (!reset($cfg) AND count($cfg)>1) {
array_shift($cfg);
if (count($cfg)) $table = array_shift($cfg);
if (!isset($GLOBALS[$table]))
lire_metas($table);
if (!isset($GLOBALS[$table]))
return $def;
}
$r = $GLOBALS[$table];
// si on a demande #CONFIG{/meta,'',0}
if (!count($cfg))
return $unserialize ? $r : serialize($r);
$deserialize = false; // on ne deserialise qu'une seule fois...
while($casier = array_shift($cfg)) {
$r = isset($r[$casier])?$r[$casier]:null;
// deserializer tant que c'est necessaire
if (!$deserialize AND $r AND is_string($r) AND (count($cfg) OR $unserialize)) {
$deserialize = true;
$r = unserialize($r);
}
}
if (is_null($r)) return $def;
return $r;
}
if (!function_exists('balise_CONFIG')) {
/**
* #CONFIG retourne lire_config()
*
* Le 3eme argument permet de controler la serialisation du resultat
* (mais ne sert que pour le depot 'meta') qui doit parfois deserialiser
*
* ex: |in_array{#CONFIG{toto,#ARRAY,1}}.
*
* Ceci n'affecte pas d'autres depots et |in_array{#CONFIG{toto/,#ARRAY}} sera equivalent
* #CONFIG{/tablemeta/champ,defaut} lit la valeur de 'champ' dans la table des meta 'tablemeta'
*
* @param Object $p Arbre syntaxique du compilo
* @return Object
*/
function balise_CONFIG($p) {
if (!$arg = interprete_argument_balise(1,$p)) {
$arg = "''";
}
$sinon = interprete_argument_balise(2,$p);
$unserialize = sinon(interprete_argument_balise(3,$p),"false");
$p->code = 'spip_bonux_lire_config(' . $arg . ',' .
($sinon && $sinon != "''" ? $sinon : 'null') . ',' . $unserialize . ')';
return $p;
}
}
include_spip('inc/config');
?>

12
connect/condition.php

@ -1,12 +0,0 @@
<?php
/**
* Plugin Spip 2.0 Reloaded
* Ce que vous ne trouverez pas dans Spip 2.0
* (c) 2008 Cedric Morin
* Licence GPL
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
$GLOBALS['spip_connect_version'] = 0.1;
spip_connect_db('host','port','login','pass','base','array', '','');
?>

12
connect/pour.php

@ -1,12 +0,0 @@
<?php
/**
* Plugin Spip 2.0 Reloaded
* Ce que vous ne trouverez pas dans Spip 2.0
* (c) 2008 Cedric Morin
* Licence GPL
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
$GLOBALS['spip_connect_version'] = 0.1;
spip_connect_db('host','port','login','pass','base','array', '','');
?>

30
demo/boucles_si.html

@ -1,30 +0,0 @@
<B_test10>
vrai_avant
<BOUCLE_test10(CONDITION){si 1}>
vrai
</BOUCLE_test10>
vrai_apres
</B_test10>
faux
<//B_test10>
<hr />
<B_test11>
vrai_avant
<BOUCLE_test11(CONDITION){si 0}>
vrai
</BOUCLE_test11>
vrai_apres
</B_test11>
faux
<//B_test11>
<hr />
<BOUCLE_test12(CONDITION){si #ENV{test}|>{5}}>
vrai
</BOUCLE_test12>
faux
<//B_test12>
<hr />

117
demo/boucles_tableaux.html

@ -1,117 +0,0 @@
[(#REM) Attention #ENV est un tableau serialize, et echappe, donc inutilisable
Preferer #ENV* ]
<BOUCLE_test10(POUR){tableau #ENV*}>
#CLE=>#VALEUR<br />
</BOUCLE_test10>
<hr />
<BOUCLE_test101(POUR){tableau #ENV*}>
#CLE=>#VALEUR<br />
</BOUCLE_test101>
<hr />
<BOUCLE_test11(POUR){tableau #EVAL{$GLOBALS['_ENV']}}>
#CLE=>#VALEUR<br />
</BOUCLE_test11>
<hr />
<BOUCLE_test12(POUR){tableau #ENV*}{par cle}>
#CLE=>#VALEUR<br />
</BOUCLE_test12>
<hr />
<BOUCLE_test13(POUR){tableau #ENV*}{!par cle}>
#CLE=>#VALEUR<br />
</BOUCLE_test13>
<hr />
<BOUCLE_test14(POUR){tableau #ENV*}{par valeur}>
#CLE=>#VALEUR<br />
</BOUCLE_test14>
<hr />
<BOUCLE_test15(POUR){tableau #ENV*}{!par valeur}>
#CLE=>#VALEUR<br />
</BOUCLE_test15>
<hr />
<B_test16>
<p>#PAGINATION</p>
<ul>
<BOUCLE_test16(POUR){tableau #EVAL{$GLOBALS}}{pagination}{par cle}>
<li>#CLE=>#VALEUR</li>
</BOUCLE_test16>
</ul>
</B_test16>
<hr />
<BOUCLE_test20(POUR){tableau #EVAL{$GLOBALS['_ENV']}}{cle=PATH}>
#CLE=>[(#VALEUR|var_export{1})]<br />
</BOUCLE_test20>
<hr />
<BOUCLE_test21(POUR){tableau #EVAL{$GLOBALS['_ENV']}}{cle==PATH}>
#CLE=>[(#VALEUR|var_export{1})]<br />
</BOUCLE_test21>
<hr />
<BOUCLE_test22(POUR){tableau #EVAL{$GLOBALS['_ENV']}}{cle IN (PATH,truc)}>
#CLE=>[(#VALEUR|var_export{1})]<br />
</BOUCLE_test22>
<hr />
<BOUCLE_test24(POUR){tableau #EVAL{$GLOBALS['_ENV']}}{valeur>a}>
#CLE=>[(#VALEUR|var_export{1})]<br />
</BOUCLE_test24>
<hr />
<B_test23>
<ul><li>
<BOUCLE_test23(POUR){tableau #EVAL{$GLOBALS}}>
#CLE=><B_test231><ul>
<BOUCLE_test231(POUR){tableau #VALEUR}><li>#CLE=><BOUCLE_test232(boucle_test231)></BOUCLE_test232></li></BOUCLE_test231>
</ul>
</B_test231>
#VALEUR</li><//B_test231>
</BOUCLE_test23>
</ul>
</B_test23>
<hr />
<h2>Tableau GET</h2>
#SET{test,#ARRAY{1,2,5,6,3,4}}
<BOUCLE_test30(POUR){tableau #GET{test}}>
#CLE=>#VALEUR<br />
</BOUCLE_test30>
<hr />
<h3>Par cle</h3>
<BOUCLE_test31(POUR){tableau #GET{test}}{par cle}>
#CLE=>#VALEUR<br />
</BOUCLE_test31>
<hr />
<h3>!Par cle</h3>
<BOUCLE_test32(POUR){tableau #GET{test}}{!par cle}>
#CLE=>#VALEUR<br />
</BOUCLE_test32>
<hr />
<h3>Par valeur</h3>
<BOUCLE_test33(POUR){tableau #GET{test}}{par valeur}>
#CLE=>#VALEUR<br />
</BOUCLE_test33>
<hr />
<h3>!Par valeur</h3>
<BOUCLE_test34(POUR){tableau #GET{test}}{!par valeur}>
#CLE=>#VALEUR<br />
</BOUCLE_test34>
<hr />
Pagination
#SET{test,#ARRAY{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}}
<B_test40>
<p class="pagination">#PAGINATION</p>
<BOUCLE_test40(POUR){tableau #GET{test}}{pagination 5}>
#CLE=>#VALEUR<br />
</BOUCLE_test40>
[#TOTAL_BOUCLE/#GRAND_TOTAL]
</B_test40>

10
formulaires/recherche_ecrire.html

@ -1,10 +0,0 @@
<div class="formulaire_spip formulaire_recherche" id="formulaire_recherche">
<form action="[(#ENV{action})]" method="get"><div>
[(#ENV{action}|form_hidden)]
[<input type="hidden" name="lang" value="(#ENV{lang})" />]
<label for="recherche"><:info_rechercher_02:></label>
<input type="text" class="text" size="10" name="recherche" id="recherche"[ value="(#ENV{recherche})"] accesskey="4" />
<input type='image' src='[(#EVAL{_DIR_IMG_PACK}|concat{loupe.png})]' name='submit' class="image" alt='<:info_rechercher|attribut_html:>' />
[(#ENV{recherche}|oui)<a href='#ENV{action}' title='<:spip_bonux:annuler_recherche|attribut_html:>'>[(#CHEMIN{img_pack/annuler-recherche.png}|tag_img|inserer_attribut{alt,<:spip_bonux:annuler_recherche:>})]</a>]
</div></form>
</div>

31
formulaires/recherche_ecrire.php

@ -1,31 +0,0 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2009 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
// chargement des valeurs par defaut des champs du formulaire
function formulaires_recherche_ecrire_charger_dist($lien_filtre = NULL,$lien_arg = NULL){
$lien = $lien_filtre ? $lien_filtre : $lien_arg;
if ($GLOBALS['spip_lang'] != $GLOBALS['meta']['langue_site'])
$lang = $GLOBALS['spip_lang'];
else
$lang='';
return
array(
'action' => ($lien ? $lien : generer_url_ecrire('recherche')), # action specifique, ne passe pas par Verifier, ni Traiter
'recherche' => _request('recherche'),
'lang' => $lang
);
}
?>

1
formulaires/selecteur/articles.html

@ -15,3 +15,4 @@ select=1 => le selecteur se comporte comme un select, avec un seul choix possibl
<div class='item_picker'>
<INCLURE{fond=formulaires/selecteur/picker-ajax}{id_rubrique=#GET{id_rubrique}}{id_article}{articles=1}{ajax}{env}>
</div>

19
inc/config.php

@ -1,19 +0,0 @@
<?php
/*
* Plugin xxx
* (c) 2009 xxx
* Distribue sous licence GPL
*
*/
include_once _DIR_RESTREINT.'inc/config.php';
if (!defined('_DIR_PLUGIN_CFG')){
if (!function_exists('lire_config')){
function lire_config($cfg='', $def=null, $unserialize=true) {
include_spip('configurer/pipelines');
return spip_bonux_lire_config($cfg, $def, $unserialize);
}
}
}
?>

196
inc/core21_filtres.php

@ -1,196 +0,0 @@
<?php
/**
* Plugin Spip-Bonux
* Le plugin qui lave plus SPIP que SPIP
* (c) 2008 Mathieu Marcillaud, Cedric Morin, Romy Tetue
* Licence GPL
*
* Fonctions integrees au core en branche 2.1 que l'on rend disponible en branche 2.0.x
*
*/
// s'assurer que les filtres du core sont deja charges
// pour eviter tout risque de conflit
include_spip('inc/filtres');
if (!function_exists('lien_ou_expose')){
/**
* une fonction pour generer des menus avec liens
* ou un <strong class='on'> non clicable lorsque l'item est selectionne
*
* @param string $url
* @param string $libelle
* @param bool $on
* @param string $class
* @param string $title
* @return string
*/
function lien_ou_expose($url,$libelle,$on=false,$class="",$title="",$rel=""){
return
($on ?"<strong class='on'>":
"<a href='$url'"
.($title?" title='".attribut_html($title)."'":'')
.($class?" class='".attribut_html($class)."'":'')
.($rel?" rel='".attribut_html($rel)."'":'')
.">"
)
. $libelle
. ($on ? "</strong>":"</a>");
}
}
if (!function_exists('filtre_balise_img_dist')){
/**
* une fonction pour generer une balise img a partir d'un nom de fichier
*
* @param string $img
* @param string $alt
* @param string $class
* @return string
*/
function filtre_balise_img_dist($img,$alt="",$class=""){
$taille = taille_image($img);
list($hauteur,$largeur) = $taille;
if (!$hauteur OR !$largeur)
return "";
return
"<img src='$img' width='$largeur' height='$hauteur'"
." alt='".attribut_html($alt)."'"
.($class?" class='".attribut_html($class)."'":'')
.' />';
}
}
if (!function_exists('singulier_ou_pluriel')){
/**
* Afficher un message "un truc"/"N trucs"
*
* @param int $nb
* @return string
*/
function singulier_ou_pluriel($nb,$chaine_un,$chaine_plusieurs,$var='nb'){
if (!$nb=intval($nb)) return "";
if ($nb>1) return _T($chaine_plusieurs, array($var => $nb));
else return _T($chaine_un);
}
}
if (!function_exists('filtre_icone_dist')){
/**
* un filtre icone mappe sur icone_inline, qui cree une icone a gauche par defaut
* le code de icone_inline est grandement reproduit ici car les liens ajax portent simplement une class ajax
* lorsque les interfaces sont en squelette, alors que l'implementation d'ajax de des scripts php
* est plus complexe
*
* @param string $lien
* @param string $texte
* @param string $fond
* @param string $align
* @param string $fonction
* @return string
*/
function filtre_icone_dist($lien, $texte, $fond, $align="", $fonction="", $class="",$javascript=""){
$align = $align?$align:$GLOBALS['spip_lang_left'];
global $spip_display;
if ($fonction == "supprimer.gif") {
$style = 'icone36 danger';
} else {
$style = 'icone36';
if (strlen($fonction) < 3) $fonction = "rien.gif";
}
$style .= " " . substr(basename($fond),0,-4);
if ($spip_display == 1){
$hauteur = 20;
$largeur = 100;
$title = $alt = "";
}
else if ($spip_display == 3){
$hauteur = 30;
$largeur = 30;
$title = "\ntitle=\"$texte\"";
$alt = $texte;
}
else {
$hauteur = 70;
$largeur = 100;
$title = '';
$alt = $texte;
}
$size = 24;
if (preg_match("/-([0-9]{1,3})[.](gif|png)$/i",$fond,$match))
$size = $match[1];
if ($spip_display != 1 AND $spip_display != 4){
if ($fonction != "rien.gif"){
$icone = http_img_pack($fonction, $alt, "$title width='$size' height='$size'\n" .
http_style_background($fond, "no-repeat center center"));
}
else {
$icone = http_img_pack($fond, $alt, "$title width='$size' height='$size'");
}
} else $icone = '';
// cas d'ajax_action_auteur: faut defaire le boulot
// (il faudrait fusionner avec le cas $javascript)
if (preg_match(",^<a\shref='([^']*)'([^>]*)>(.*)</a>$,i",$lien,$r))
list($x,$lien,$atts,$texte)= $r;
else $atts = '';
if ($align && $align!='center') $align = "float: $align; ";
$icone = "<a style='$align' class='$style $class'"
. $atts
. $javascript
. "\nhref='"
. $lien
. "'>"
. $icone
. (($spip_display == 3) ? '' : "<span>$texte</span>")
. "</a>\n";
if ($align <> 'center') return $icone;
$style = " style='text-align:center;'";
return "<div$style>$icone</div>";
}
}
if (!function_exists('filtre_explode_dist')){
/**
* filtre explode pour les squelettes permettant d'ecrire
* #GET{truc}|explode{-}
*
* @param strong $a
* @param string $b
* @return array
*/
function filtre_explode_dist($a,$b){return explode($b,$a);}
}
if (!function_exists('filtre_implode_dist')){
/**
* filtre implode pour les squelettes permettant d'ecrire
* #GET{truc}|implode{-}
*
* @param array $a
* @param string $b
* @return string
*/
function filtre_implode_dist($a,$b){return implode($b,$a);}
}
if (!function_exists('bando_images_background') AND !defined('_DIR_PLUGIN_BANDO')){
function bando_images_background(){
return '';
}
}
if (!function_exists('bando_style_prive_theme') AND !defined('_DIR_PLUGIN_BANDO')){
function bando_style_prive_theme() {
return '';
}
}
?>

15
modeles/pagination.html

@ -1,15 +0,0 @@
#ENV*{bloc_ancre}
#SET{bornes,#ENV{page_courante}|bornes_pagination{#ENV{nombre_pages},10}}
#SET{premiere, #GET{bornes}|reset}
#SET{derniere, #GET{bornes}|end}
#SET{pages,#GET{premiere}|range{#GET{derniere}}}
#SET{separateur,#ENV{separateur,'|'}}
<B_pages>
[<a href='[(#ENV{url}|parametre_url{#ENV{debut},''})]##ENV{ancre}' class='lien_pagination' rel='nofollow'>(#GET{premiere}|>{1}|?{'...',''})</a> [<span class='sep separateur'>(#GET*{separateur})</span>]]
<BOUCLE_pages(POUR){tableau #GET{pages}}>
[(#SET{item, #VALEUR|moins{1}|mult{#ENV{pas}} })]
[(#ENV{url}|parametre_url{#ENV{debut},#GET{item}}|ancre_url{#ENV{ancre}}|aoustrong{#VALEUR|moins{1}|mult{#ENV{pas}},#VALEUR|=={#ENV{page_courante}},lien_pagination,'',nofollow})]
[<span class='sep separateur'>(#VALEUR|<{#GET{derniere}}|?{#GET{separateur}})</span>]
</BOUCLE_pages>
[[<span class='sep separateur'>(#GET*{separateur})</span>] <a href='[(#ENV{url}|parametre_url{#ENV{debut},#ENV{nombre_pages}|moins{1}|mult{#ENV{pas}}})]##ENV{ancre}' class='lien_pagination' rel='nofollow'>(#GET{derniere}|<{#ENV{nombre_pages}}|?{'...',''})</a>]
</B_pages>

16
modeles/pagination_page.html

@ -1,16 +0,0 @@
#ENV*{bloc_ancre}
#SET{bornes,#ENV{page_courante}|bornes_pagination{#ENV{nombre_pages},10}}
#SET{premiere, #GET{bornes}|reset}
#SET{derniere, #GET{bornes}|end}
#SET{pages,#GET{premiere}|range{#GET{derniere}}}
#SET{separateur,#ENV{separateur,'|'}}
<B_pages>
<span class='pagination_label'><:spip_bonux:pages:></span>
[<a href='[(#ENV{url}|parametre_url{#ENV{debut},''})]##ENV{ancre}' class='lien_pagination' rel='nofollow'>(#GET{premiere}|>{1}|?{'...',''})</a> [<span class='sep separateur'>(#GET*{separateur})</span>]]
<BOUCLE_pages(POUR){tableau #GET{pages}}>
[(#SET{item, #VALEUR|moins{1}|mult{#ENV{pas}} })]
[(#ENV{url}|parametre_url{#ENV{debut},#GET{item}}|ancre_url{#ENV{ancre}}|aoustrong{#VALEUR,#VALEUR|=={#ENV{page_courante}},lien_pagination,'',nofollow})]
[<span class='sep separateur'>(#VALEUR|<{#GET{derniere}}|?{#GET{separateur}})</span>]
</BOUCLE_pages>
[[<span class='sep separateur'>(#GET*{separateur})</span>] <a href='[(#ENV{url}|parametre_url{#ENV{debut},#ENV{nombre_pages}|moins{1}|mult{#ENV{pas}}})]##ENV{ancre}' class='lien_pagination' rel='nofollow'>(#GET{derniere}|<{#ENV{nombre_pages}}|?{'...',''})</a>]
</B_pages>

17
modeles/pagination_prive.html

@ -1,17 +0,0 @@
#ENV*{bloc_ancre}
#SET{bornes,#ENV{page_courante}|bornes_pagination{#ENV{nombre_pages},10}}
#SET{premiere, #GET{bornes}|reset}
#SET{derniere, #GET{bornes}|end}
#SET{pages,#GET{premiere}|range{#GET{derniere}}}
#SET{separateur,#ENV{separateur,'|'}}
<B_pages>
[<a href='[(#ENV{url}|parametre_url{#ENV{debut},''})]##ENV{ancre}' class='lien_pagination' rel='nofollow'>(#GET{premiere}|>{1}|?{'...',''})</a> [<span class='sep separateur'>(#GET*{separateur})</span>]]
<BOUCLE_pages(POUR){tableau #GET{pages}}>
[(#SET{item, #VALEUR|moins{1}|mult{#ENV{pas}} })]
[(#ENV{url}|parametre_url{#ENV{debut},#GET{item}}|ancre_url{#ENV{ancre}}|aoustrong{#VALEUR|moins{1}|mult{#ENV{pas}},#VALEUR|=={#ENV{page_courante}},lien_pagination,'',nofollow})]
[<span class='sep separateur'>(#VALEUR|<{#GET{derniere}}|?{#GET{separateur}})</span>]
</BOUCLE_pages>
[[<span class='sep separateur'>(#GET*{separateur})</span>] <a href='[(#ENV{url}|parametre_url{#ENV{debut},#ENV{nombre_pages}|moins{1}|mult{#ENV{pas}}})]##ENV{ancre}' class='lien_pagination' rel='nofollow'>(#GET{derniere}|<{#ENV{nombre_pages}}|?{'...',''})</a>]
[<span class='sep separateur'>(#GET*{separateur})</span>]
[(#ENV{url}|parametre_url{#ENV{debut},-1}|ancre_url{#ENV{ancre}}|aoustrong{<:lien_tout_afficher:>,#ENV{page_courante}|=={0},lien_pagination,'',nofollow})]
</B_pages>

37
plugin.xml

@ -2,37 +2,9 @@
<nom>SPIP Bonux</nom>
<auteur>Cedric Morin, Matthieu Marcillaud, romy.tetue.net</auteur>
<icon>img_pack/spip-bonux.png</icon>
<licence>(c) 2008-2010 GPL</licence>
<version>2.2.17</version>
<etat>stable</etat>
<description>Le plugin qui lave plus SPIP que SPIP, avec des chouettes cadeaux dedans ! Interface douce, boucles POUR et CONDITION, tableaux, compteur, etc.</description>
<lien>http://www.spip-contrib.net/SPIP-Bonux</lien>
<fonctions>public/spip_bonux_criteres.php</fonctions>
<fonctions>public/spip_bonux_balises.php</fonctions>
<fonctions>spip_bonux_fonctions.php</fonctions>
<options>spip_bonux_options.php</options>
<prefix>spip_bonux</prefix>
<necessite id='SPIP' version='[2.0.0;]' />
<chemin dir='' />
<chemin dir='spip20/' />
<pipeline>
<nom>formulaire_charger</nom>
<inclure>configurer/pipelines.php</inclure>
</pipeline>
<pipeline>
<nom>formulaire_traiter</nom>
<inclure>configurer/pipelines.php</inclure>
</pipeline>
<fonctions>configurer/pipelines.php</fonctions>
<categorie>outil</categorie>
</plugin>
<plugin spip='[2.1.0-beta;]'>
<nom>SPIP Bonux</nom>
<auteur>Cedric Morin, Matthieu Marcillaud, romy.tetue.net</auteur>
<icon>img_pack/spip-bonux.png</icon>
<licence>(c) 2008-2010 GPL</licence>
<version>2.2.17</version>
<etat>stable</etat>
<licence>(c) 2008-2011 GPL</licence>
<version>2.3-dev</version>
<etat>dev</etat>
<description>Le plugin qui lave plus SPIP que SPIP, avec des chouettes cadeaux dedans ! Interface douce, boucles POUR et CONDITION, tableaux, compteur, etc.</description>
<lien>http://www.spip-contrib.net/SPIP-Bonux</lien>
<fonctions>public/spip_bonux_criteres.php</fonctions>
@ -40,6 +12,8 @@
<fonctions>spip_bonux_fonctions.php</fonctions>
<options>spip_bonux_options.php</options>
<prefix>spip_bonux</prefix>
<necessite id='SPIP' version='[2.3-dev;]' />
<pipeline>
<nom>formulaire_charger</nom>
<inclure>configurer/pipelines.php</inclure>
@ -51,3 +25,4 @@
<fonctions>configurer/pipelines.php</fonctions>
<categorie>outil</categorie>
</plugin>

80
prive/style_prive_plugin_bonux.html

@ -1,80 +0,0 @@
[(#REM)
Ce squelette definit les styles de l'espace prive
Note: l'entete "Vary:" sert a repousser l'entete par
defaut "Vary: Cookie,Accept-Encoding", qui est (un peu)
genant en cas de "rotation du cookie de session" apres
un changement d'IP (effet de clignotement).
ATTENTION: il faut absolument le charset sinon Firefox croit que
c'est du text/html !
]
#CACHE{3600*100,cache-client}
#HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}
#HTTP_HEADER{Vary: Accept-Encoding}
#SET{claire,##ENV{couleur_claire,edf3fe}}
#SET{foncee,##ENV{couleur_foncee,3874b0}}
#SET{left,#ENV{ltr}|choixsiegal{left,left,right}}
#SET{right,#ENV{ltr}|choixsiegal{left,right,left}}
ul.item_picked {list-style:none;margin:0;padding:0;float:left;}
ul.item_picked li {margin:0 2px 2px;padding:2px;background:#eee;border:1px solid #GET{claire};float:#GET{left};clear:none;}
ul.item_picked li span.sep {display:none;}
ul.item_picked li.article {padding-#GET{left}:15px;background:url(#CHEMIN{img_pack/article-12.png}) no-repeat [(#GET{left}) ]center;}
ul.item_picked li.rubrique {padding-#GET{left}:15px;background:url(#CHEMIN{prive/images/rubrique-12.gif}) no-repeat [(#GET{left}) ]center;}
ul.item_picked.select li {padding:2px 0;border:0;font-weight:bold;background:none;float:none;}
ul.item_picked.select ul > li {float:#GET{left};}
ul.item_picked.changing {}
.picker_bouton {float:#GET{right};clear:both;}
.item_picker {clear:#GET{left};font-size:0.95em;}
.item_picker .chemin {border-bottom:1px solid #GET{claire};margin:0.5em 0 0.25em;clear:both;}
.item_picker .frame {background:#fff;border:1px solid #GET{foncee};width:159px;height:400px;float:#GET{left};overflow:auto;position:relative;}
.cadre .cadre_padding .item_picker .frame {width:153px;}
.fiche_objet .cadre .cadre_padding .item_picker .frame {width:148px;}
.item_picker .frame.total_3 {margin-#GET{left}:-58px;border-#GET{left}:3px solid #GET{foncee};}
.item_picker .frame.frame_0 {margin-#GET{left}:0;z-index:1000;}
.item_picker .frame.frame_1 {z-index:1010;}
.item_picker .frame.frame_2 {z-index:1020;}
.item_picker .frame.frame_3 {z-index:1030;}
.item_picker .frame.frame_4 {z-index:1040;}
.item_picker .frame .frame_close {float:#GET{right};}
.item_picker .frame h2 {margin:0;padding:5px;background:[#(#GET{claire}|couleur_eclaircir)];font-size:1.3em;}
.item_picker .frame .pagination {font-size:0.9em;}
.item_picker .frame ul {list-style:none;margin:0;padding:0;}
.item_picker .frame ul li {display:block;clear:both;list-style:none;margin:0;padding:0 2px;padding-#GET{left}:15px;position:relative;}
.item_picker .frame ul li.rubrique {background:url(#CHEMIN{prive/images/rubrique-12.gif}) no-repeat [(#GET{left}) ]2px;padding-#GET{right}:16px;}
.item_picker .frame ul li.article {clear:both;background:url(#CHEMIN{img_pack/article-12.png}) no-repeat [(#GET{left}) ]2px;}
.item_picker .frame ul li:hover,.item_picker .frame ul li.on {background-color:[#(#GET{claire}|couleur_eclaircir)];}
.item_picker .frame a:hover,.item_picker .frame a:hover .ouvrir,.item_picker .frame a:hover .add {background-color:#GET{claire};}
.item_picker .frame ul li.rubrique .ouvrir {position:absolute;display:block;top:0px;#GET{right}:0px;}
.item_picker .frame ul >li .add {float:#GET{left};clear:#GET{left};}
.item_picker .frame ul li a {display:block;}
.item_picker .frame a {text-decoration:none;}
.browser .choix_rapide {font-size:0.9em;}
.browser #picker_id {padding:0;margin:0 5px;border:1px solid;}
/*
Selecteurs de rubrique / article
ayant une classe li.selecteur_item
n'ont pas de marge a gauche pour occuper toute la largeur
*/
.formulaire_spip li.selecteur_item {
padding-#GET{left}:10px;background:#fff;
}
.formulaire_spip li.selecteur_item label {
margin-#GET{left}:0;display:block;float:left;padding:2px 0;
}

23
prive/style_prive_plugin_bonux_recherche.html

@ -1,23 +0,0 @@
[(#REM)
Ce squelette definit les styles pour le formulaire de recherche
]
#CACHE{3600*100,cache-client}
#HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}
#HTTP_HEADER{Vary: Accept-Encoding}
#SET{claire,##ENV{couleur_claire,edf3fe}}
#SET{foncee,##ENV{couleur_foncee,3874b0}}
#SET{left,#ENV{ltr}|choixsiegal{left,left,right}}
#SET{right,#ENV{ltr}|choixsiegal{left,right,left}}
/* formulaire_recherche_ecrire */
.formulaire_recherche { margin: 0; padding: 0; background: none; text-align:#GET{right};border:0; }
.formulaire_recherche * { display: inline; vertical-align: middle; }
.formulaire_recherche label {display:none;}
.formulaire_recherche input.text { width: 17em;color:#fff;border:1px solid #fff;background:#GET{foncee};padding:3px;}
.formulaire_recherche input.image {}
.formulaire_recherche img {padding:0 0 3px;}

5
prive/themes/spip/style_prive_bling.html

@ -1,5 +0,0 @@
[(#REM)
Distribue sous licence GPL
Pas de bling
]

317
public/spip_bonux_balises.php

@ -7,155 +7,6 @@
*
*/
// recuperer le nom du serveur,
// mais pas si c'est un serveur specifique (pour, connexion)
// attention, en SPIP 2.1, on recupere 'POUR' et non plus 'pour' comme en 2.0
// @param array $p, AST positionne sur la balise
// @return string nom de la connexion
function get_nom_serveur($p) {
if (isset($p->boucles[$p->id_boucle])) {
$s = $p->boucles[$p->id_boucle]->sql_serveur;
if ($serveur = strtolower($s)
AND $serveur!='pour'
AND $serveur!='condition') {
return $s;
}
}
return "";
}
//
// #URL_ACTION_AUTEUR{converser,arg,redirect} -> ecrire/?action=converser&arg=arg&hash=xxx&redirect=redirect
//
// http://doc.spip.org/@balise_URL_ACTION_AUTEUR_dist
function balise_URL_ACTION_AUTEUR($p) {
$p->descr['session'] = true;
// si serveur externe, ce n'est pas possible
if (get_nom_serveur($p)) {
$p->code = 'generer_url_public("404")';
return $p;
}
$p->code = interprete_argument_balise(1,$p);
$args = interprete_argument_balise(2,$p);
if (!$args)
$args = "''";
$p->code .= ",".$args;
$redirect = interprete_argument_balise(3,$p);
if ($redirect != "''" && $redirect!==NULL)
$p->code .= ",".$redirect;
$p->code = "generer_action_auteur(" . $p->code . ")";
$p->interdire_scripts = false;
return $p;
}
//
// #URL_ECRIRE{naviguer} -> ecrire/?exec=naviguer
//
// http://doc.spip.org/@balise_URL_ECRIRE_dist
function balise_URL_ECRIRE($p) {
// si serveur externe, ce n'est pas possible
if (get_nom_serveur($p)) {
$p->code = 'generer_url_public("404")';
return $p;
}
$code = interprete_argument_balise(1,$p);
if (!$code)
$fonc = "''";
else{
if (preg_match("/^'[^']*'$/", $code))
$fonc = $code;
else {$code = "(\$f = $code)"; $fonc = '$f';}
$args = interprete_argument_balise(2,$p);
if ($args != "''" && $args!==NULL)
$fonc .= ',' . $args;
}
$p->code = 'generer_url_ecrire(' . $fonc .')';
if (function_exists('tester_url_ecrire'))
if ($code)
$p->code = "(tester_url_ecrire($code) ?" . $p->code .' : "")';
#$p->interdire_scripts = true;
return $p;
}
// surplus de #URL_PAGE pour prendre en compte les boucles POUR et CONDITION
/* // ceci n'est pas suffisant car il faudrait traiter les autres types aussi
function generer_generer_url_pour($type, $code) {return 'generer_url_public(' . $code .')';}
function generer_generer_url_condition($type, $code) {return 'generer_url_public(' . $code .')';}
*/
function balise_URL_PAGE($p) {
$p->code = interprete_argument_balise(1,$p);
$args = interprete_argument_balise(2,$p);
if ($args != "''" && $args!==NULL)
$p->code .= ','.$args;
// autres filtres (???)
array_shift($p->param);
if ($p->id_boucle
AND $s = get_nom_serveur($p)) {
if (!$GLOBALS['connexions'][$s]['spip_connect_version']) {
$p->code = "404";
} else {
// si une fonction de generation des url a ete definie pour ce connect l'utiliser
// elle devra aussi traiter le cas derogatoire type=page
if (function_exists($f = 'generer_generer_url_'.$s)){
$p->code = $f('page', $p->code, $s);
return $p;
}
$p->code .= ", 'connect=" . addslashes($s) . "'";
}
}
$p->code = 'generer_url_public(' . $p->code .')';
#$p->interdire_scripts = true;
return $p;
}
/**
* #SET
* Affecte une variable locale au squelette
* #SET{nom,valeur}
*
* SURCHARGE DU CORE :
* Affecte un filtre a une variable locale au squelette
* #SET{nom,filtre,param1,param2,...,paramN}
*
* @param object $p : objet balise
* @return ""
**/
/*
function balise_SET($p){
$_code = array();
$n=1;
while ($_v = interprete_argument_balise($n++,$p))
$_code[] = $_v;
$_nom = array_shift($_code);
$_valeur = array_shift($_code);
if ($_nom AND $_valeur AND count($_code)) {
$filtre = str_replace("'", "", strtolower($_valeur));
$f = chercher_filtre($filtre);
$p->code = "vide(\$Pile['vars'][$_nom]=$f(". join(', ',$_code)."))";
} elseif ($_nom AND $_valeur)
$p->code = "vide(\$Pile['vars'][$_nom] = $_valeur)";
else
$p->code = "''";
$p->interdire_scripts = false; // la balise ne renvoie rien
return $p;
}
*/
/**
* Empile un element dans un tableau declare par #SET{tableau,#ARRAY}
@ -281,133 +132,6 @@ function calculer_balise_criteres($nom, $p, $motif="") {
/**
* #TRI{champ[,libelle]}
* champ prend < ou > pour afficher le lien de changement de sens
* croissant ou decroissant
*
* @param unknown_type $p
* @param unknown_type $liste
* @return unknown
*/
function balise_TRI_dist($p, $liste='true') {
$b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
// s'il n'y a pas de nom de boucle, on ne peut pas trier
if ($b === '') {
erreur_squelette(
_T('zbug_champ_hors_boucle',
array('champ' => '#TRI')
), $p->id_boucle);
$p->code = "''";
return $p;
}
$boucle = $p->boucles[$b];
// s'il n'y a pas de tri_champ, c'est qu'on se trouve
// dans un boucle recursive ou qu'on a oublie le critere {tri}
if (!isset($boucle->modificateur['tri_champ'])) {
erreur_squelette(
_T('zbug_tri_sans_critere',
array('champ' => '#TRI')
), $p->id_boucle);
$p->code = "''";
return $p;
}
$_champ = interprete_argument_balise(1,$p);
// si pas de champ, renvoyer le critere de tri utilise
if (!$_champ){
$p->code = $boucle->modificateur['tri_champ'];
return $p;
}
$_libelle = interprete_argument_balise(2,$p);
$_libelle = $_libelle?$_libelle:$_champ;
$_class = interprete_argument_balise(3,$p);
// si champ = "<" c'est un lien vers le tri croissant : 1<2<3<4 ... ==> 1
// si champ = ">" c'est un lien vers le tri decroissant :.. 4>3>2>1 == -1
$_issens = "in_array($_champ,array('<','>'))";
$_sens = "(strpos('> <',$_champ)-1)";
$_variable = "((\$s=$_issens)?'sens':'tri').".$boucle->modificateur['tri_nom'];
$_url = "parametre_url(self(),$_variable,\$s?$_sens:$_champ)";
$_on = "\$s?(".$boucle->modificateur['tri_sens']."==$_sens".'):('.$boucle->modificateur['tri_champ']."==$_champ)";
$p->code = "lien_ou_expose($_url,$_libelle,$_on".($_class?",$_class":"").")";
//$p->code = "''";
$p->interdire_scripts = false;
return $p;
}
/**
* Generer un bouton d'action en post, ajaxable
* a utiliser a la place des liens action_auteur, sous la forme
* #BOUTON_ACTION{libelle,url}
* ou
* #BOUTON_ACTION{libelle,url,ajax} pour que l'action soit ajax comme un lien class='ajax'
* ou
* #BOUTON_ACTION{libelle,url,ajax,message_confirmation} pour utiliser un message de confirmation
* ou
* #BOUTON_ACTION{libelle,url,ajax,'',info} pour inserer une bulle d'information
*
* @param unknown_type $p
* @return unknown
*/
function balise_BOUTON_ACTION($p){
$_label = interprete_argument_balise(1,$p);
if (!$_label) $_label="''";
$_url = interprete_argument_balise(2,$p);
if (!$_url) $_url="''";
$_class = interprete_argument_balise(3,$p);
if (!$_class) $_class="''";
$_confirm = interprete_argument_balise(4,$p);
if ((!$_confirm) OR ($_confirm=="''")) { $_onclick=''; }
else $_onclick = " onclick=\'return confirm(\"' . attribut_html($_confirm) . '\");\'";
$_title = interprete_argument_balise(5,$p);
if (!$_title) $_title="''";
else $_title = "' title=\'' . $_title . '\''";
$p->code = "'<form class=\'bouton_action_post ' . $_class . '\' method=\'post\' action=\'' . (\$u=$_url) . '\'>'
. '<div>' . form_hidden(\$u)
. '<button type=\'submit\' class=\'submit\' $_onclick' . $_title . '>' . $_label . '</button>'
. '</div></form>'";
$p->interdire_scripts = false;
return $p;
}
/**
* Generer n'importe quel info pour un objet : #INFO_TITRE{article, #ENV{id_article}}
* Utilise la fonction generer_info_entite(), se reporter a sa documentation
*/
function balise_INFO__dist($p){
$info = $p->nom_champ;
$type_objet = interprete_argument_balise(1,$p);
$id_objet = interprete_argument_balise(2,$p);
if ($info === 'INFO_' or !$type_objet or !$id_objet) {
$msg = _T('zbug_balise_sans_argument', array('balise' => ' INFO_'));
erreur_squelette($msg, $p);
$p->interdire_scripts = false;
return $p;
} elseif ($f = charger_fonction($nom, 'balise', true)) {
return $f($p);
}else {
$p->code = champ_sql($info, $p);
if (strpos($p->code, '@$Pile[0]') !== false) {
$info = strtolower(substr($info,5));
$p->code = "generer_info_entite($id_objet, $type_objet, '$info')";
}
$p->interdire_scripts = false;
return $p;
}
}
/**
* Savoir si on objet est publie ou non
@ -461,47 +185,6 @@ function balise_PUBLIE_dist($p) {
}
/**
* Implementation securisee du saut en avant
* pour la balise #SAUTER
*
* @param resource $res
* @param int $pos
* @param int $nb
* @param int $total
*/
function spip_bonux_sauter(&$res, &$pos, $nb, $total){
// pas de saut en arriere qu'on ne sait pas faire sans sql_seek
if (($nb=intval($nb))<=0) return;
$saut = $pos + $nb;
// si le saut fait depasser le maxi, on libere et on sort
if ($saut>=$total) {sql_free($res); return;}
if (sql_seek($res, $saut))
$pos += $nb;
else
while ($pos<$saut AND sql_fetch($res))
$pos++;
return;
}
/**
* #SAUTER{n} permet de sauter n resultats dans une boucle
* n>0
*
* @param <type> $p
* @return <type>
*/
function balise_SAUTER_dist($p){
$_nb = interprete_argument_balise(1,$p);
$_compteur = "\$Numrows['".$p->id_boucle."']['compteur_boucle']";
$_max = "\$Numrows['".$p->id_boucle."']['total']";
$p->code = "spip_bonux_sauter(\$result,$_compteur,$_nb,$_max)";
$p->interdire_scripts = false;
return $p;
}
/**
* Produire un fichier statique a partir d'un squelette dynamique

65
public/spip_bonux_criteres.php

@ -7,26 +7,8 @@
*
*/
$GLOBALS['exception_des_connect'][] = 'pour';
$GLOBALS['exception_des_connect'][] = 'condition';
/* le critere {tableau ...} des boucles pour:POUR */
function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
$boucle = &$boucles[$idb];
if (isset($crit->param[0])){
$table = calculer_liste($crit->param[0], array(), $boucles, $boucle->id_parent);
$boucle->having[]=array("'tableau'",$table);
}
}
/* le critere {si ...} des boucles condition:CONDITION */
function critere_CONDITION_si_dist($idb, &$boucles, $crit) {
$boucle = &$boucles[$idb];
if (isset($crit->param[0])){
$si = calculer_liste($crit->param[0], array(), $boucles, $boucle->id_parent);
$boucle->having[]='($test='.$si.')?array(\'tableau\',\'1:1\'):\'\'';
}
}
/**
* http://www.spip-contrib.net/Classer-les-articles-par-nombre-de#forum409210
@ -157,53 +139,6 @@ function calcul_critere_fonctions($func, $idb, &$boucles, $crit) {
}
}
/**
* {tri [champ_par_defaut][,sens_par_defaut][,nom_variable]}
* champ_par_defaut : un champ de la table sql
* sens_par_defaut : -1 ou inverse pour decroissant, 1 ou direct pour croissant
* nom_variable : nom de la variable utilisee (par defaut tri_nomboucle)
*
* {tri titre}
* {tri titre,inverse}
* {tri titre,-1}
* {tri titre,-1,truc}
*
* @param unknown_type $idb
* @param unknown_type $boucles
* @param unknown_type $crit
*/
function critere_tri_dist($idb, &$boucles, $crit) {
$boucle = &$boucles[$idb];
$id_table = $boucle->id_table;
// definition du champ par defaut
$_champ_defaut = !isset($crit->param[0][0]) ? "''" : calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucle->id_parent);
$_sens_defaut = !isset($crit->param[1][0]) ? "1" : calculer_liste(array($crit->param[1][0]), array(), $boucles, $boucle->id_parent);
$_variable = !isset($crit->param[2][0]) ? "'$idb'" : calculer_liste(array($crit->param[2][0]), array(), $boucles, $boucle->id_parent);
$_tri = "((\$t=(isset(\$Pile[0]['tri'.$_variable]))?\$Pile[0]['tri'.$_variable]:$_champ_defaut)?tri_protege_champ(\$t):'')";
$_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
$_sens ="((intval(\$t=(isset(\$Pile[0]['sens'.$_variable]))?\$Pile[0]['sens'.$_variable]:$_sens_defaut)==-1 OR \$t=='inverse')?-1:1)";
$boucle->modificateur['tri_champ'] = $_tri;
$boucle->modificateur['tri_sens'] = $_sens;
$boucle->modificateur['tri_nom'] = $_variable;
// faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
// evite des erreurs sql, mais peut empecher des tri sur jointure ...
$boucle->hash .= "
\$senstri = '';
\$tri = $_tri;
if (\$tri){
\$senstri = $_sens;
\$senstri = (\$senstri<0)?' DESC':'';
};
";
$field = serialize(array_keys($boucle->show['field']));
$boucle->select[] = "\".tri_champ_select(\$tri).\"";
$boucle->order[] = "tri_champ_order(\$tri,'$id_table','$field').\$senstri";
}
/**
* Trouver toutes les objets qui ont des enfants (les noeuds de l'arbre)
* {noeud}

547
req/array.php

@ -1,547 +0,0 @@
<?php
/**
* Plugin Spip 2.0 Reloaded
* Ce que vous ne trouverez pas dans Spip 2.0
* (c) 2008 Cedric Morin
* Licence GPL
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
global $array_server;
// fonction pour la premiere connexion a un serveur array
function req_array_dist($host, $port, $login, $pass, $db='', $prefixe='', $ldap='') {
$GLOBALS['array_rappel_nom_base'] = false;
# spip_log("Connexion vers $host, base $db, prefixe $prefixe "
# . ($ok ? "operationnelle sur $link" : 'impossible'));
return array(
'db' => $db,
'prefixe' => 'spip',
'link' => false,
'ldap' => '',
);
}
function array_get_var($table){
if (is_string($table) AND $t = unserialize($table))
$table = $t;
if(is_string($table) AND strpos($table,':')!==FALSE){
$iter = explode(':',$table);
if (count($iter)==2 AND is_numeric($iter[0]) AND is_numeric($iter[1]))
$var = range($iter[0],$iter[1]);
if (count($iter)==3 AND is_numeric($iter[0]) AND is_numeric($iter[1]) AND is_numeric($iter[2]))
$var = range($iter[0],$iter[2],$iter[1]);
return $var; // pas de copie necessaire
}
// $table doit toujours etre un array
if (!is_array($table)) return null;
// faisons une copie, sans le sous tableau recursif GLOBALS eventuel
$var = array();
foreach($table as $k=>$v)
if ($k !== 'GLOBALS')
$var[$k] = $v;
return $var;
}
function array_where_sql2php($where){
$where = preg_replace(",(^|\()([\w.]+)\s*REGEXP\s*(.+)($|\)),Uims","\\1preg_match('/'.str_replace('/','\/',\\3).'/Uims',\\2)\\4",$where); // == -> preg_match
$where = preg_replace(",([\w.]+)\s*=,Uims","\\1==",$where); // = -> ==
$where = preg_replace(";^FIELD\(([^,]+),(.*)$;Uims","in_array(\\1,array(\\2)",$where); // IN -> FIELD -> in_array()
$where = preg_replace(";(^|\(|\(\()([\w.]+)\s*IN\s*(.+)($|\)|\)\));Uims","in_array(\\2,array\\3",$where); // IN -> in_array()
return $where;
}
function array_where_teste($cle,$valeur,$table,$where){
if (is_array($valeur))
$valeur = serialize($valeur);
$where = preg_replace(array(
",(\W)$table\.cle(\W),i",
",(\W)cle(\W),i",
",(\W)$table\.valeur(\W),i",
",(\W)valeur(\W),i",
',NOT\(,i'
),
array(
"\\1'".addslashes($cle)."'\\2",
"\\1'".addslashes($cle)."'\\2",
"\\1'".addslashes($valeur)."'\\2",
"\\1'".addslashes($valeur)."'\\2",
"\\1!("
),$where);
return eval("if ($where) return true; else return false;");
}
function calculer_array_where($v)
{
if (!is_array($v))
return array_where_sql2php($v) ;
$op = array_shift($v);
if (!($n=count($v)))
return $op;
else {
$arg = calculer_array_where(array_shift($v));
if ($n==1) {
return "$op($arg)";
} else {
$arg2 = calculer_array_where(array_shift($v));
if ($n==2) {
return array_where_sql2php("($arg $op $arg2)");
} else return "($arg $op ($arg2) : $v[0])";
}
}
}
function array_query_filter($cle,$valeur,$table,$where){
static $wherec = array();
$hash = md5(serialize($where));
if (!isset($wherec[$hash])){
if (is_array($where))
$wherec[$hash] = implode("AND ",array_map('calculer_array_where',$where));
else
$wherec[$hash] = calculer_array_where($where);
}
return array_where_teste($cle,$valeur,$table,$wherec[$hash]);
}
function array_results($hash,$store='get',$arg=null){
static $array_results = array();
if($store=='get'){
if (isset($array_results[$hash]['res'])){
return each($array_results[$hash]['res']);
}
if (isset($array_results[$hash]['iter'])) {
$pas = $array_results[$hash]['iter']['pas'];
$valeur = $array_results[$hash]['iter']['debut']+$array_results[$hash]['iter']['i']*$pas;
if (($valeur>$array_results[$hash]['iter']['fin'] AND $pas>0)
OR ($valeur<$array_results[$hash]['iter']['fin'] AND $pas<0))
return false;
return array(++$array_results[$hash]['iter']['i'],$valeur);
}
return false;
}
elseif($store=='seek'){
if (isset($array_results[$hash]['res'])){
// pas de seek sur les tableaux, on emule avec reset+n each
reset($array_results[$hash]['res']);
$i=0;
while ($i++<intval($arg))
each($array_results[$hash]['res']);
return true;
}
if (isset($array_results[$hash]['iter'])) {
$array_results[$hash]['iter']['i'] = intval($arg);
return true;
}
return false;
}
elseif($store=='count'){
if (isset($array_results[$hash]['res']))
return count($array_results[$hash]['res']);
if (isset($array_results[$hash]['iter']))
return floor(($array_results[$hash]['iter']['fin']-$array_results[$hash]['iter']['debut'])/$array_results[$hash]['iter']['pas'])+1;
return false;
}
elseif($store=='free')
unset($array_results[$hash]);
else {
$hash = count($array_results)?max(array_keys($array_results))+1:1; // pas de 0 svp
// un tableau direct
if (is_array($store)){
$array_results[$hash]['res'] = $store;
reset($array_results[$hash]['res']);
}
elseif(is_string($store) AND strpos($store,':')!==FALSE){
$iter = explode(':',$store);
if (count($iter)==2 OR count($iter)==3)
$array_results[$hash]['iter']=array('debut'=>reset($iter),'fin'=>end($iter),'pas'=>count($iter)==2?1:$iter[1],'i'=>0);
}
return $hash;
}
}
// emulations array
function array_query($query){
// pas de jointure, que des requetes simples
// trouver le tableau de base, fourni en condition having
// c'est un hack ...
$table = null;
if (!is_array($query['having'])) return -1; // on arrive pas ici par une boucle !
foreach($query['having'] as $k=>$w){
if (reset($w)=='tableau')
$table = end($w);
}
// recuperer le pseudo nom de la table pour la condition where
if (is_array($query['from']))
if (count($query['from'])!==1)
return false;
else
$query['from'] = reset($query['from']);
$res = array_get_var($table); // recuperer la table
if (!$res OR !is_array($res))
$res = array();
// filtrons les resultats
if ($query['where']){
foreach($res as $k=>$v){
if (!array_query_filter($k,$v,$query['from'],$query['where']))
unset($res[$k]);
}