Oggi mi sono trovato di fronte a un’esigenza un po’ particolare: per un piccolo motore di ricerca di articoli, creare un menù a tendina (select) per scegliere il mese di pubblicazione. La difficoltà sta nel realizzare un array ben curato con i valori da ciclare per poi creare il citato menù a tendina.

Il menù a tendina, ovviamente, di default dovrebbe partire dal momento attuale (cioè mese e anno corrente) e arrivare fino al mese di apertura del sito. Ad esempio, posto che l’eventuale sito abbia aperto a giugno 2010 e visto che ora siamo in aprile 2012, i valori dovrebbero essere questi:

aprile 2012
marzo 2012
febbraio 2012
gennaio 2012
dicembre 2011
...
agosto 2010
luglio 2010
giugno 2010

Dovrebbe tuttavia permettere anche di indicare valori di partenza e/o di arrivo diversi, oltre a quelli di default. Di seguito, la funzione che ho scritto, ben commentata (non dovrebbe necessitare di ulteriori spiegazioni):

/**
* Restituisce un array dei mesi (accompagnati dall'anno) in cui possono essere stati pubblicati degli articoli
* (l'array ha chiavi come "2012-02" e valori come "febbraio 2012")
* @param int $final_month Mese di arrivo. Se non indicato, letto dalla configurazione
* @param int $final_year Anno di arrivo. Se non indica, letto dalla configurazione
* @param int $starting_month Mese di partenza. Se non indicato, impostato all'attuale
* @param int $starting_year Anno di arrivo. Se non indicato, impostato all'attuale
* @return array Array dei mesi
*/
function getPublicationMonths($final_month = null, $final_year = null, $starting_month = null, $starting_year=null) {
	//Se non è stato passato il mese o l'anno di arrivo, imposta dalle constanti di configurazione
	$final_month = !is_null($final_month) ? $final_month : FINAL_MONTH;
	$final_year = !is_null($final_year) ? $final_year : FINAL_YEAR;

	//Se non è stati passato il mese o l'anno di partenza, imposta al momento attuale
	$starting_month = !is_null($starting_month) ? $starting_month : date('n');
	$starting_year = !is_null($starting_year) ? $starting_year : date('Y');

	//Prepara l'array in cui inserire i dati
	$data = array();

	//Cicla i dati. Il ciclo ha fine quando vengono raggiunti mese e anno di arrivo
	while($starting_year != $final_year || $starting_month+1 != $final_month) {
		//Se il mese è valido (>=0), aggiunge i dati all'array
		if($starting_month) {
			$data[$starting_year.'-'.date('m', mktime(0, 0, 0, $starting_month))] = strftime('%B', mktime(0, 0, 0, $starting_month)).' '.$starting_year;
			$starting_month -= 1;
		}
		//Se il mese non è valido, imposta il mese a dodice e decrementa l'anno
		else {
			$starting_month = 12;
			$starting_year -= 1;
		}
	}

	return($data);
}

Giusto un aspetto che potrebbe non essere chiaro: se non viene indicato il mese e/o l’anno finali, utilizza le constanti FINAL_MONTH e/o FINAL_YEAR (che si suppone siano state già state impostate altrove e che riportano appunto mese e anno di apertura del sito. Comunque, nulla di impedisce di fare una query per selezionare l’articolo più vecchio e estrarre i dati da lì); se non viene indicato il mese e/o l’anno di partenza, utilizza mese e anno attuali.

Quindi, lanciandola così:

getPublicationMonths('6', '2010');

(equivale a dire: da oggi (aprile 2012) a giugno 2010)

E utilizzando un altro ciclo per creare l’html del menù a tendina (perché la funzione restituisce solo un array), il risultato è questo:

<select>
	<option value="">-- data --</option>
	<option value="2012-04">aprile 2012</option>
	<option value="2012-03">marzo 2012</option>
	<option value="2012-02">febbraio 2012</option>
	<option value="2012-01">gennaio 2012</option>
	<option value="2011-12">dicembre 2011</option>
	<option value="2011-11">novembre 2011</option>
	<option value="2011-10">ottobre 2011</option>
	<option value="2011-09">settembre 2011</option>
	<option value="2011-08">agosto 2011</option>
	<option value="2011-07">luglio 2011</option>
	<option value="2011-06">giugno 2011</option>
	<option value="2011-05">maggio 2011</option>
	<option value="2011-04">aprile 2011</option>
	<option value="2011-03">marzo 2011</option>
	<option value="2011-02">febbraio 2011</option>
	<option value="2011-01">gennaio 2011</option>
	<option value="2010-12">dicembre 2010</option>
	<option value="2010-11">novembre 2010</option>
	<option value="2010-10">ottobre 2010</option>
	<option value="2010-09">settembre 2010</option>
	<option value="2010-08">agosto 2010</option>
	<option value="2010-07">luglio 2010</option>
	<option value="2010-06">giugno 2010</option>
</select>

Che, graficamente, si traduce in questo:

Menù a tendina con mesi

Come potete vedere dall’output html di cui sopra, il valore selezionato sarà nel formato (formato di date()):

Y-m

Mentre i valori dell’array sono in questo formato (chiave => valore):

Y-m => F Y

XHTML - Puoi usare questi tag: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>