Voorstel voor modulaire doch uniforme opbouw van php-sites Folder en filestructuur Een eenduidige structuur voor alle sites zal moeilijk te vinden zijn. Hierom deel ik de sites in een aantal soorten in die elk een gedeeltelijk eigen protocol hebben. De database sites en de statische sites representeren de meest extreme varianten, mengvormen zullen vaak voorkomen. Database driven sites (DbD) De pagina’s van deze sites worden vanuit een database dynamisch aangemaakt. De ‘echte’ html-structuur van de site zal tamelijk beknopt zijn. Statische PHP-sites (sPHP) Hier wordt PHP voornamelijk gebruikt om de site van templates te voorzien. De structuur van de site is die van een normale site waarbij de html bestanden nu de basis PHP bestanden zijn. Diederik’s systeem (DS) Werkt met een bestand waarin de noodzakelijk parameters voor een site zijn opgeslagen en een bak databestanden. Is een soort van bestandsmatige database. Foldermatrix Foldernaam /backup/ /includes/ /templates/ /javascript/ /forms/ /database/ /images/ /site/ /modules/ /content/ /admin/ /styles/ /docs/ Beschrijving Backup folder. Alle functionele includes die door de hele site heen gebruikt worden. Voornamelijk globals en functies. Alle includes die voor de lay-out van de site nodig zijn. Bevat de javascripts die door de hele site gebruikt worden. Voor alle forms. Kunnen zowel html als php formulieren zijn. Als de site door een database wordt gegenereerd staan hier de noodzakelijk scripts. Alle images die voor de layout en initiele opzet van de site nodig zijn. Hier komt de sitestructuur afgezien van de root index in te zitten. Modules zijn stukken code die in het content vlak van een pagina gehangen kunnen worden zonder dat de pagina aanmaker iets van de code van de module zelf hoeft af te weten. Hier komt de content van de pagina’s als losse tekstbestanden in te staan, eventueel aangevuld met plaatjes. Bevat alle scripts die nodig zijn om online wijzigingen aan te berengen. Beveiligen met htaccess. Hier komen de stylesheets terecht Beschrijvingen, handleidingen, etc. DbD x x sPHP x x DS x x x x x x x x x x - x - - x x x x - - x - ? - x x x - ? x x x x x x Bestandsnaamgeving Extensie *.tpl.php *.inc.php *.frm.php *.frm.html *.db.php x_y_z.txt x/module.php Beschrijving Template include bestand. Bevat delen html code die samen met andere template includes de opmaak van de pagina vormen. Deze bestanden bevatten de functionele includes. De belangrijkste zijn globals.inc.php en functions.inc.php. Bestanden die nodig zijn voor het tonen en verwerken van formulieren. Bestanden die database interactie regelen. Bestand dat als content in een pagina geplakt wordt. De naam geeft het pad aan naar de omvattende php pagina site/x/y/z.php. Het bestand dat de rest van de module aanstuurt en als content op de omvattende php pagina moet komen. Folders /templates/ /includes/ /forms/ /database/ /content/ /modules/x/ Modules Een module is een map die alle bestanden bevat die je nodig hebt voor een bepaalde functionaliteit. Het bestand module.php dient als het frontend en wordt bijv. als een include in het content gedeelte van een pagina gehangen. Ik denk dat het het beste is dat de settings ook per module worden geregeld, hoewel een centrale aanstuur functie per module wel handig zou kunnen zijn. Voorbeeld van functie in functions.inc.php: //Includes the emailform module and sends the requested variables function module_emailform($Address,$Etc){ Include $File_Root."modules/emailform/module.php"; } Zo’n constructie maakt het invoegen van de module makkelijker maar heeft als nadeel dat je voor elke module weer een functiedefinitie moet maken in functions.inc.php. Wellicht kunnen we een standaard versie van dit bestand maken waar alle bekende module functies als commentaar zijn opgenomen. Uitgangspunten 1. Een site moet een uniforme uitstraling hebben 2. Een site moet snel met al beschikbare materialen gebouwd moeten worden 3. Inhoud dient zoveel mogelijk geisoleerd te worden Hoe gaan we dat doen? 1. De pagina's worden via een beperkt aantal templates opgebouwd. Stylesheets worden gebruikt en bijbehorende classes rucksichtlos doorgevoerd. 2. We gaan de meeste onderdelen zo opbouwen dat ze via een paar externe variabelen aan te sturen zijn. Identieke elemente worden waar mogelijk geisoleerd in een include bestand. deze constructie dient snel inzetbaar te zijn en dus doorzichtig te zijn. Een blackbox principe, zeg maar. 3. Het maken van de inhoud van veel educatieve pagina's kost veel tijd. Laten we dus zorgen dat het makkelijk is om alle wezelijke info los van de menustructuren, banners en andere rommel te beheren. laten we deze info dus zoveel mogelijk in losse txt of html files opslaan, of in een database. Voorbeeld van een pagina definitie Dit is een vrij dom voorbeeld, maar daardoor juist extra illustratief. <?PHP //---------------------------------------------initialisatie include "settings.inc.php"; $PageTitle="titel"; $Tabel="_CoachThuis_School"; $Option_Form_Action='Nieuw'; $Option_Form_Mail='off'; $Option_Form_Debug='on'; //---------------------------------------------paginaopbouw include "top.inc"; include "tekst/geo/inleiding.inc"; include "geo/forms/form4.inc"; include "bottom.inc"; ?> Ik neem aan dat we hier niet mee wegkomen, maar het zou mooi zijn als paginabouwen zo gemakkelijk zou worden, toch? Beschrijving vaste onderdelen settings.inc bevat een aantal belangrijke globale variabelen. Deze variabelen kan je per pagina nog altijd veranderen. Print "<!-- Start Inc/Settings.inc //-->"; $Root="http://www.science.uva.nl/onderwijs/nieuw/test/"; $ClearPixel ="<IMG SRC='../../pics/clearpixel.gif' WIDTH=20 HEIGHT=2>"; $Studiegidsen="http://www.science.uva.nl/onderwijs/nieuw/studiegidsen/"; $Blackboard= "http://blackboard.ic.uva.nl/"; Print "<!-- End Inc/Settings.inc //-->"; Definities op de pagina zelf sturen in dit geval bijvoorbeeld het formulier aan. Het beste lijkt me om daar een logische structuur voor te vinden ipv compleet verschillende variabelen per object. Ik gebruik hier het suffix 'Option_' maar dat kan natuurlijk ook wel wat anders wezen. Ook voor de top en bottom van de pagina kan je hier gedefinieerde variabelen inzetten, zoals $PageTitle in 'top.inc'. top.inc bestaat uit het <HEAD> gedeelte van de pagina, inclusief alle META tags, die waarschijnlijk voor een deel met globale variabelen aangestuurt kunnen worden. Ook de bovenkant van de <BODY> en de menu's van de pagina moeten hierin een plaatsje vinden. We hebben al ervaring met een getrapte menu include structuur, wellicht kunnen we die nog wat uitwerken. bottom.inc sluit de pagina af wat html betreft. Tussen top en bottom komt alle content te staan. Modules Peter's Formulierformule maakt dynamisch formulieren van/voor een database tabel. Het lijkt mij een goed idee om een aantal variabelen in het definitie gedeelte van de pagina te zetten. Meestal wil je toch alleen maar onderhoud plegen op een pagina en niet ook nog eens een nieuw ding toevoegen. Hier een lijstje mogelijke variabelen. $Option_Form_Action='Nieuw'/'Onderhoud'/'Overzicht'; $Option_Form_Permissions='Add|Delete|Change|ViewAll'/'ViewSelf'/'All'; $Option_Form_Mail='off'/'self'/'client'/'both'; $Option_Form_Hide='Item1|Item2|Item3|Item4'; $Option_Form_Debug='on'/'off'; Wolter's Mededelingenmenger voegt informatie uit diverse databases samen op een pagina. Een uitgeklede versie zouden we als passieve module aanbieden. De gebruiker kan niets kiezen (ik geloof dat je dan met frames moet gaan werken) maar je kan wel per pagina definieren welke data getoond moet worden. Ik denk dat hier een mix van globale en plaatselijke variabelen het best zou werken. Je geeft globaal een aantal databases op waaruit gekozen kan worden (met de bijbehorende inlog functies etc) en geeft per module aan welke uit deze serie gekozen wordt samen met de benodigde info om de juiste informatie te vinden. Wat mij betreft kan je meer modules per pagina tonen... $Option_Communication_Database='CMS'; $Option_Communication_Show='Title|Date|Description'; $Option_Communication_SearchString="'Studierichting=Chem'"; Diederik's Uberupload kan op dezelfde wijze worden geconfigureerd. Wat mag wel en wat mag niet worden geupload, laat je het erna zien, moet het in een pagina komen. Besluit Dit lijkt me wel genoeg voor een kleine discussie... 't Is kwart voor zeven, ik vind het mooi geweest. Toevoegingen Scripts in header We kunnen in top.inc een script variabele zetten. Die moet dan testen of er een script ingevoegd moet worden (via een in de pagina gedefinieerde variabele) en of dat script er daadwerkelijk is. Op deze manier kunnen we de complete kop isoleren (denk ik). Stylesheets We kunnen een treetraps stylesheet invoeren om te voorkomen dat we een kilometerslange stylesheet krijgen met alle opties voor de hele site. Je kan dan per pagina aangeven of je naast de standaard stylesheet een extra overrule sheetje wil toevoegen. Ook in de stylesheets lijkt standaardisatie me een groot goed. P.Header1 P.Header2 P.BodyText P.MainMenu P.SubMenu Een set als deze kan altijd gebruikt worden. Maakt kopieren en migratie een eitje. Ik geef de voorkeur aan P boven DIV omdat Netscape nog wel eens moeilijk doet over DIV en tabellen. het modificeren van bestaande opmaak tags lijkt me ook niet zo'n goed plan. Nu weet je zeker dat een pagina er goed uitziet als je onze tags maar gebruikt. Taal Alle code, commentaar, etc in Her Imperial Majesty's Own Language, bitte. Folderstructuur Wellicht is het een goed plan om een vaste nomenclatuur en opbouw aan te houden. Mijn voorstel: /code/ /bits/ /text/ /docs/ /back/ /html/ /edit/ /form/ functionele includes zoals functies, globals, etc opmaak includes zoals top en bottom content includes documentatie backup eventuele losse html bestanden gebruik ik zelf voor site edit formulieren en rechten voor Peter? /site/ eventueel de plek voor de hele sitestructuur na index.php /pics/ centraal gebruikte plaatjes /style/ klote. vijf letters. Ja, het is waar, ik heb een 'alle mappen vier letters' tik. We kunnen de PHP gerelateerde folders ook in een map PHP samenvatten. Maakt het copy/pasten naar een nieuwe site wel makkelijker. Extra opties Ik kom al werkend op een aantal extra opties uit. Hier zijn ze. $Option_Form_Subscript='form/subscript1.txt'; //text below form Vaste bestandsnamen Als de folders vastliggen dan kan je ook vaste bestanden maken. /code/variables.inc.php server root, globals, vaste links /code/functions.inc.php functies die je overal gebruikt /form/functions.inc.php functies die je alleen voor forms gebruikt /style/style.css algemene stylesheet /style/style_form.css uitzonderingen voor forms