Newsgroup: it.comp.www.php
Titolo: Realizzare un calendario per blog da zero

Salve ragazzi,
sto sviluppando il mio blog da zero. Per favore, non mi dite "stai
reinventando la ruota", perché ho la necessità di sviluppare un
prodotto con delle caratteristiche personali. Certo, potrei modificare
il codice di un qualche blog già esistente, ma le modifiche sarebbero
troppe e perderei lo stesso tempo a capire come funziona il codice.
Adesso devo realizzare un calendario: se clicchi sulla data, ti apre
tutti gli articoli che riportano quella data. Ovviamente, devono
essere linkabili solo le date nelle quali è stato scritto un articolo.
Non so se avete capito...
Ora, penso che la soluzione più semplice sia questa:
fare una select sul campo delle date con un where che mi controlla che
la data sia superiore al primo del mese e inferiore all'ultimo del
mese corrente.
Trasformare i timestamp in date e ficcarli in un array, rimuovendo i
doppi.
Mi ritrovo un bell'array con tutte le date in cui è stato scritto
almeno un articolo.
Tuttavia, mi chiedo se è un operazione leggera, e penso di no,
sopratutto se si pubblicano molti articoli, non è così?
Secondo voi, c'è una soluzione, anche più complessa, che però sia più
leggera?
Io pensavo che si potrebbe fare così:
un file di testo per ogni mese.
Ogni volta che si pubblica un articolo, salvo la data nel file di
testo, controllando se è già presente (così evito di eliminare le date
doppie).
Per il calendario, estraggo le date dal file di testo e ho il mio
array.
Consigli? Suggerimenti? Proposte di tecniche migliori?

 sopratutto se si pubblicano molti articoli, non è così?
Quale parte ti preoccupa ? 
Credo sia possibile dal db farsi restituire i valori unici, in questo 
modo avresti direttamente l'array con i giorni per creare i link. Dì che 
db usi e vediamo qualcuno più ferrato di me se ci illumina.
Io sto approcciando CakePHP, il tutorial è proprio "Facciamo il nostro 
blog con abbondante colla vinilica", magari ti può interessare...

 troppe e perder
eoni fa avevo fatto questo, dovrebbe essere ok per te:
<?php
function calendario($mese,$anno){
if ($_GET['x'] == NULL){
$mese_ = $mese;
$anno_ = $anno;
}
else{
$mese_ = (int)strftime( "%m" ,(int)$_GET['x']);
$anno_ = (int)strftime( "%Y" ,(int)$_GET['x']);
}
$prev = mktime(0, 0, 0, $mese_ -1, 1, $anno_);
$next = mktime(0, 0, 0, $mese_ +1, 1, $anno_);
$human_month = array("error", "Gennaio", "Febbraio", "Marzo", "Aprile",
"Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre",
"Dicembre" );
$settimana = array("Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Dom");
$colonne = 7;
$giorni = date("t",mktime(0, 0, 0, $mese, 1, $anno)); //giorni del
mese in questione
$primo_lunedi= date("w",mktime(0, 0, 0, $mese, 1, $anno)); 
if($primo_lunedi==0){
$primo_lunedi = 7; //siamo mica americani
}
print("<table width=\"210\" colspacing=\"0\" border=\"0\">"); //table
print("\n\t<tr height=\"20\" class=\"txtredB\">\n\t\t<td colspan=\""
$colonne."\" align=\"center\"><a href=\"?x=".$prev."\">&lt;&lt;</a> <span
class=\"txtwhiteB\">".$human_month[(int)$mese]." ".$anno_."</span> <a
href=\"?x=".$next."\">&gt;&gt;</a></td>\n\t</tr>"); //mese/anno
foreach($settimana as $val){
print("\n\t\t<td height=\"20\" class=\"txtwhiteB\">".$val."\t</td>");
}
print("</tr>");
for($i = 1; $i<$giorni+$primo_lunedi; $i++){
if($i%$colonne+1==0){
print("\n\t<tr>");
}
if($i<$primo_lunedi){
print("\n\t\t<td>&nbsp;</td>");
}
else{
$giorno_= $i-($primo_lunedi-1);
$a = strtotime(date($anno_."-".$mese_."-".$giorno_));
$b = strtotime(date("Y-m-d"));
/* uncomment when debugging
print($giorno_."-".$mese_."-".$anno_);
print(" -> ");
print(strftime("%d-%m-%Y",$a));
//print($a);
print(" -> ");
print(strftime("%d-%m-%Y",$b));
//print($b);
print("<br>");
*/
if($a != $b){
print("\n\t\t<td class=\"txtredB\"><a href=\"?x=".$a."\">"
$giorno_."</a></td>");
}
else{
print("\n\t\t<td><a href=\"?x=".$a."\"><span class=\"txtwhiteB\">"
$giorno_."</span></a></td>");
}
}
if($i%$colonne==0){
print("\n\t</tr>");
}
}
print("\n\t<tr height=\"30\">&nbsp;\n\t</tr>");
print("\n</table>");
}
?>
-- 
there is no real life, only AFK

 blog con abbondante colla vinilica", magari ti può interessare...
Mi fa piacere che non sono l'unico sulla barca, LOL

 eoni fa avevo fatto questo, dovrebbe essere ok per te:
Scusami, penso che domani gli darò un'occhiata, ora non ho la forza di
mettermi a capire cosa fa il codice o no :) (questo è il problema per
cui preferisco sviluppare da 0: non capisco mai gli script altrui).
Tra l'altro io ho il template l'ho già preparato (LoL), vedrò se
adattabile!

Mirko wrote:

quel coso che avevo fatto non lo capirei nemmeno io! ma so che funziona.
quel che puoi fare tu per iniziare è cercare di farlo partire, poi
collegarlo a un array restituito da mysql in cui ci sono i giorni con
contenuti.
ciao


 A che pro?
fai una tabella di appoggio con all'interno solo i giorni in cui c'è almeno
un post.


 Mi fa piacere che non sono l'unico sulla barca, LOL
Io non sto facendo un blog, sto solo leggendo il tutorial di CakePHP.

 diversi?
Usi le funzioni di data messe a disposizione del database.
Qualcosa tipo
select distinct(day(dataarticolo)) as giorno, count(id) as numero from 
articoli where dataarticolo>[iniziodelmese] and dataarticolo<[finedelmese] 
group by day(dataarticolo)
L'ho buttata giu` al volo senza testarla. Occhio! :)
Bye.

 un post.
Insomma, quello che avevo pensato io al primo messaggio, però con un
file di testo al posto del db, tanto il risultato è lo stesso :p
p.s. grazie per lo script, però il mio problema era creare l'array,
non visualizzarlo... ma mi tornerà senz'altro utile!


Proverò, se funziona mi hai risolto un grosso problema :D

 
ti consiglio il db di gran lunga una struttura tipo
giorno     | numero_post
01-12-2006   2
01-13-2006   2
01-15-2006   1
metti un indice su giorno e sei a posto


 01-15-2006   1
Perché queste date all'americana ?

Andrea D'Amore wrote:

oh sì, non fa alcuna differenza all'atto pratico.
io uso personalmente questo formato:
2007-01-13 02:46:34
ciao


 2007-01-13 02:46:34
Ecco così l'ordinamento alfabetico è anche cronologico, come in mysql 
(mi sembra).