Flagdage
Jeg har ikke en flagstang; men ville gerne hejse flaget pÄ min webside. Derfor skrev jeg en PHP-sag, der viser Dannebrog og hvad vi flager for.
Brug dannebrog pÄ din egen webside
Du kan automatisk flage med Dannebrog pÄ din egen webside. IndsÊt denne iframe i din websides html:
<iframe src="https://multimusen.dk/flag/flag.php" style="height=200px;"></iframe>
Du behÞver ikke at gÞre andet end det. Siden viser kun et flag pÄ en flagdag. Hvis den er blank er det altsÄ forklaringen.
De fÞlgende afsnit forklarer, hvordan PHP-koden virker. Hvis det lyder lidt for nÞrdet, sÄ drop resten af denne artikel.
Klassen flagdag
Men hvordan fungerer denne PHP-kode sÄ? FÞrst har jeg defineret en klasse, der indeholder de vigtigste funktioner (der er kun to funktioner):
class flagDag { // printer hvis dagen er en flagdag public function dag($dato, $maaned, $hvad) { $flagstang = "dannebrog.gif"; // stien til billedet af Dannebrog // undersÞger om det er en flagdag if (date('m') == $maaned && date('d') == $dato) { echo "<img src='" . $flagstang . "' alt='Dannebrog' width='50' height='38' >"; // kan skaleres efter behov echo "<p style='font-size:smaller'>I dag flages for: " . $hvad . "</p>"; } } // sÄdan: plusTid('+3 weeks +5 days'); function fePaaske($tid, $hvad) { // Denne funktion beregner dato for skÊve helligdage $date = date("Y-m-d", easter_date()); // pÄskedag $newdate = strtotime ( $tid, strtotime ( $date ) ) ; // her plus-minuses $newdate = date ( 'd,m' , $newdate ); // datoen formatteres return $newdate . "," . $hvad; // udskriver resultatet } }
Dannebrog vises ved hjĂŠlp af denne funktion:
public function dag($dato, $maaned, $hvad) { $flagstang = "dannebrog.gif"; // stien til billedet af Dannebrog // undersĂžger om det er en flagdag if (date('m') == $maaned && date('d') == $dato) { echo "<img src='" . $flagstang . "' alt='Dannebrog' width='50' height='38' >"; // kan skaleres efter behov echo "<p style='font-size:smaller'>I dag flages for: " . $hvad . "</p>"; } }
Funktionen bruger $dato og $maaned til at definere datoen. $hvad er en kort beskrivelse af begivenheden. NĂ„r dagen og mĂ„neden indtrĂŠffer vises et flag (dannebrog.gif) samt den korte beskrivelse af begivenheden, fx “H.K.H. Prins Joachim”.
Herefter var det kun et spÞrgsmÄl om at instantiere klassen:
$ny = new flagDag(); // instantierer klassen
… og om at definere diverse flagdage, som fremgĂ„r af kalenderen hos Danmarks-Samfundet. Flagdagen defineres sĂ„dan:
$ny->dag(01,01,"NytÄrsdag");
PĂ„skeproblemet
De “kalenderfaste” flagdage var relativt simple. Det er straks vĂŠrre med pĂ„sken, der fĂžlger en relativt kompleks mĂ„nekalender. da.wikipedia.org skriver at pĂ„sken falder sĂ„dan:
PÄskedag er den fÞrste sÞndag efter fÞrste fuldmÄne efter forÄrsjÊvndÞgn.
Beregning af pÄskedagene krÊver altsÄ viden om jÊvndÞgn, og hvornÄr det er fuldmÄde. Heldigvis har PHP en funktion, der beregner pÄskedagen, nemlig easter_date().
PÄ nettet fandt jeg en metode til at lÊgge tid til en dato, en den funktionalitet byggede jeg sÄ ind i denne funktion:
function fePaaske($tid, $hvad) { // Denne funktion beregner dato for skÊve helligdage $date = date("Y-m-d", easter_date()); // pÄskedag $newdate = strtotime ( $tid, strtotime ( $date ) ) ; // her plus-minuses $newdate = date ( 'd,m' , $newdate ); // datoen formatteres return $newdate . "," . $hvad; // udskriver resultatet }
Kirkens pÄskedag er bestemmende for en hel rÊkke helligdage, der falder lidt forskelligt fra Är til Är. Systemet ser sÄdan ud:
- PalmesĂžndag – sĂžndagen fĂžr pĂ„ske (pĂ„ske minus en uge)
- SkĂŠrtorsdag – pĂ„ske sĂžndag minus 3 dage (Halv stang t. kl. 12:00)
- 1. pĂ„skedag – pĂ„skesĂžndagen
- 2. pĂ„skedag – pĂ„ske sĂžndag + en dag
- Store Bededag – 4. fredag efter pĂ„ske
- Kristi Himmelfart – 6. torsdag efter skĂŠrtorsdag
- 1. pinsedag – 7. sĂžndag efter pĂ„ske
- 2. pinsedag – pinsedag + 1dag
Julen falder heldigvis pĂ„ faste datoer, sĂ„ det er til at have med at gĂžre…
- 1. juledag – fast dato 25.12.
- 2. juledag – fast dato 26.12.
Ved hjÊlp af min funktion kan man lÊgge Är, dage, uger og mÄneder til pÄskedagen. Og derfor bliver beregningen af fx. 1. pinsedag relativt simpel:
$fPin = $ny->fePaaske("+7 weeks", "1. Pinsedag"); // 1. Pinsedag
Men scriptet returnerer en streng og funktionen, der viser en falgdag krĂŠver to tal og en streng. En streng kan forvandles til et tal med (int); men jeg har kun brug for en del af strengen. Dagen og mĂ„neden skal isoleres ved hjĂŠlp af substring. Det leder frem til denne magiske formular, der viser flaget pĂ„ de “skĂŠve” helligdage:
$ny->dag((int)substr($fPin,0,2), // 1. Pinsedag (int)substr($fPin,3,4), substr($fPin,6) );
Den ovenstÄende kode skulle skrives 8 gange, og det ligner et job for et loop. I en senere version blev denne kode derfor erstattet med et array og et loop. Koden kom til at se sÄdan ud:
$kadosh = array( $ny->fePaaske("-1 weeks", "PalmesÞndag"), // PalmesÞndag $ny->fePaaske("-3 days", "SkÊrtorsdag"), // SkÊrtorsdag $ny->fePaaske("+0 days", "1. PÄskedag"), // 1. PÄskedag (fuldmÄne efter equinox) $ny->fePaaske("+1 days", "2. PÄskedag"), // 2. PÄskedag $ny->fePaaske("+5 days +3 weeks", "Store Bededag"), // Store Bededag $ny->fePaaske("-3 days +6 weeks","Kristi Himmelfart"), // Kristi Himmelfart $ny->fePaaske("+7 weeks", "1. Pinsedag"), // 1. Pinsedag $ny->fePaaske("+7 weeks +1 days", "2. Pinsedag") // 2. Pinsedag ); $i = 0; // looper derefter gennem kadosh-arrayet og kombinerer ny->dag med ny->fePaaske while($i <= count($kadosh)) { $ny->dag( (int)substr($kadosh[$i],0,2), // dag substring som integer (int)substr($kadosh[$i],3,4), // mÄned substring som integer substr($kadosh[$i],6) // hvad (pladrer strengen ud fra 6. karakter) ); $i++; };
Tilbage stod at indskrive flagdatoerne i scriptet. Resultatet kan ses her. MÄske. Hvis det ikke er flagdag i dag, sÄ er siden altsÄ blank. Og det var netop meningen. Der skal kun vÊre et flag nÄr det er en flagdag.
Debugging
Nu fÄr vi sÄ se, om koden virker. Debugging varer et Ärs tid. Hvis multimusen.dk flager pÄ en flagdag, sÄ virker sagerne jo.
Koden
Herunder er PHP-koden som den sÄ ud i fÞrste omgang, inden loopet herover. Det er selvfÞlgelig den rÄ betaversion; men den kan bygges ind i et PHP-baseret website. Det forudsÊttes, at koden ligger i samme mappe som billedet af flaget.
<?php /* DANSKE FLAGDAGE Af: Per Thykjaer Jensen Beskrivelse: Printer danske flagdage til en webside via PHP. Version: 0.2 Beta - flagdage. Ăndringer: Version 0.2 - denne version kan beregne kirkelige flagdage baseret pĂ„ pĂ„skedag. 0.11 - Dannebrog som .gif af hensyn til kompabilitet. Version 0.1 - basal funktionalitet. PĂ„ flagdage med fast dato vises et flag. Dato: 20120608 Copyright: GPLv3 - se licensen her: http://www.gnu.org/copyleft/gpl.html */ class flagDag { // printer hvis dagen er en flagdag public function dag($dato, $maaned, $hvad) { $flagstang = "dannebrog.gif"; // stien til billedet af Dannebrog // undersĂžger om det er en flagdag if (date('m') == $maaned && date('d') == $dato) { echo "<img src='" . $flagstang . "' alt='Dannebrog' width='50' height='38' >"; // kan skaleres efter behov echo "<p style='font-size:smaller'>I dag flages for: " . $hvad . "</p>"; } } // sĂ„dan: plusTid('+3 weeks +5 days'); function fePaaske($tid, $hvad) { // Denne funktion beregner dato for skĂŠve helligdage $date = date("Y-m-d", easter_date()); // pĂ„skedag $newdate = strtotime ( $tid, strtotime ( $date ) ) ; // her plus-minuses $newdate = date ( 'd,m' , $newdate ); // datoen formatteres return $newdate . "," . $hvad; // udskriver resultatet } } $ny = new flagDag(); // instantierer klassen // FLAGDAGE $ny->dag(01,01,"NytĂ„rsdag"); $ny->dag(05,02,"H.K.H. Kronprinsesse Mary"); $ny->dag(06,02,"H.K.H. Prinsesse Marie"); $ny->dag(09,04,"Danmarks besĂŠttelse. Der flages pĂ„ halv stang til kl. 12:00."); $ny->dag(16,04,"H.K.H. Dronning Margrethe II."); $ny->dag(29,04,"H.K.H. Prinsesse Benedikte."); $ny->dag(05,05,"Danmarks befrielse 1945."); $ny->dag(26,05,"H.K.H. Kronprins Frederik."); $ny->dag(05,06,"Grundlovsdag (1849)."); $ny->dag(07,06,"H.K.H. Prins Joachim"); // protektor for Danmarks-Samfundet $ny->dag(11,06,"H.K.H. Prinsgemal Henrik."); $ny->dag(15,06,"Valdemarsdag og Genforeningen (1920)"); $ny->dag(05,09,"H.K.H. Prins Joachim"); $ny->dag(25,12,"Juledag."); // FORSVARETS FLAGDAGE $ny->dag(29,01,"Holmens HĂŠderstegn."); $ny->dag(02,02,"Kampen ved Mysunde (1864)."); $ny->dag(11,02,"Stormen pĂ„ KĂžbenhavn (1659)."); $ny->dag(02,04,"Slaget pĂ„ Reden (1801)."); $ny->dag(18,04,"Slaget ved DybbĂžl (1864)."); $ny->dag(09,05,"Kampen ved Helgoland (1864)."); $ny->dag(05,06,"Kampen ved DybbĂžl (1848)."); $ny->dag(01,07,"Slaget i KĂžge Bugt (1677)."); $ny->dag(06,07,"Slaget ved Fredericia (1849)."); $ny->dag(25,07,"Slaget ved Isted 1850."); $ny->dag(04,10,"Stormen pĂ„ Frederiksstad 1850."); /* KIRKELIGE FLAGDAGE De "skĂŠve" kirkelige helligdage fĂžlger en mĂ„nekaldender og falder et antal dage efter en bestemt fuldmĂ„ne. Udgangspunktet for beregningerne er pĂ„skedag. Systemet ser sĂ„dan ud: PalmesĂžndag - sĂžndagen fĂžr pĂ„ske (pĂ„ske minus en uge) SkĂŠrtorsdag - pĂ„ske sĂžndag minus 3 dage (Halv stang t. kl. 12:00) 1. pĂ„skedag - pĂ„skesĂžndagen 2. pĂ„skedag - pĂ„ske sĂžndag + en dag Store Bededag - 4. fredag efter pĂ„ske 1. pinsedag - 7. sĂžndag efter pĂ„ske 2. pinsedag - pinsedag + 1dag Kristi Himmelfart - 6. torsdag efter skĂŠrtorsdag 1. juledag - fast dato 25.12. 2. juledag - fast dato 26.12. Eftersom de skĂŠve helligdage afhĂŠnger af pĂ„sken og mĂ„nen sĂ„ er PHPs pĂ„skeberegning et udgangspunkt for tidsberegningerne */ $palmeS = $ny->fePaaske("-1 weeks", "PalmesĂžndag"); // PalmesĂžndag $skaerT = $ny->fePaaske("-3 days", "SkĂŠrtorsdag"); // SkĂŠrtorsdag $PaaD = $ny->fePaaske("+0 days", "1. PĂ„skedag"); // 1. PĂ„skedag (fuldmĂ„ne) $APaaD = $ny->fePaaske("+1 days", "2. PĂ„skedag"); // 2. PĂ„skedag $stB = $ny->fePaaske("+5 days +3 weeks", "Store Bededag"); // Store Bededag $KrH = $ny->fePaaske("-3 days +6 weeks","Kristi Himmelfart"); // Kristi Himmelfart $fPin = $ny->fePaaske("+7 weeks", "1. Pinsedag"); // 1. Pinsedag $aPin = $ny->fePaaske("+7 weeks +1 days", "2. Pinsedag"); // 2. Pinsedag $ny->dag(25,12,"1. Juledag."); // helligdage med fast dato $ny->dag(26,12,"2. Juledag."); // Et loop gennem et array kunne ha gjort det fĂžlgende mere elegant ... nĂŠste version ... $ny->dag((int)substr($palmeS,0,2), // PalmesĂžndag (int)substr($palmeS,3,4), substr($palmeS,6) ); $ny->dag((int)substr($skaerT,0,2), // SkĂŠrtorsdag (int)substr($skaerT,3,4), substr($skaerT,6) ); $ny->dag((int)substr($paaD,0,2), // PĂ„skedag (int)substr($paaD,3,4), substr($paaD,6) ); $ny->dag((int)substr($APaaD,0,2), // 2. PĂ„skedag (int)substr($APaaD,3,4), substr($APaaD,6) ); $ny->dag((int)substr($stB,0,2), // Store Bededag (int)substr($xstB,3,4), substr($stB,6) ); $ny->dag((int)substr($KrH,0,2), // Kristi Himmelfartsdag (int)substr($KrH,3,4), substr($KrH,6) ); $ny->dag((int)substr($fPin,0,2), // 1. Pinsedag (int)substr($fPin,3,4), substr($fPin,6) ); $ny->dag((int)substr($aPin,0,2), // 2. Pinsedag (int)substr($aPin,3,4), substr($aPin,6) ); /* PRIVATE FLAGDAGE IndfĂžr dine private flagdage herunder Format: "dd,mm, begivenhed" eksempel $ny->dag(03,06,"test"); */ // eksempel // $ny->dag(27,02,"Pers fĂždselsdag"); ?>
Koden herover kan faktisk bruges til mange ting. Ved fĂ„ ĂŠndring kan den gĂžres til et WordPress plugin – og det er i denne form at jeg bruger koden nu.
Leave a Reply