Paginazione Helper: Tool per la gestione contenuti

31 Mar 2019 | M.A.D.R.

Quante volte ci siamo imbattuti in orrendi errori delle nostre pagination? Oggi parliamo appunto di Pagination Helper per la Paginazione.

Spesso accade che la nostra applicazione necessiti, per ovvi motivi di spazio e leggibilità, di una paginazione (pagination) dei contenuti e/o una navigazione tra articoli in modo del tutto automatico, il risultato però spesso è molto deludente.

La paginazione seppur apparentemente semplice, nasconde delle particolarità non sempre accessibili ad un novello programmatore, difatti spesso si ricorre a forum con domande del tipo: "HELP: Paginazione contenuti non funziona"...

Questo comportamento apparentemente sembrerebbe essere un piccolo problema di scrittura del codice, ma non è del tutto vero...

Immaginiamo di utilizzare le semplici $_GET...

Semplice, una gestione veramente semplice anche se al solo pensiero di dover riscrivere ogni volta la logica di recupero pagina spesso si abbandona l'idea...

Oggi siamo qui per discutere, esaminare e capire come possiamo rendere il nostro script veramente veloce e indipendente...

Cosa ci occore?

Un pò di pazienza, tanta voglia di scoprire cose nuove, il nostro piccolissimo tool, ed altri strumenti reperibili sempre su https://chicweb.it

Partiamo subito spiegando la filosofia del nostro tool:

Prima analisi:

  • L'applicazione utilizzerà la $_GET oppure url rewrite?
  • Se utilizzassi $_GET come si chiamerà la nostra variabile atta a contenere la paginazione dell'applicazione?"
  • Se utilizzassi l'url rewrite in quale posizione dovrò andare a prendere la variabile?

Risolti alcuni dubbi, vediamo subito una funzioncina che sarà la nostra base di partenza per la definizione di alcuni punti:

function cg_Pgt(){
	return $define_pagination=
		[
			'query'=>'page',
			'is_query_string'=>true,
			'is_positional'=>false,
			'position_page'=>'last' //accept number or first,last
		];
}

Come notate la funzione cg_Pgt() non fa altro che tornare una variabile di tipo array con alcune chiavi importanti.

  • In primo luogo troviamo "query" ossia la definizione della nostra $_GET per il recupero della paginazione
  • "is_query_string" è la nostra scelta di utilizzare la $_GET secca o meno, i valori sono booleani
  • "is_positional" è la controparte per l'url rewrite come sopra saranno solo valori boolenai
  • "pasition_page" identifica in quale parte dell'url riscritto trovare il nostro parametro di paginazione
    • Es: /controller/category/page
    • In questo banalissimo esempio potremmo navigare semplicemente indicando che la nostra posizione di default per la paginazione è "last".

Perchè si è utilizzato "last" - "first"?

Semplicemente per evitare di bloccare in modo statico un posizionamento.

In questo modo diamo la possibilità al programmatore di avere "n" profondità di navigazione senza doversi preoccupare di recuperare ogni volta l'elemento corrente di paginazione.

Consiglio

Mettere la paginazione sempre alla fine facilita la gestione e il reperimento delle informazioni non solo al programmatore ma anche ai motori di ricerca.

Il CORE

Vediamo subito come si comporta il nostro snippet per recuperare la nostra pagina corrente

if(!function_exists('current_page')){
	function current_page(){
		$def=cg_Pgt();
		if(!function_exists('current_query'))include_once __DIR__.'/url_helper.php';
		$current=0;
		if($def['is_query_string']){
			parse_str(current_query(),$query);
			$current=$query[$def['query']]??0;
		}
		if($def['is_positional']){
			$all_p=uri_segment_array();
			$current_position=0;
			($def['position_page']=='last')?$current=count($all_p)-1:($def['position_page']=='first')?$current=0:(is_int($def['position_page']))?$current_position=$def['position_page']:null;
			$current=$all_p[$current_position]??0;
		}
		return $current;
	}
}

Vediamo subito le prime 2 linee della funzione che rispettivamente sono : Ottiene la configurazione dalla funzione cg_Pgt() ed include il file di utility url_helper che serve a parsare la richiesta correte.

Ultimo passo è la creazione dei nostri url dati dalla funzione "create_pagination", dove saranno necessari 2/3 parametri in base alle necessità.

Vediamo subito che il primo parametro è la base url dalla quale partire, mentre max è il numero massimo di pagine che avremo ed infine abbiamo la pagina corrente che possiamo evitare di aggiungerla in quanto lo script richiamerà esattamente la funzione sopra.

Il valore di ritorno sarà di tipo "array" , quindi il nostro output sarà come mostrato in figura.

/**
 * Copyright (c) 2019. Licenza Open Source - public domine
 * Il codice di questo file è reso disponibile secondo le regole vigente e con licenza d'uso PD.
 * Il codice riportato è un programma di cui codice sorgente è reso disponibile completo di tutte le sue
 * funzionalità e può essere modificato secondo le proprie esigenze.
 * Qualora il codice risultasse copiato su altri portali senza citarne la fonte saranno applicate tutte le
 * disposizioni in materia di Proprietà Intellettuale.
 */
/**
 * Created by phpS
 * User: macus_adi
 * Project Name: utils_git
 * File: pagination_helper.php
 * Path: root/helper/pagination_helper.php
 * Date: 17/02/2019
 * Time: 08:45
 */

function cg_Pgt(){
	return $define_pagination=
		[
			'query'=>'page',
			'is_query_string'=>true,
			'is_positional'=>false,
			'position_page'=>'last', //accept number or first,last,
			'item_number_display'=>1,
		];
}
if(!function_exists('current_page')){
	function current_page(){
		$def=cg_Pgt();
		if(!function_exists('current_query'))include_once __DIR__.'/url_helper.php';
		$current=0;
		if($def['is_query_string']){
			parse_str(current_query(),$query);
			$current=$query[$def['query']]??0;
		}
		if($def['is_positional']){
			$all_p=uri_segment_array();
			$current_position=0;
			($def['position_page']=='last')?$current=count($all_p)-1:($def['position_page']=='first')?$current=0:(is_int($def['position_page']))?$current_position=$def['position_page']:null;
			$current=$all_p[$current_position]??0;
		}
		return $current;
	}
}
if(!function_exists('create_pagination')){
	function create_pagination($base_url,$max_,$current_=-1){
		$def=cg_Pgt();
		if($current_==-1)$current_=current_page();
		$pagination=[];
		$min=0;$max=0;
		($current_-3>=0)?$min=$current_-3:$min=0;
		$max=$min+$def['item_number_display']+2;
		($max>$max_)?$max=$max_:null;
		($max==$min)?$max=$def['item_number_display']+2:null;
		for($i=$min;$i<$max;$i++){
			$pagination[$i]=
				[
					'page'=>$i,
					'url'=>$base_url,
					'active'=>false,
					'class'=>'link-nav'
				];
			if($def['is_query_string']){
				$pagination[$i]['url'].='?'.$def['query'].'='.$i;
			}else{
				$pagination[$i]['url'].='/'.$i;
			}
			($i==$current_)?$pagination[$i]['active']=true:null;
		}
		return $pagination;
	}
}

Soluzioni complete per ogni esigenza