PHP

    • Nu virker mit udkast
    • SĂ„ skal alle CRUD-filer laves.
  • <? 
    global $wpdb; // henter klassen
    
    if (isset($_POST['submitted'])) { 
    foreach($_POST AS $key => $value) { $_POST[$key] = mysql_real_escape_string($value); } 
    $sql = "INSERT INTO `KbnLog` ( `Id` ,  `Date` ,  `KbnProjects_Id` ,  `KbnNotes_Id` ,  `KbnStates_Id`  ) VALUES(  '{$_POST['Id']}' ,  '{$_POST['Date']}' ,  '{$_POST['KbnProjects_Id']}' ,  '{$_POST['KbnNotes_Id']}' ,  '{$_POST['KbnStates_Id']}'  ); "; 
    
    // mysql_query($sql) or die(mysql_error()); 
    $wpdb->query($wpdb->prepare($sql)); // Query
    
    echo "Added row.<br />"; 
    } 
    ?>
    
    <form action='' method='POST'> 
    <p><b>Id:</b><br /><input type='text' name='Id'/> 
    <p><b>Date:</b><br /><input type='text' name='Date'/> 
    <p><b>KbnProjects Id:</b><br /><input type='text' name='KbnProjects_Id'/> 
    <p><b>KbnNotes Id:</b><br /><input type='text' name='KbnNotes_Id'/> 
    <p><b>KbnStates Id:</b><br /><input type='text' name='KbnStates_Id'/> 
    <p><input type='submit' value='Add Row' /><input type='hidden' value='1' name='submitted' /> 
    </form>

    Phpscaffold genererer en kode, der nĂŠsten kan anvendes; men et par linjer skal rettes. For det fĂžste skal wpdb gĂžres global. For det andet anvendes wpdb-klassen til at udfĂžre en SQL query:

    <? global $wpdb; // henter klassen // include('config.php'); - denne linje slettes er ikke noedvendig if (isset($_POST['submitted'])) { foreach($_POST AS $key => $value) { $_POST[$key] = mysql_real_escape_string($value); } $sql = "INSERT INTO `KbnLog` ( `Id` , `Date` , `KbnProjects_Id` , `KbnNotes_Id` , `KbnStates_Id` ) VALUES( '{$_POST['Id']}' , '{$_POST['Date']}' , '{$_POST['KbnProjects_Id']}' , '{$_POST['KbnNotes_Id']}' , '{$_POST['KbnStates_Id']}' ); "; // linjen herunder skal aendres til en wpdb klasse // se denne vejledning http://codex.wordpress.org/Class_Reference/wpdb // mysql_query($sql) or die(mysql_error()); // sikkerhed: brug wp prepare // echo $sql; // rens evt. m. prepare $wpdb->query($sql); // query //echo "Added row.<br />"; //echo "<a href='log-list.php'>Back To Listing</a>"; } ?> <form action='' method='POST'> <p><b>Id:</b><br /><input type='text' name='Id'/> <p><b>Date:</b><br /><input type='text' name='Date'/> <p><b>KbnProjects Id:</b><br /><input type='text' name='KbnProjects_Id'/> <p><b>KbnNotes Id:</b><br /><input type='text' name='KbnNotes_Id'/> <p><b>KbnStates Id:</b><br /><input type='text' name='KbnStates_Id'/> <p><input type='submit' value='Add Row' /><input type='hidden' value='1' name='submitted' /> </form>

    Phpscaffolds kildekode burde relativt enkelt kunne redigeres til at “kompilere” en WordPress egnet kode; men det et andet projekt.

    OvenstÄende kode beskytter ikke mod forsÞg pÄ SQL-indsprÞjtninger. Ved hjÊlp af prepare opnÄs en bedre beskyttelse. Wpdblinjen skal se sÄdan ud:

    $wpdb->query($wpdb->prepare($sql));

    Den rensede kode ser herefter sÄdan ud:

    <? 
    global $wpdb; // henter klassen
    
    if (isset($_POST['submitted'])) { 
    foreach($_POST AS $key => $value) { $_POST[$key] = mysql_real_escape_string($value); } 
    $sql = "INSERT INTO `KbnLog` ( `Id` ,  `Date` ,  `KbnProjects_Id` ,  `KbnNotes_Id` ,  `KbnStates_Id`  ) VALUES(  '{$_POST['Id']}' ,  '{$_POST['Date']}' ,  '{$_POST['KbnProjects_Id']}' ,  '{$_POST['KbnNotes_Id']}' ,  '{$_POST['KbnStates_Id']}'  ); "; 
    
    $wpdb->query($wpdb->prepare($sql)); // Query
    
    echo "Added row.<br />"; 
    } 
    ?>
    
    <form action='' method='POST'> 
    <p><b>Id:</b><br /><input type='text' name='Id'/> 
    <p><b>Date:</b><br /><input type='text' name='Date'/> 
    <p><b>KbnProjects Id:</b><br /><input type='text' name='KbnProjects_Id'/> 
    <p><b>KbnNotes Id:</b><br /><input type='text' name='KbnNotes_Id'/> 
    <p><b>KbnStates Id:</b><br /><input type='text' name='KbnStates_Id'/> 
    <p><input type='submit' value='Add Row' /><input type='hidden' value='1' name='submitted' /> 
    </form>

    I stedet for at rette global-linjen i alle filerne kan man bevare include(‘config.php’); – og lave en phpfil med dette indhold:

    <?php global $wpdb; ?>
  • Har en idĂ© om at smide alt indhold ind i Ă©n variabel, der sĂ„ echoer en GUI ud fra mine classes. Hvis indholdet af variablen ĂŠndres pĂ„ denne mĂ„de, sĂ„ behĂžver jeg ikke at linke til eksterne sider. Alt forbliver i Dashboard – elller hvor det nu er.

  • Konstaterer, at mit workflow ser nogenlunde sĂ„dan ud:

    1) Finde et problem. SpĂžrge brugere. UndersĂžge.
    2) TĂŠnke over en lĂžsning. SpĂžrge brugere. Undre. UndersĂžge.
    3) Modeller af workflow -> ER diagrammer
    4) Etablere databasen pÄ grundlag af modeller
    5) PHP / HTML -> CRUD funktionalitet
    6) Design (udvikle CSS)

    Det ser ud til at det egentlige design udvikles til sidst, nÄr jeg har fundet ud af, hvordan produktet skal virke. MÄske er mit spÞrgsmÄl forkert, for hvis jeg havde besluttet at fÞlge en vandfaldsmodel, sÄ havde projektet taget en anden drejning.

     

  • Har netop konfigureret en LAMP server pĂ„ et virtuelt Debiansystem i Mac OS X i virtualbox. Gnome skrivebordsmiljĂžet var for tungt; men LXDE fungerer fint. Jeg regner med at skrive koden i Pico (Nano), MC (Midnight Commander) og Bluefish.

  • Her begynder notater til udvikling af en Scrum-Kanban. FormĂ„let med projektet er at udvikle en Kanban, der kan kĂžre som et plugin i WordPress. Dels for at arbejde teoretisk med IT-projektstyring – og dels for at prĂžve  muligheder med HTML5 og CSS.

    Koden herunder stammer fra W3Schools og den laver den basale funktionalitet; men lĂžsningen er ikke persistent. En persistent lĂžsning bĂžr kunne udvikles via PHP og MySQL. Sprints er:

    1. Gemmefunktion – overfĂžrer data til databasen via POST.
    2. Udvikling af ER
    3. PHP
    4. Database
    5. Integration med WordPress API
    <html>
    <head>
    <style type="text/css">
    #div1 {width:350px;height:70px;padding:10px;border:1px solid #aaaaaa;}
    #div2 {width:350px;height:70px;padding:10px;border:1px solid #aaaaaa;}
    #div3 {width:350px;height:70px;padding:10px;border:1px solid #aaaaaa;}
    .divX  {width:350px;height:70px;padding:10px;border:1px solid #aaaaaa;}
    </style>
    <script>
    function allowDrop(ev)
    {
    ev.preventDefault();
    }
    
    function drag(ev)
    {
    ev.dataTransfer.setData("Text",ev.target.id);
    }
    
    function drop(ev)
    {
    ev.preventDefault();
    var data=ev.dataTransfer.getData("Text");
    ev.target.appendChild(document.getElementById(data));
    }
    </script>
    </head>
    <body>
    
    <p>Drag the W3Schools image into the rectangle:</p>
    <div id="div2" ondrop="drop(event)" ondragover="allowDrop(event)">Backlog</div>
    
    <div id="div2" ondrop="drop(event)" ondragover="allowDrop(event)">Todo</div>
    
    <div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)">Done</div>
    
    <img id="drag1" src="img_logo.gif" draggable="true" ondragstart="drag(event)" width="336" height="69">
    
    <div id="QQ" class="DQ" draggable="true" ondragstart="drag(event)">
     Drag Queen
    </div>
    
    </body>
    </html>
  • 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.

  • Det kunne vĂŠre spĂŠndende at udvikle 1863 materialet med en wicki, hvor medlemmer opfordres til at skrive via CG. Opgaven er: hvor tĂŠt kan vi komme pĂ„ en begivenhed, der skete for 150 Ă„r siden? Kan vi bruge “crowdsourcing” som metode i en afgrĂŠnset kreds af medlemmer af L.506?

    Hvordan samler vi stumperne? MÄske via en wicki, der i slutfasen redigeres sammen til en bog eller et hÊfte. Men den traditionelle wicki er meget sÄrbar. Jeg mistede fx et stÞrre arbejde pÄ Computerscience wicierne fordi nogen folk, der sÊlger potensfremmende midler hackede med en robot, der overskrev sider hvert andet minut. En helt Äben wicki er en dÄrlig idé, selv om det tilsyneladende virker for Wickipedia.

    Krav til wickien:

    • Anonyme skribenter skal afvises
    • RedaktĂžrer skal kunne godkendes
    • RedaktĂžrer skal muligvis have et lille kursus i at anvende wickien – og i at skrive i det offentlige rum som internettet nu engang er.

    Mediawicki ser ud til at leve op til vores behov. Den virker via php og er open source. Brugerrettigheder kan administreres. Mediawicki er FOSS og virker via PHP.

  • Det blev lidt kringlet, da grafen:

    1. Skulle vise de seneste 30 resultater
    2. Skulle kunne lĂŠses fra venstre mod hĂžjre

    I PHP MyAdmin fandt jeg ud af, at SQL-sÊtningen kunne se omtrent sÄledes ud:


    $sql = $wpdb->get_results( "SELECT * FROM `tablename` WHERE name='$username' ORDER BY adate DESC" );

    $sql er sorteret sÄdan, at grafen ville vende modsat lÊseretningen, og det er forvirrende. Derfor skulle den kringles sÄdan:


    $sql = array_reverse($sql, true);

    Og sÄ vender grafen rigtigt.

     

    Peakflow graf
    Nu vender peakflowgrafen rigtigt – dvs. sidste resultat er placeret yderst til hĂžjre.
  • Hul igennem fra databasen til Googles Graph API
    Hul igennem fra databasen til Googles Graph API

    SÄ lykkedes det at fÄ hul igennem fra WP MySQL databasen (via klassen $wpdb)  til Googles API.Grafen pÄ billedet herover er lavet med (tilfÊldige) peakflow-vÊrdier fra min database. Tallene fra databasen er visualiseret i form af en graf.

    Grafen er udviklet via Googles Wizard. Efter at have defineret, hvordan grafen skulle se ud kunne man kopiere en img tag med en meget lang URL.

    Googles URL blev delt op i tre bidder. FĂžrste del er de dele af URLen som ligger fĂžr tallene fra databasen. SĂ„ kommer vĂŠrdier fra databasen (der er et imploderet array). Til sidst fĂžlger den sidste del af Google URLen. Der er selvfĂžlgelig grĂŠnser for hvor lang en “GET” streng kan vĂŠre; men ind til videre er det ikke et problem.

    Brugeren skal vĂŠre logget pĂ„ for at kunne se resultaterne; men en demoversion lader sig vel nok fremstille pĂ„ et tidspunkt. FĂžrst ville jeg splitte sagerne op i to funktioner; men det fungerede ikke efter hensigten. SĂ„ besluttede jeg at samle hele koden i Ă©n funktion i min class – og det virkede sĂ„.

    Nu virker den tekniske side af mit plugin, for de Ăžvrige vĂŠrdier kan findes ved at variere SQL sĂŠtningerne og graferne; men den grundlĂŠggende kode er meget ens. Noget helt andet er naturligvis en usabilityanalyse – og designet…

    Der bĂžr nok vĂŠre en demoside, der viser The Asthma Diary i funktion med en demobruger a la billedet her.

     

  • ProgrammeringsmĂŠssigt bliver en af udfordringerne at hĂ„ndtere “pagination”, dvs. sideopdeling af astmadagbogen. EfterhĂ„nden som der kommer flere og flere poster i astmabloggens tabel, sĂ„ bliver det en nĂždvendighed. Pt. har jeg ikke fundet et oplagt eksempel.

    MĂ„ske skal man bare tĂŠnke det lidt enkelt. En tĂŠller “i” = lĂŠngden af arrayet. SĂ„ trĂŠkker man “limit” fra ind til i

    Mange kodeeksempler er umÄdeligt komplicerede, men det her mÄ kunne lade sig gÞre. $wpdb skal bruge en SQL sÊtning med en limit pÄ fx 30 stk. pr. sÞgning (det ville svare til ca en mÄneds input, hvis folk skriver peakflow en gang pr. dag).

  • Widget i kontrolpanelet
    Widget i kontrolpanelet til indtastning af data.

    Nu er min input form nĂŠsten klar. Formularen sender til databasen, der gemmer oplysningerne. Navnefeltet er skjult, for WP kender jo navnet pĂ„ den person, der er logget pĂ„. Feltet “Navn” er overflĂždigt. “Fortryd” er rettet til cancel og de to knappers design er ens.

    To ting mangler: a) brugernavnet skal sendes til databasen, og b) datoen skal formatteres korrekt. NÄr de to ting er pÄ plads, sÄ kan databasen modtage input.

    ad a) WP krĂŠver unikke brugernavne, sĂ„ derfor er der ikke redundante data. Brugernavnet kan igen bruges til at hente yderligere brugeroplysninger til prĂŠsentationslayoutet – ved simpelt hen at filtrere oplysningerne fra WPs brugertabel. En herlig bivirkning er at man kan lave et prĂŠsentationsdesign, hvor de viste data altid stammer fra den bruger som er logget ind.

    ad b) Valgte at formattere tiden via PHP date(‘d-m Y H:i:s’). MySQL anvender selv denne mĂ„de at prĂŠsentere datoen pĂ„.

    Nu fungerer formularen efter hensigten:

    Form faerdig
    Formularen er nu klar

    Man kan ikke se felterne Date og Name. Det skal man heller ikke, eftersom de er “usynlige”. PHP udfylder med de nĂždvendige oplysninger. Nu kan enhver bruger pĂ„ en enkel mĂ„de udfylde formularen. Samtidig kan jeg som webudvikler kontrollere, “hvad hvem mĂ„ se”.

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