Gå til innhold

Prosjekt: kalender (hva må til)


Anbefalte innlegg

Jeg vil gjerne ha en liten kalender som viser en måned med klikkbare datoer.

 

Målet er at den skal se slik ut:

 

cal.jpg

 

CSS-biten er grei, foreløpig er det viktigste å få kalenderen til å vise rett måneder, datoer, uker og rett markering av søn- og helligdager. Jobber aktivt med saken i dette øyeblikk, oppdaterer posten så snart jeg står fast.

 

Første utfordring: Hvordan få ukedagene til å starte rett? I eksempelet er 1. på en plass midt i uken. Hvordan løse det?

Endret av fjartan
Lenke til kommentar
Videoannonse
Annonse

Jeg anbefaler deg til å se på getdate-funksjonen HER. Du kan se om du skjønner selv, ellers kan jeg godt forklare videre! :cool:

 

(Regner med at du vil gjøre så mye som mulig selv)

 

EDIT:

Glemte mktime-funksjonen. Kan være nyttig den og. HER!. Brukte den sammen med getdate for å finne første dagen i måneden.

Endret av TiMMi-
Lenke til kommentar

For lenge siden når jeg holdt på å lære meg php skrev jeg en kalender, koden kan skrives mye bedre - men den gir deg kanskje noen ideer.

 

<?php

$monthname = array("", "Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember");
$day = date("d");
$month = date("m");
$year = date("Y");

$first_day_of_month = date("w", mktime (0,0,0,$month,1,$year));

if($first_day_of_month == 0)
   $first_day_of_month = 7;

$days_in_month = cal_days_in_month(CAL_GREGORIAN, $month, $year);

echo "<table border=\"1\" cellspacing=0>\n  <tr>\n    <td colspan=7>\n      <center><b>".$monthname[$month]." ".$year."</b></center>\n    </td>\n  </tr>\n  <tr>\n";
echo "    <td>\n      Man\n    </td>\n    <td>\n      Tirs\n    </td>\n    <td>\n      Ons\n    </td>\n    <td>\n      Tors\n    </td>\n    <td>\n      Fre\n    </td>\n    <td>\n      Lør\n    </td>\n    <td>\n      Søn\n    </td>\n";

$the_day = 0;

for($i = 1; $i < $days_in_month + $first_day_of_month; $i++){
   if($i%7==1){
       echo "</tr><tr>";
   }
   if($first_day_of_month > $i){
       echo "<td>-</td>";
   }else{
       $the_day++;
       echo "<td>$the_day</td>";
   }
}

while($i%7!=1){
echo "<td>-</td>";
$i++;
}
echo "</table>"


?>

 

EDIT:

for å finne første dagen i måneden, dvs. ukedagen, bruker du bare date("w", timestamp);

Endret av ????????
Lenke til kommentar

hmz... det må være lenge siden, for funksjonen cal_days_in_month() gir meg feilmelding - Fatal error: Call to undefined function: cal_days_in_month() - når jeg forsøker å kjøre skriptet.

 

edit: rart, finner jo funksjonen i manualen. Har phpv- 4.3.6

Endret av fjartan
Lenke til kommentar

Den funksjonen tror jeg at jeg la til senere, men det er uansett lenge siden jeg redigerte på det.

 

Du kan løse det lett likevel, bare lag en array med antallet dager i måneden og så slår du opp i manualen på date() og finner funksjonen for skuddår (leap year). Hvis det er skudd år så legger du bare til en dag ekstra i februar. Eventuelt så kan du bare bruke mktime, sette dagen til 0 og måneden +1. F.eks.:

$days_in_month = date("d", mktime(0,0,0,date("m")+1, 0, date("y")));

Som sagt så er det lenge siden jeg lagde det scriptet, og det er mye som kan forbedres.

 

Edit:

Måtte teste scriptet, og det fungerer bra på PHP 4.3.7 - uten spesielle endringer i ini filen.

Endret av ????????
Lenke til kommentar

http://www.sindrem.com/vis_side.php?site=php/sites/cal.php - Denne er en mulighet, men vil sannsynligvis ikke fungere siden de færrste lar brukerene få kjøre egne kommandoer på serveren.

 

fjartan: Grunnen til at ikke funksjonene fungerer til deg, er at alle kalenderfunksjonene inkluderes i en såkalt tillegspakke (extension). Står mer om dette her: http://no2.php.net/manual/en/ref.calendar.php

 

Du burde finne noen scripts du kan bruke på www.hotscripts.com, om du ikke tar utfordringen selv, noe som er mye morsommere.

Lenke til kommentar

hups, et spørsmål til:

 

i en database er det lagret events med unix timestamp. Hvordan kan jeg enklest hente ut events i en spesiell dato? På hver dato i kalenderen kan man klikke for å få opp events. Variabler som sendes er $vis_dato, $vis_maned og $vis_ar.

Lenke til kommentar

Tar jeg ikke helt feil blir hver events lagret i unix timestamp hvor også minutter, timer og kanskje sekunder også inngår.

 

Derfor må du finne alle innleggene med et timestamp som er lik eller mer enn 00:00, og mindre enn 24:00 (24 og 00 er egentlig det samme. Men 24 indikerer i dette tilfellet at det er helt på slutten av en dag, altså 00 i en ny dag).

 

Det gjør du f.eks slik:

$begynnelse = mktime ( 0, 0, 0, $vis_maned, $vis_dato, $vis_ar);

$slutt= mktime ( 0, 0, 0, $vis_maned, $vis_dato + 1, $vis_ar);

 

Nå har du begynnelsen og slutten av dagen i unix timestamps. Så tar du en simpel select spørring.

 

SELECT * from tabell where dato >= $begynnelse and dato < $slutt

Lenke til kommentar

Du behøver ikke å bruke mktime, som RipZ- foreslår, mysql har en egen funksjon for dette: UNIX_TIMESTAMP()

 

Videre for å få farger på annen hver linje er ikke array noen god løsning, ta heller utgangspunktet i denne delen av koden:

if($i%7==1){

echo "</tr><tr>";

}

Legg til en variable som hver gang plusses med 1.

if($var%2==1){

echo "</tr><tr>";

}else{

echo "</tr><tr bgcolor="en eller annen farge">";

}

Lenke til kommentar

personlig liker jeg itereringen

 

$color = ( $i = 1 - $i ) ? "#505050" : "#a0a0a0";

 

... da den har en lineær algebra analogi, og derfor gir en pekepin på hvordan man kan gå fram for å iterere over flere verdier enn to (en og null) hvis ønskelig, men det blir litt perifert.

 

for eksemplet over er det bedre å bruke $i = !$i, men alternativet med mod operatoren ( ++$i % 2 ) er like bra.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...