Flagdage ver. 0.2

Dannebrog

Flagdage

Dannebrog
Hvordan hejser man Dannebrog pĂ„ websiden? Med denne PHP-kode kan du hejse flaget automatisk – og se hvorfor flaget hejses.

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.

Comments

3 responses to “Flagdage ver. 0.2”

  1. Per Thykjaer Jensen avatar

    Hej Bo

    Jeg har undersĂžgt problemet. Der kan vĂŠre flere forklaringer. I fĂžrste omgang lignede det en bug fra PHP-funktionen easter-date().

    Efter lidt research fandt jeg en simpel lĂžsning: slĂ„ calendar til i php.ini – pĂ„ Arch Linux ligger denne fil i /etc/php/php.ini.

  2. Per Thykjaer Jensen avatar

    Hej – tak for de venlige ord om mit efterhĂ„nden ret gamle flagdagsplugin. Jeg har ikke kigget pĂ„ det i flere Ă„r – og nĂ„r det ikke virker, sĂ„ hĂŠnger det nok sammen med den nye version af PHP / ĂŠndringer i de mĂ„der WP-plugins skrives. SĂ„ det vil jeg kigge pĂ„ ved fĂžrstkommende lejlighed. vh Per

  3. Bo Hansen avatar

    Hej Per
    Vores guider er MEGET begejstrede for din Flagdags oversigt 🙂 DesvĂŠrre virker denne ikke mere (den melder fejl i linie 48). Er det noget du kommer til at kigge pĂ„ eller skal jeg selv til at “opfinde” et site som dette?
    Med Venlig Hilsen
    Bo
    ( Parse error: Invalid numeric literal in /customers/0/2/c/multimusen.dk/httpd.www/flag/flag.php on line 48 )

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Enable Notifications OK No thanks

We use cookies - more information

Multimusen.dk will set a few cookies from Doubleclick, Google and the Social Media plugins they ay set some cookies. Some of my pages use APIs - such as YouTube, LinkedIn, Google Fonts, Google Maps, Mapbox, Spotify, Jetpack, Twitter, Facebook &c.. Such plugins may set the odd cookie.

Close