Valider b73a1e61 rédigé par Fil's avatar Fil
Parcourir les fichiers

suite de la pagination

* une seule boucle avec pagination intégrée (l'autre méthode marche encore, mais est-ce vraiment nécessaire ?)

* des ancres qui font que ça tourne

* sur un inclure ça marche si on met #SELF en paramètre d'inclusion (sinon gare aux problèmes de XSS) => exemple donné avec la pétition

* une nouvelle balise #ANCRE_PAGINATION si on veut mettre la pagination sous la liste des objets

* une nouvelle balise #GRAND_TOTAL qui fait le #TOTAL_BOUCLE hors limit


Reste à faire :
- nettoyer cette histoire de self() qui prend le var_mode=recalcul (??)
- étendre {pagination 50} par exemple pour fixer la taille de la fenêtre
- ???
parent 273a2498
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+5 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -98,9 +98,12 @@
			</div>
			</B_documents_joints>

			[(#REM) Petition ]
			[(#REM) Petition
				la petition ayant une PAGINATION il faut absolument
				lui passer SELF en argument.
			]
			[ #REM Conserver cet invalideur : (#PETITION|?{'',''}) ]
			<INCLURE{fond=inc-petition}{id_article}{debut_signatures}>
			<INCLURE{fond=inc-petition}{id_article}{self=#SELF}>

			[<div class="notes"><h2><:info_notes:></h2>#DEBUT_SURLIGNE(#NOTES)#FIN_SURLIGNE</div>]

+8 −13
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -4,16 +4,10 @@
[(#REM) Signatures de la petition ]
<B_signatures>
<div id="signatures">
	<B_signatures_decompte>
	[(#REM) S'affiche s'il y a pagination]
	<h2>#TOTAL_BOUCLE <:signatures_petition:></h2>
	[(#ENV{debut_signatures,0}|=={0}|?{'<strong>',<a href="[(#SELF|parametre_url{debut_signatures,''})]#signatures"[ title="(#DATE|affdate)"]>})] [(#TOTAL_BOUCLE|>={30}|?{'0',''})] [(#ENV{debut_signatures,0}|=={0}|?{'</strong>',</a>})]
	<BOUCLE_signatures_decompte(SIGNATURES){id_article}{par date} {inverse}>
	[|(#COMPTEUR_BOUCLE|modulo{30}|?{'',[(#COMPTEUR_BOUCLE|=={#ENV{debut_signatures,0}}|?{'<strong>',<a href="[(#SELF|parametre_url{debut_signatures,#COMPTEUR_BOUCLE})]#signatures"[ title="(#DATE|affdate)"]>})] #COMPTEUR_BOUCLE [(#COMPTEUR_BOUCLE|=={#ENV{debut_signatures,0}}|?{'</strong>',</a>})]})]
	</BOUCLE_signatures_decompte>
	[(#REM) S'affiche s'il n'y a pas de signature]
	<h2>0 <:signatures_petition:></h2>
	<//B_signatures_decompte>

	#ANCRES_PAGINATION

	<h2>#GRAND_TOTAL <:signatures_petition:></h2>

	<table summary="<:signatures_petition:>">
	<caption class="invisible"><:signatures_petition:></caption>
@@ -25,8 +19,7 @@
		</tr>
	</thead>
	<tbody>
	<BOUCLE_signatures(SIGNATURES) {id_article} {par date}{inverse}
	{debut_signatures,30}>
<BOUCLE_signatures(SIGNATURES) {id_article} {par date} {inverse} {pagination}>
		<tr>
		<td class="signature-date">[(#DATE|affdate)]</td>
		<td class="signature-nom">#NOM[<br /><a href="(#URL_SITE)" class="spip_out"><small>[(#NOM_SITE|sinon{[(#URL_SITE|couper{80})]})</small>]</a>]</td>
@@ -36,5 +29,7 @@
	</tbody>
	</table>

	[<p class="pagination">(#PAGINATION)</p>]

</div>
</B_signatures>
+3 −4
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -48,11 +48,10 @@

				[(#REM) Articles de la rubrique ]
				
				<BOUCLE_pages(ARTICLES) {id_rubrique} {par date}{inverse}></BOUCLE_pages>
				<p class="pagination" id="articles">#PAGINATION{_articles}</p>
				<//B_pages>
				
				<B_articles>

				[<p class="pagination">(#PAGINATION)</p>]

				<h2 class="invisible"><:articles_rubrique:></h2>
				<ul>
					<BOUCLE_articles(ARTICLES) {id_rubrique} {par date}{inverse}{pagination}>
+29 −14
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -2648,12 +2648,14 @@ function form_hidden($action) {
	return $hidden;
}

function pagination($total, $debut, $pas) {
function pagination($total, $nom, $pas, $liste = true) {
	global $pagination_item_avant, $pagination_item_apres, $pagination_separateur;
	global $pagination_max, $pagination_max_texte;
	tester_variable('pagination_separateur', '&nbsp;| ');
	tester_variable('pagination_max_texte', '...');

	$debut = 'debut'.$nom;

	$pagination = array(
		'lien_base' => self(),
		'total' => $total,
@@ -2664,6 +2666,9 @@ function pagination($total, $debut, $pas) {
		'lien_pagination' => '<a href="@url@">@item@</a>'
	);

	$ancre='pagination'.$nom;
	$bloc_ancre = unique("<a name='$ancre' id='$ancre'></a>");

	if($pagination_max == 0 OR $pagination_max>=$pagination['nombre_pages']) {
		$premiere = 1;
		$derniere = $pagination['nombre_pages'];
@@ -2678,20 +2683,30 @@ function pagination($total, $debut, $pas) {
		$texte_apres = $derniere<$pagination['nombre_pages'] ? ' '.$pagination_max_texte : '';
	}


	// Pas de pagination
	if($pagination['nombre_pages']<=1)
		return '';

	// liste = false : on ne veut que l'ancre
	if (!$liste)
		return $bloc_ancre;

	// liste  = true : on retourne tout (ancre + bloc de navigation)
	$texte = '';
	if($pagination['nombre_pages']>1) {
	for($i = $premiere;$i<=$derniere;$i++) {
		$url = parametre_url($pagination['lien_base'], $debut, strval(($i-1)*$pas));
		$_item = strval($i);
		$item = ($i != $pagination['page_courante']) ?
				preg_replace(array(',@url@,', ',@item@,'), array($url, $_item), $pagination['lien_pagination']) :
			preg_replace(
				array(',@url@,', ',@item@,'),
				array($url.'#'.$ancre, $_item),
				$pagination['lien_pagination']) :
			$_item;
		$texte .= $pagination_item_avant.$item.$pagination_item_apres;
		if($i<$pagination['nombre_pages']) $texte .= $pagination_separateur;
	}
		return $texte_avant.$texte.$texte_apres;
	}
	return '';
	return $bloc_ancre.$texte_avant.$texte.$texte_apres;
}

### fonction depreciee, laissee ici pour compat ascendante 1.9
+47 −18
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -558,8 +558,9 @@ function balise_POPULARITE_dist ($p) {

// #PAGINATION
// http://www.spip.net/fr_articleXXXX.html
function balise_PAGINATION_dist($p) {
function balise_PAGINATION_dist($p, $liste='true') {
	$b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];

	if ($b === '') {
		erreur_squelette(
			_T('zbug_champ_hors_boucle',
@@ -567,27 +568,55 @@ function balise_PAGINATION_dist($p) {
			), $p->id_boucle);
		$p->code = "''";
	}
	elseif (!$p->param || $p->param[0][0]) {
		erreur_squelette(
			/*_T('zbug_champ_manquant',
				array('champ' => '#PAGINATION')*/
			_L('param&eacute;tre manquant pour #PAGINATION')
			, $p->id_boucle);
		$p->code = "''";
	}
	else {
		$nom_boucle = calculer_liste($p->param[0][1],

	if ($p->param) {
		$option = calculer_liste($p->param[0][1],
			$p->descr,
			$p->boucles,
			$p->id_boucle);
  $nom_boucle = str_replace("'", '', $nom_boucle);
  $pas = _PAS>0 ? _PAS : 10;
		$option = str_replace("'", '', $option);
	}

	$pas = _PAS > 0 ? _PAS : 10;
	$p->boucles[$b]->numrows = true;
		$p->code = "pagination(\$Numrows['$b']['total'],'debut".$nom_boucle."',".$pas.")";

	if ($option)
		$nom_boucle = $option;
	else
		$nom_boucle = $b;

	$p->code = "pagination(
	(isset(\$Numrows['$b']['grand_total']) ?
		\$Numrows['$b']['grand_total'] : \$Numrows['$b']['total']
	), '$nom_boucle', $pas, $liste)";

	$p->interdire_scripts = false;
	return $p;
}

	$p->interdire_scripts = true;
// N'afficher que les ancres de la pagination (au-dessus, par exemple, alors
// qu'on mettra les liens en-dessous de la liste paginee)
function balise_ANCRES_PAGINATION_dist($p) {
	$p = balise_PAGINATION_dist($p, $liste='false');
	return $p;
}

// equivalent a #TOTAL_BOUCLE sauf pour les boucles paginees, ou elle
// indique le nombre total d'articles repondant aux criteres hors pagination
function balise_GRAND_TOTAL_dist($p) {
	$b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
	if ($b === '' || !isset($p->boucles[$b])) {
		erreur_squelette(
			_T('zbug_champ_hors_boucle',
				array('champ' => "#$b" . 'TOTAL_BOUCLE')
			), $p->id_boucle);
		$p->code = "''";
	} else {
		$p->code = "(isset(\$Numrows['$b']['grand_total'])
			? \$Numrows['$b']['grand_total'] : \$Numrows['$b']['total'])";
		$p->boucles[$b]->numrows = true;
		$p->interdire_scripts = false;
	}
	return $p;
}

Chargement en cours