tags worden gebruikt (gebruikmakend van de class "bodytext")? – Dit is slim, omdat de later door TYPO3 ingevoegde dynamische content deze tags / classen ook voor de opmaak zal gebruiken! (Raphaël moet stiekem toch van te voren wat TYPO3 ervaring hebben opgedaan, hè?) Uitdaging: Wij moeten de voorbeeld content vervangen door een dynamisch gegenereerde pagina content. 4. Deze break tag zorgt voor een beetje extra ruimte onder de content, zodat de footer niet te dicht bij de body van de pagina staat. Tenslotte willen we je er op wijzen dat de tabelcellen met de positie van het menu en van de content, een id attribuut als tag hebben. Deze worden niet alleen door het stylesheet gebruikt! Er zit een slimmigheidje achter deze id attributen! Maar eerst wat HTML templates theorie:
Training voor Ontwikkelaars - 9
Basiskennis TEMPLATE cObject Maak eerst een nieuw bestand aan, fileadmin/template/test.html, met de volgende content:
tags waarbij de class is ingesteld op "bodytext". Op deze manier kun je de stijl van de pagina content of content elementen in je stylesheet specifiek bepalen! Je ziet hoe slim Raphaël geweest is door de proef content in het template bestand zo te ontwerpen dat er
tags worden gebruikt! 3. Ieder ingevoegd van element zal een tag hebben waarvan de waarde van de naam is ingesteld op de "uid" van het content element. Dit zijn ankerpunten die in de URL kunnen worden gebruikt om direct naar een bepaalde positie op een pagina te gaan. 4. Dit is hoe het HMenuobject het level2 menu aanmaakt. Je ziet hoe de link automatisch naar de juiste pagina verwijst en dat er zelfs een extra onFocus handler is ingesteld.
De Objectboom? Nu dan, door dit zogenaamde content element, "styles.content.get", te kopiëren, wat zijn we eigenlijk aan het toevoegen aan de objectboom? Laten we eens kijken met de Object Browser:
Training voor Ontwikkelaars - 27
We zien twee interessante zaken: 1. Het objectpad "styles.content.get" had kennelijk een cObject van het type CONTENT. Afgaande op de attributen lijkt het een redelijke conclusie dat het records van de tabel "tt_content" selecteert, en dat deze per veld worden geordend, "sorting". Voor meer informatie bekijk hier het CONTENT cObject **e. 2. Ten tweede werd er een geheel nieuw TLO (Toplevel Object) gedefinieerd- "tt_content". Het CONTENT cObject dat records selecteert van "tt_content" (#1) zal dit TLO (tevens gedefinieerd als een cObject) gebruiken als een defaultwaarde om elk gevonden record mee aan te maken! Zoals we zien is "tt_content" TLO gedefinieerd als een USER cObject waarbij een PHP functie van de "css_styled_content" extension wordt benut-wat me juist lijkt omdat dat de extension is die we hiervoor hebben geïnstalleerd! Om meer hierover te weten te komen moet je de documentatie voor de "css_styled_content" extension raadplegen**. Als je heel erg nieuwsgierig bent kun je ook in de class "tx_cssstyledcontent_pi1" kijken en de logica ervan bestuderen. Hier is een stukje van de functie "main" (): function main($content,$conf) $this->conf = $conf;
{
// This value is the Content element Type - determines WHAT kind of element to render... $CTypeValue = (string)$this->cObj->data["CType"]; $content=""; switch($CTypeValue) { case "header": $content = $this->getHeader().$this->render_subheader(); break; case "bullets": $content = $this->getHeader().$this->render_bullets(); break; case "table": $content = $this->getHeader().$this->render_table(); break; Training voor Ontwikkelaars - 28
...
case "text": $content = $this->getHeader().$this->render_text(); break; case "image": $content = $this->getHeader().$this->render_image(); break; case "textpic": $content = $this->render_textpic(); break;
Een XHTML compatibele website Als je XHTML compatibele websites wilt maken, kun je dat ook met TYPO3. Versie 3.6.0 van TYPO3 voldoet, voor zover mogelijk, aan XHTML compatibiliteit (niveau: XHTML transitional). Voor deze training moet je er zeker van zijn dat de gebruikte HTML templates XHTML compatibel zijn. Dit is natuurlijk de eerste stap, en iets waar je jezelf van verzekerd moet hebben. De volgende stap is ervoor te zorgen dat TYPO3 een XHTML doctype in de output genereert. Dit is gemakkelijk te doen door gewoon de volgende TypoScript regel in het Setup veld van het main template record te op te nemen: page.config.doctype = xhtml_trans
Bovendien dienen de menu's ook compatibel te zijn. Vooralsnog worden bijzondere tekens, zoals “&”, precies zo weergegeven. Dit moet je vermijden. De TypoScript code van het menu moet worden veranderd door vier extra regels (hier weergegeven in rood) toe te voegen: # Menu 1 cObject temp.menu_1 = HMENU # First level menu-object, textual temp.menu_1.1 = TMENU temp.menu_1.1 { # Normal state properties NO.allWrap =
|
|
Hierdoor worden de menu labels door de PHP functie htmlspecialchars() geleid, die bijv. “&” naar “&" omzet; Nadat je dit gedaan hebt, kun je de site testen met bijv. Opera 7, dat een hele handige shortcut heeft voor compatibiliteitstesten: Je hoeft alleen maar rechts te klikken op de HTML pagina, kies “Frame” en vervolgens “Validate source”:
Training voor Ontwikkelaars - 29
Opera stuurt dan automatisch de broncode van de pagina voor je naar “http://validator.w3.org/” en, als het goed gaat, zou je het volgende op je beeldscherm moeten zien:
Training voor Ontwikkelaars - 30
Nu alles wat netter We hebben onze website nu af. Dhr. Benoit en dhr. Raphaël hebben hun taken afgerond en misschien heeft ondertussen dhr. Picouto zelfs alle content elementen voor elke pagina in de boom hebben geleverd. We weten het niet, maar de basisstructuur van de website is er, gebaseerd op een heel gewoon HTML bestand dat in de map "fileadmin/template/main/" is geplaatst, waarbij, indien nodig, alleen de menu en content gedeeltes dynamisch worden vervangen.
Betere template structuur Het enige wat we nog moeten doen, is het template record wat beter organiseren. Alhoewel we de gebruikte hoeveelheid TypoScript tot een minimum hebben beperkt, is het makkelijk te zien dat een dergelijk template record heel snel groot en onhandig wordt. Dit kan worden opgelost door het te vervangen door een serie template records die worden opgenomen: Ten eerste zou je een hele nieuwe pagina kunnen maken in de "root-level" van de paginaboom. Selecteer het type "sysFolder" (als in "opslagruimte voor elk database element dat je maar wilt") en noem het Template Storage. Dan maak je als volgt drie template records aan:
Vink "Clear" nergens aan! Kopieer alleen de juiste "temp.xxxx" object definities van de "NEW SITE" template hierheen. In Training voor Ontwikkelaars - 31
deze lijst is de volgorde onbelangrijk. De volgende stap is om deze drie templates in de "NEW SITE" main template op te nemen. Bewerk dus de "NEW SITE" template:
De volgorde is nu wel belangrijk: het eerstgenoemde template wordt het eerste opgenomen en omdat het template record "ext: Main TEMPLATE cObject" kopieën maakt van bijv. het "temp.menu_1" object, moet het als laatste worden opgenomen. Sla het template record op en bekijk de nieuwe structuur met de Template Analyzer:
Je ziet dat het statische template als eerste is opgenomen, dan de drie "basis templates" uit onze opslagmap en tenslotte het main template record. Je kunt van elk de titel aanklikken en er onder naar de content kijken.
Training voor Ontwikkelaars - 32
Enkele HTML ontwerp overwegingen Je zult in dit deel van de training gemerkt hebben, dat het mogelijk is om op een hele gemakkelijke wijze een HTML template van een grafische vormgever te implementeren, terwijl je zeker bent van compatibiliteit met zijn oorspronkelijke werk in de omgekeerde richting (omdat het handmatig invoegen van markers in zijn HTML template onnodig is). Bovendien komt er alleen maar bekende technologie zoals HTML en CSS bij kijken -er hoeven geen verwarrende XLST stylesheets te worden gemaakt (hoewel dhr. Benoit XSLT kan gebruiken op PHP-niveau, als hij dat zou willen). Maar alhoewel dhr. Raphaël, de ontwerper, vrijwel volledig vrij is in zijn ontwerp moet hij toch nog steeds de grondbeginselen van dynamische en statische content begrijpen.
Geef duidelijk aan welke delen dynamisch en welke statisch zijn Dhr. Raphaël moet vooral begrijpen -waarschijnlijk met het hele webteam-welke delen van de pagina statische delen zijn en welke dynamisch. Statische delen zijn alle delen waar TYPO3 NIETS mee doet. Het is echter de bedoeling dat de dynamische delen wel worden vervangen door content afkomstig uit de databronnen van TYPO3. Bij de identificatie van dynamische delen moet Raphaël op twee dingen letten: •
Het deel moet worden ingesloten door een enkelvoudig HTML element. Dit kan een element of een <span> element zijn.
•
Het insluitende element moet of een id- of een class attribuut bevatten, dat door de configuratie van de Template Autoparser plugin kan worden gevonden en omgeven door subpart markers. Bijv. voor de tabelcel waarin de content moet worden geplaatst.
Training voor Ontwikkelaars - 33
Het geeft helemaal niet als er proef content in het template bestand blijft - dit wordt immers toch vervangen door dynamische content.
Vereenvoudig de HTML opmaak, gebruik CSS stylesheets We bevinden ons nu in het jaar 2004 en het is echt tijd om afscheid te nemen van de tag en bgcolor attributen en alles in een extern stylesheet te plaatsen. Met het oog op een CMS implementatie zorgt dit ervoor dat zo veel mogelijk externe technologie wordt gebruikt en CMS specifieke technologie (zoals TypoScript template records) slechts waar strikt noodzakelijk. In dit onderdeel van de training is het level2 menu het beste voorbeeld:
Laten we een enkelvoudig element bekijken (hierboven in rood). Een andere manier om dit te implementeren zou zijn:
... Training voor Ontwikkelaars - 34 Menu item 1
Bedenk dat de definitie van het TMENUITEM object in het template record inhield dat de elementen door dit eenvoudige
... en ja hoor, je raadt het al, het bovenstaande betekent dat de elementen ongeveer door het volgende moeten worden omgeven: temp.menu_1.1 { # Normal state properties NO.allWrap (
) ... |
En zelfs dat zou niet genoeg zijn: Je zou ook de class naam van de A tag met behulp van een andere eigenschap van het NO status object moeten toevoegen, en het "gray_dotted_line.gif" bestand zou als prefix het correcte bestandspad moeten krijgen - zoals bijvoorbeeld "fileadmin/template/main/".
Gebruik geen class attributen voor dynamische links Veel ontwerpers zullen geneigd zijn te denken dat een class attribuut voor de tag de beste HTML opmaak is om hun menu elementen en andere links te markeren. Voorbeeld: ...
Dat klopt echter niet omdat juist de tag automatisch wordt gegenereerd door TYPO3! Dus om dit te laten werken voor ons TMENUITEM zouden we extra TypoScript eigenschappen nodig hebben: temp.menu_1.1 { # Normal state properties NO.allWrap =
Dit voegt meer complexe TypoScript eigenschappen toe en vermindert de flexibiliteit van het stylesheet. Als je bijvoorbeeld in dit geval wil vastleggen hoe de link van CSS wordt weergegeven, kun je het volgende gebruiken. A.menu1-level1-no { color: navy; } A.menu1-level1-no:hover { color: red; }
... maar dit kan weer niet als het
Geen row/colspans! Dit is waarschijnlijk de grootste bedreiging voor dynamische content - het gebruik van colspan als je een dynamisch object maakt! Dit is dus uitgesloten. Bestudeer bijvoorbeeld de volgende menu opzet:
Training voor Ontwikkelaars - 35
Menu item 1
. . . Menu item 2 Menu item 3 (act) Level 2 item Level 2 item Level 2 item (act) Menu item 2
Het is vrijwel onmogelijk dit in te voeren! Het eerste menu bestanddeel is in dezelfde tabelrij als de contentcel, de andere zes menu bestanddelen hebben aparte tabelrijen. Bovendien heeft de tabelcel met de content een colspan="7" attribuut nodig voor de verdeling over alle rijen van het menu! Ontwerptechnisch gezien is dit duidelijk een heel slechte keuze: 1. de menu opmaak bevindt zich op verschillende punten in de HTML code 2. er is een afhankelijkheid tussen het colspan attribuut en het aantal menu bestanddelen (dat dynamisch is!) Ontwerpers moeten zich dus verre houden van dit soort ontwerpen. In plaats daarvan moeten ontwerpers zoals dhr. Raphaël gemakkelijk te herhalen opmaak voor dynamische elementen leren. Dit zijn goede voorbeelden: Bijvoorbeeld zoals in onze huidige template: ...
Alternatief met een tabel:
Menu item 1 Menu item 2 ... Menu item 3 (act)
We zouden nog ingewikkelder voorbeelden kunnen geven, zoals het eerdere voorbeeld waarbij elk element in een tabel werd bewerkt! Het gaat niet om de hoeveelheid HTML per bestanddeel -het gaat om de herhaalbaarheid van de opmaak! Dhr. Raphaël moet dit soort zaken begrijpen, zodat dhr. Benoit geen uren kwijt is vanwege een gebrekkige HTML structuur en uiteindelijk zou dhr. Picouto zelfs zo blij kunnen zijn met de snelheid van de ontwikkeling die wordt bereikt door de symbiotische samenwerking tussen Raphaël en Benoit, dat hij ze trakteert op lunch!
Training voor Ontwikkelaars - 36
Tenslotte Ben je na het volgen van deze training geïnteresseerd in andere trainingen in TYPO3, ga dan verder met de twee andere beschikbare trainingen: TYPO3 Training voor Editors en TYPO3 Training voor Ontwikkelaars. Vragen? Neem dan contact op via mijn e-mail adres hans@alternet.nl of op het telefoonnummer (078) 635 1200. Hartelijk dank voor het volgen van deze training! Ing. Hans A. Olthoff AlterNET Internet B.V.
Training voor Ontwikkelaars - 37
Sign In