Deze tutorial beschrijft hoe je in Drupal 6.x een module maakt, installeert en laat werken. Het is een vrije vertaling van de Drupal documentatie ophttp://drupal.org/node/206753 Vrij in de zin van gericht op actie en met weglaten van minder belangrijk geachte details. Voorop staat dat je moet weten Hoe je een module maakt, Wat de interfaces zijn naar Themes en Hoe die dan wel werken.
Een module is een verzameling functies die een verbinding hebben met Drupal en die een uitbreiding vormen op de je Drupal installatie. In deze tutorial leer een basale blok module maken en deze gebruiken als sjabloon voor meer geavanceerde modules.
Deze tutorial is niet bedoeld om je voor te bereiden modules te schrijven die je dan maar zonder meer de wereld kunt insturen; we zullen het niet hebben over caching, we gaan ook niet in op toegangsrechten of beveiligingszaken. Gebruik deze tutorial als een begin, een vertrekpunt, bestudeer andere modules en het Drupal Handboek, de documentatie voor het schrijven van veilige programmatuur en deprogrammeerstandaarden voor meer informatie.
Je behoeft geen kennis te hebben van de innerlijke roerselen van Drupal of de werking daarvan, ook niet over de werking van een module - dat ga je hier leren. Deze tutorial zal je niet helpen voor Drupal versies vroeger dan 5.
Voor caching kijk je best naar de Cache API en caching tutorials.
De tutorial volgt alle noodzakelijke stappen voor het maken van een module die een lijst toont van een blok met recente blog items en onderdelen van een forumdiscussie. De volgende onderwerpen worden behandeld:
Zoals gezegd gaan we een voorbeeld module maken voor het tonen van recente items; recent definiëren we voorlopig als precies één week geleden.
De eerste stap bij het maken van een module is het kiezen van een korte naam voor dat ding. Deze korte naam gebruiken we in alle bestands- en functienamen van onze module. De naam moet beginnen met een letter uit ons alfabet en volgens een Drupal conventie mag de naam uitsluitend kleine letters bevatten en het _ teken (underscore). In dit voorbeeld nemen we "onthisdate" als verkorte naam. Van belang is: dat de naamgeving niet alleen een conventie is, we gebruiken hem ook voor de bestandsnaam van de module en als prefix (voorvoegsel) van functies..Wanneer je in Drupal "hooks" implementeert, dan herkent Drupal je hook functies wanneer deze dezelfde functienaamprefix hebben als het modulebestand. Wat "hooks" of "haken" zijn vertellen we verderop.
Goed, onze korte naam is "onthisdate", begin nu de module met het maken van een map in de directory van je geïnstalleerde Drupal site, in het pad:sites/all/modules/onthisdate. Maak nu een PHP-bestand en sla dat op alsonthisdate.module in deze map. Met ingang van Drupal 6.x is sites/all/modulesde plaats om bij voorkeur de none-core modules op te slaan; en voor none-core themes (templates die niet tot de kern van Drupal behoren) is datsites/all/themes. Je kunt daardoor gemakkelijke de kernbestanden van Drupal vervangen want je houdt je eigen werk gescheiden van de Drupal bestanden.
Modulebestanden beginnen met een openende PHP tag onmiddellijk gevolgd door de CVS ID tag in een commentaarregel. De CVS ID tag, $Id$, is een teken dat het versiebeheersysteem van Drupal gebruikt om revisie- en auteurgegevens vast te leggen. Gebruikelijk is om deze tag in alle gevallen in je module op te nemen, onafhankelijk van de vraag of je van plan bent de module op Drupal.org te publiceren. Je plaatst een gelijksoortige ID tag in alle andere bestanden die iets met je module te maken hebben.
====
<?php
// $Id$
====
De ID tag is geen speciale soort of PHP syntax het is daar uitsluitend en alleen voor de versie beheersystemen. Het MOET dan ook in een commentaarregel staan.
Je module is natuurlijk nog niet operationeel: hij is niet geactiveerd, dat doen we later.
Aansluitend op de programmeerstandaarden laat je de afsluitende ?> tag achterwege. Het gebruik van deze tag kan bij de uitvoering van het programma op sommige servers vreemd gedrag veroorzaken. Wegens de formattering laten we deze tag in de getoonde voorbeelden staan; in uw programma's moet u dat niet doen!
Alle functies in je module die Drupal gebruikt zijn benoemd als: {modulenaam}_{hook}, in deze benaming is "hook" de vooraf gedefinieerde functienaamsuffix. Drupal roept deze functies aan voor het verkrijgen van gespecificeerde gegevens, door het gebruik van deze strak gedefinieerde namen "weet" Drupal waar ze moet zoeken. We gaan zo dadelijk in op deze "haken" maar eerst en vooral een opmerking over de naamgevingconventie. Die is, zeker voor de nieuwkomer, vaak verwarrend.
Wanneer we een bepaalde haak (hook) implementeren bijvoorbeeld voor een module die we 'mymodule' noemen, dan is de functienaam: 'mymodule_hookname'. De schrijfvorm voor de functienaam is: MODULENAME_HOOKNAME. Altijd staat de modulenaam aan de linkerkant van de underscore en de haaknaam aan de rechterkant. Door nu uitdrukkingen te gebruiken als 'hook_iets' wekken we tenminste de indruk dat 'hook' de haaknaam is die aan de linkerkant van de underscore moet staan. Wen er maar aan: de haaknaam staat rechts en de modulenaam staat links van de underscore!
De bedoeling hier is om Drupal te vertellen dat je module bestaat; tevens beschrijven we de hook_help().
Alle modules moeten een bestand modulenaam.info hebben dat metagegevens bevat over de betreffende module.
De algemene indeling van dat bestand is:
====
; $Id$
name = Module name
description = A description of what your module does.
core = 6.x
====
In dit voorbeeld is de naam die we gebruiken dan ook "onthisdate.info". Zonder dit bestand komt de module niet voor in de modulelijst. In dit voorbeeld zou het de volgende inhoud kunnen hebben:
====
; $Id$
name = On this date
description = A block module that lists links to content such as blog entries or forum discussions that were created one week ago.
core = 6.x
====
Voeg de bovenstaande inhoud toe aan een bestand onthisdate.info en sla het op in de module directory als: sites/all/modules/onthisdate/onthisdate.info.
Zorg ervoor dat je description zonder het afbreken van de regel schrijft; en zet de word-wrap in je teksteditor af.
name (verplicht)
De te tonen naam van je module. Je moet de Drupal 6 standaard voor hoofdletters gebruiken: alleen de eerste letter van het eerste woord moet een hoofdletter zijn. Dus: "Voorbeeld module" en niet: "voorbeeld module" en ook niet: "Voorbeeld Module".
====
name = On this date
====
description (verplicht)
Een korte beschrijving, bij voorkeur op één regel, die de beheerder op zijn beheerpagina vertelt wat de module doet. Onthoudt dat een te lange beschrijving ervoor kan zorgen dat de pagina niet goed werkt. Dit veld is 255 tekens lang, maar je hoeft ze niet allemaal te gebruiken.
====
description = A block module that lists links to content such as blog entries or forum discussions that were created one week ago.
====
Je moet speciale tekens in de beschrijving vervangen door HTML waarden. Gebruik bijvoorbeeld: description = This is my "crazy@email.com" email address instead of description = This is my "crazy@email.com" email address
Wanneer de beschrijving enkele quota's of apostrofs bevat dan kun je eenvoudig de gehele string tussen dubbele quota's zetten, bijvoorbeeld:description = "Please don't use this unless you know what you are doing."
core (verplicht)
Met ingang van versie 6.x weigert de Drupal core het beschikbaar stellen of uitvoeren van modules die niet expliciet geschreven zijn voor precies die versie van de core. Het info-bestand moet specifiek aangeven voor welke Drupal core de module of het theme bestemd is; dit gebeurt middels het core attribuut in het info-bestand.
====
core = 6.x
====
Opmerking: het drupal.org script voor het verpakken zet deze waarde automatisch op de Drupal core compatibiliteitsinstelling van elke release, gebruikers die het pakket downloaden krijgen dan altijd het juiste ding.
dependencies (optioneel)
Dit zijn een aantal extra opties die in het info-bestand kunnen voorkomen, een daarvan zijn de afhankelijkheden die de onderhavige module heeft ten opzichte van andere modules. Wanneer een module de beschikbaarheid verwacht van andere modules, geef dan elke module (bestandsnaam) die vereist is aan met de volgende syntaxis.
====
dependencies[] = taxonomy
dependencies[] = comment
====
In onze voorbeeld module is dit niet van toepassing; en dus kunnen dit leeg laten. Maar als er afhankelijkheden zijn zal Drupal niet toestaan de module te activeren tot aan de vereiste afhankelijkheden is voldaan.
package (optioneel)
Als de module is "ingepakt" dan zal Drupal het op de beheer/site constructie/modules pagina samen met de andere modules in hetzelfde pakket tonen. Als de package string ontbreekt komt de module gewoon in de catagorie "Ander" te staan.
====
package = "Your arbitrary grouping string"
====
Voorbeelden voor items in het package veld zijn:
Deze bestanden gebruiken de ini-indeling; daar kan ook reeds de $Id$ in staan.
Voor meer informatie over de ini-indeling: PNP.net parse ini-bestand documentatie
We kunnen door het implementeren van Drupal's hook_help()ook zorgen voor help en aanvullende informatie over onze module. Door het gebruik van het info-bestand dat we hier voor beschreven, is deze "haak" nu optioneel beschikbaar. Maar het is en blijft een goed idee dit te implementeren. Voor het in Drupal implementeren van welke "haak" dan ook moet je twee dingen doen:
Om in onze voorbeeld module hook_help() te implementeren, moeten we dus een functie met de naam onthisdate_help() definiëren in de hetonthisdate.module bestand.
====
<?php
function onthisdate_help($path, $arg) {
}
?>
====
De $path parameter verschaft de helpcontext, het geeft aan waar de bezoeker die om hulp vraagt zich in Drupal of in de module bevindt. De aanbevolen manier om deze variabele te verwerken is middels een switch statement. Dit is een in Drupal gebruikelijke programmeer techniek. Hieronder volgt de voorbeeldimplementatie van deze functie:
====
<?php
Display help and module information
* @param path which path of the site we're displaying help
* @param arg array that holds the current path as would be returned from arg() function
* @return help text for the path
*/
function onthisdate_help($path, $arg) {
$output = ''; //declare your output variable
switch ($path) {
case "admin/help#onthisdate":
$output = '<p>'. t("Displays links to nodes created on this date") .'</p>';
break;
}
return $output;
} // function onthisdate_help
?> // Deze tag moet NIET in je definitieve programma staan!
====
De Drupal core gebruikt de case admin/help#modulename om te linken vanaf de top help pagina (/admin/help or ?q=admin/help).
Kijk verder naar: hook_help
Het gaat hier over toegangsrechten en we beschrijven de functiehaak hook_perm().
Je definieert hier de toegangsrechten voor je module. Let wel, je beschrijft niet wat het toegangsrecht betekent of kent rechten toe aan een rol of een bezoeker; je legt uitsluitend vast welke rechten er bestaan voor deze module. Net als bij de helphaak uit het voorgaande implementeren we hook_perm() middels het aanmaken van een functie met als naam onthisdate_perm() en we slaan die ook op in het bestand onthisdate.module.
Deze functie geeft alleen maar een lijst terug met de namen van toegangsrechten die deze module kan gebruiken; heb je eenmaal in een module via de hook_perm() implementatie rechten vastgelegd dan kan de beheerder bepalen welke rollen/personen hij daaraan koppelt middels de Beheer > Gebruikersbeheer > Toegangsrechten pagina. Hier volgt de functie voor onze voorbeeld module:
====
<?php
/**
* Valid permissions for this module
* @return array An array of valid permissions for the onthisdate module
*/
function onthisdate_perm() {
return array('access onthisdate content');
} // function onthisdate_perm()
?> // Deze tag moet NIET in je definitieve programma staan!
Voor een module die stringenter rechten behoeft kun je deze verzameling uitbreiden. Bijvoorbeeld:
<?php
return array('access onthisdate content', 'administer onthisdate');
?>
====
In deze tutorial zullen we dat later doen.
Je rechten strings zijn arbitrair, maar elke regel moet uniek zijn voor alle geïnstalleerde modules, je begrijpt dat het een puinhoop wordt als er meerdere regels voor hetzelfde recht over elkaar vallen. Een manier om dat te bereiken is het opnemen van de modulenaam in elk recht. De aanbevolen naamconventie voor rechten is: "werkwoord modulenaam". Gebruik het volgende voorbeeld als een sjabloon voor elke module die wilt ontwikkelen:
====
<?php
function newmodule_perm() {
return array('access newmodule', 'create newmodule', 'administer newmodule');
} // function newmodule_perm
?>
====
Kijk ook naar: hook_perm en Drupal 6 - Rechten
We maken modules voor het uitvoeren van allerlei zaken: sommige modules maken blokken (verkorte inhoud die vaak aan de rechterkant van de pagina verschijnt), anderen maken een specifieke soort inhoud (zoals inhoud voor een volledige pagina - zoiets als wat je nu leest), weer anderen verzorgen back-end informatie en nog weer anderen doen alles wat we zojuist hebben genoemd. Je ziet vaak de frase "Blok modules" gebruiken om aan te geven dat dit soort modules voornamelijk bedoeld zijn voor het aanmaken van blokinhoud (zoals de menu module) of "Node modules" om te verwijzen naar modules die voornamelijk bedoeld zijn om de inhoud voor een volledige pagina te genereren (zoals blog- of forummodules). Onze module is tot dusver een "blokmodule", hij genereert namelijk een blok.
In dit onderdeel van de tutorial definieert de module een blok dat uiteindelijk (in het volgende onderdeel) de meest recente items van een blog en een forum zal tonen. De haak die ons in staat stelt een blok aan te maken heet zeer toepasselijk "hook_block". We implementeren deze haak door het aanmaken van een functie die we onthisdate_block() noemen en die we opslaan in het bestand onthisdate.module.
Dit is de basisvorm:
====
<?php
/**
* Implementation of hook_block
* @param string $op one of "list", "view", "save" and "configure"
* @param integer $delta code to identify the block
* @param array $edit only for "save" operation
**/
function onthisdate_block($op = 'list', $delta = 0, $edit = array()) {
// YOUR MODULE CODE HERE
} // function onthisdate_block
?>
====
De blokfunctie gebruikt drie parameters:
De "list" bewerking maakt een lijst met blokken die de module beschikbaar stelt en bepaalt hoe deze worden getoond op de Beheer > Site constructie > Blokken pagina (de blokken module roept die functie aan met $op = 'list' wanneer ze de blokkenlijst voor het blokken beheer opbouwt).
Hieronder volgen de eerste details voor de onthisdate_block() functie, het volgende onderdeel biedt meer.
// Deze tag moet NIET in je definitieve programma staan!
Goed, even over de code:
$block - niets meer maar ook niet minder van een gewone variabele waarin je de benodigde gegevens opslaat voordat je ze teruggeeft in het return-statement;
$block[0] - O, hé zeg, het is een array en wat meer is, elk item in dat array bevat een blok dat jouw module beschikbaar stelt (in ons voorbeeld is dat er één). De "0" index in het array is de $delta waarde die we in latere bewerkingen zullen gebruiken (bij meerdere blokkenmodules krijgen we dan 0 <= $delta <= N) en moet je ook de $delta-waarde controleren voor latere bewerkingen.
$block[0]["info"] - Hé, $block blijkt een multidimensioneel array te zijn. Elk element (0, 1, 2, etc) dat een blok bevat is tevens zelf ook een array met key = value paren, de combinatie van een sleutel (of index) gekoppeld aan een waarde. Sommige van deze sleutels zijn "info", "cache", "weight", "status". Maar dat is allemaal een beetje veel voor een introductie, dus beperken wij ons tot "info"; en dat is de voor mensen leesbare naam van jouw blok zoals dat wordt getoond in het blokken gedeelte van de beheer pagina. Om een lang verhaal kort te maken: binnenin hook_block() is ons blok bekend als $delta = 0. De functie t() leggen we straks uit.
Kijk ook naar: hook_block en block_example.module
De volgende stap is het genereren van de inhoud van een blok. Dit betekent dat we de Drupal database moeten benaderen en uitlezen. Wat we willen is een lijst met inhoud (opgeslagen als "nodes" in de database) en een week geleden vastgelegd. Meer concreet: we willen inhoud (content) die een week geleden tussen middernacht 00:00 uur en middernacht 24:00 uur op deze dag in de database is vastgelegd. We gebruiken het databaseveld waarin de tijd van aanmaken in de database is vastgelegd, om onze gegevens op te halen.
Om Drupal duidelijk te maken welke inhoud we in ons blok willen hebben, gebruiken we de "view" bewerking van hook_block(). We zullen dus enige code moeten toevoegen aan onze eerder gedefinieerde functieonthisdate_block().
Het eerste dat we doen is het berekenen van de tijd voor middernacht 00:00 uur een week geleden en 24 uur later (we hanteren seconden die verstreken zijn sinds het begin van de lopende eeuw, ziehttp://www.php.net/manual/en/function.time.php voor meer informatie over tijdrepresentatie). Dit onderdeel van de programmatuur is onafhankelijk van Drupal, zie de PHP-website (http://php.net/) voor meer details.
====
<?php
/**
* Generate HTML for the onthisdate block
* @param op the operation from the URL
* @param delta offset
* @returns block HTML
*/
function onthisdate_block($op='list', $delta=0) {
if ($op == "list") {
// Generate listing of blocks from this module, for the admin/block page
$block = array();
$block[0]["info"] = t('On This Date');
return $block;
}
else if ($op == 'view') {
// Generate our block content
// Get today's date
$today = getdate();
// calculate midnight one week ago
$start_time = mktime(0, 0, 0,
$today['mon'], ($today['mday'] - 7), $today['year']);
// we want items that occur only on the day in question, so
// calculate 1 day
$end_time = $start_time + 86400;
// 60 * 60 * 24 = 86400 seconds in a day
// more coming...
}
}
?>
====
Tja, nu kan het ook nog zijn dat de gegevens van precies een week geleden niet in de database voorhanden zijn. Verander dan de eindtijd op de volgende manier, dan kun je tenminste iets laten zien in je blok.
$end_time = time(); // get all posts from one week ago to the present
De volgende stap is het samenstellen van het SQL-statement dat de gegevens voor de inhoud die we willen laten zien moet gaan ophalen uit de database. We selecteren de inhoud uit de node table, dat is de centrale tabel voor Drupal inhoud (content). We krijgen met deze query allerlei soorten inhoud: blog items, forum posts, etc. Voor deze tutorial is dat prima, maar voor een 'echte' module zul je het SQL-statement natuurlijk moeten aanpassen om de dan benodigde specifieke gegevens uit de database te selecteren; hoe je dat moet doen is een SQL zaak en daar moet je SQL voor bestuderen, dat hoort niet in deze tutorial. Zeg niet dat je niet was gewaarschuwd.
Drupal gebruikt voor het uitvoeren van database-queries hulp functies. Dit betekent dat voor het overgrote deel je de database SQL-statements kunt schrijven zonder na te hoeven denken over de vraag hoe Drupal de resultaten verzorgt. Wij gebruiken hier db_query() om de data base records (de regels uit de betreffende tabel) beschikbaar te krijgen middels onze SQL query:
====
<?php
$query = "SELECT nid, title, created FROM " .
"{node} WHERE created >= '%d' " .
" AND created <= '%d'";
$query_result = db_query($query, $start_time, $end_time);
?>
====
Dit stukje code illustreert hoe je in Drupal een veilige query opzet: je maakt een query string door gebruik te maken van 'plaatsvervangers' (placeholders) zoals hier %d en %s, vervolgens geef je variabelen door aan de db_query() functie om de plaatsvervangers te vervangen. Deze manier van werken voorkomt allerlei SQL aanvallen, zeker wanneer je door de bezoeker ver schafte gegevens als zoekargument in een query gebruikt. Een volgend Drupal-specifiek gebruik dat we willen opmerken is dat tabelnamen in Drupal database-queries altijd omsloten zijn met accolades, zoals bijvoorbeeld {node}. Dit is nodig om je module in staat te stellen gebruik te maken van database-tabelnaam-prefixen. Voor meer informatie kijk je best naar de Drupal website en lees je de Table Prefix (and sharing tables across instances) pagina van het Drupal handboek.
Merk tot slot op dat we in deze tutorial niet erg gericht zijn op toegangsrechten voor de nodes. Normaal zouden alle queries op nodes gebruik moeten maken van de db_rewrite_sql() functie die verzekert dat de bezoeker die een pagina bekijkt de benodigde rechten op die node heeft, maar dat onderwerp valt even buiten de scope van de tutorial.
Wij gebruiken db_fetch_object() om een individueel record te bekijken dat door onze eerdere query is geretourneerd. Voor elke node die we vinden genereren we een link naar die node met de titel van de node als tekst voor de link:
====
<?php
// content variable that will be returned for display
$block_content = '';
while ($links = db_fetch_object($query_result)) {
$block_content .= l($links->title, 'node/'. $links->nid) .'<br />';
}
?>
====
Merk op dat de l() functie de feitelijke link genereert. De l() genereert de <a href="link"> links uit de Drupal paden en past de URL aan op de URL configuratie van de Drupal site, hetzij op schone URL's http://(sitename)/node/2of juist niet http://(sitename)/?q=node/2 (het pad naar elke node is altijd "node/#", daarin is # het ID kenmerk van de betreffende node).
Tot slot moeten we de zojuist gegenereerde inhoud teruggeven aan Drupal zodat zij die kan laten zien:
====
<?php
// check to see if there was any content before returning
// the block view
if ($block_content == '') {
// no content from a week ago
$block['subject'] = 'On This Date';
$block['content'] = 'Sorry No Content';
return $block;
}
// set up the block
$block = array();
$block['subject'] = 'On This Date';
$block['content'] = $block_content;
return $block;
?>
====
We geven een array terug dat 'onderwerp' (subject) en 'inhoud' (content) elementen bevat; en dat is precies wat Drupal verwacht van een blokfunctie. Wanneer je deze beide elementen niet teruggeeft zal het blok niet correct renderen.
Het bovenstaande voorbeeld gaat ervan uit dat als er geen inhoud bestaat op de aangegeven tijd een week geleden, je blok zal zeggen: "Het spijt me ik heb niets." Je zou er ook voor kunnen kiezen om simpelweg het blok weg te laten als er geen inhoud is. Om dat te doen moet je volgende code op de correcte plaats substitueren:
====
if ($block_content == '') {
/* No content from a week ago. If we return nothing, the block
* doesn't show, which is what we want.
*/
return;
}
====
Je kunt hier nu tevens de slechte programmeertechniek opmerken die inhoud (content) en presentatie (layout) op een hoop gooit. Wanneer je een module schrijft voor gebruik door anderen, dan zul een gemakkelijke methode willen aanbieden waardoor die anderen (in het bijzonder niet-programmeurs) de presentatie van de inhoud kunnen aanpassen. Een simpele manier om dat te bereiken is het insluiten (include) van een klasse attribuut in de link. Ook kun je de HTML omgeven met module specifieke <div> tag voor gebruik in CSS en vergeet dan vooral ook die <br/> op het einde van de link! Een veel betere oplossing is de vaak in Drupal gehanteerde praktijk om de module output "themable" te maken. We laten dit nu even voor wat het is, maar het is een van de meest krachtige mogelijkheden van Drupal om inhoud op een gewenste manier te presenteren; misschien hadden we dit zelfs in hoofdletters moeten schrijven.
Goed, onze blokfunctie ziet er in deze fase van de strijd als volgt uit:
====
<?php
function onthisdate_block($op='list', $delta=0) {
if ($op == "list") {
// Generate listing of blocks from this module, for the admin/block page
$block = array();
$block[0]["info"] = t('On This Date');
return $block;
}
else if ($op == 'view') {
// Generate our block content
// content variable that will be returned for display
$block_content = '';
// Get today's date
$today = getdate();
// calculate midnight one week ago
$start_time = mktime(0, 0, 0,$today['mon'],
($today['mday'] - 7), $today['year']);
// we want items that occur only on the day in question, so
//calculate 1 day
$end_time = $start_time + 86400;
// 60 * 60 * 24 = 86400 seconds in a day
$query = "SELECT nid, title, created FROM " .
"{node} WHERE created >= '%d' " .
" AND created <= '%d'";
$query_result = db_query($query, $start_time, $end_time);
while ($links = db_fetch_object($query_result)) {
$block_content .= l($links->title, 'node/'.$links->nid) . '<br />';
}
// check to see if there was any content before returning
// the block view
if ($block_content == '') {
// no content from a week ago
$block['subject'] = 'On This Date';
$block['content'] = 'Sorry No Content';
return $block;
}
// set up the block
$block['subject'] = 'On This Date';
$block['content'] = $block_content;
return $block;
}
} // end onthisdate_block
?>
====
Onze module heeft nu voldoende functionaliteit om te kunnen gebruiken, we de module nu installeren, beschikbaar stellen en testen. Maar nogmaals: het is oneindig veel beter om je modules "themeable" te maken
Gebruik een switch/case in plaats van een if/else if. Een voorbeeld:
====
switch ($op) {
case "list":
// Generate listing of blocks from this module, for the admin/block page
$block = array();
$block[0]["info"] = t('On This Date');
return $block;
break;
case "view":
// Generate our block content
// Get today's date
$today = getdate();
// calculate midnight one week ago
$start_time = mktime(0, 0, 0,
$today['mon'], ($today['mday'] - 7), $today['year']);
... // more code here
break;
case "save":
... // some code here
break;
case "configure":
... // some code here
break;
}
====
Goed, laten we dit doen en zien waar we onze module kunnen verbeteren.
Om de module te installeren moet je de bestanden onthisdate.module enonthisdate.info kopiëren naar de correcte directory van je site; het meest waarschijnlijke is dat dit zal zijn: sites/all/modules/onthissite. Sla de bestanden NIET op met de extensie .php!
Log in als beheerder en navigeer naar de Beheer > Modules pagina en je krijgt een alfabetisch gesorteerde lijst met geïnstalleerde modules. Wanneer je naar beneden scrollt zie je "ergens" de onthisdate module staan met een beschrijving direct daarnaast. Stel nu de module beschik baar door het aanvinken van de checkbox en het opslaan van de nieuwe configuratie.
Het doel van deze module is het tonen van een blok, alleen maar beschikbaar stellen leidt er nog niet toe dat de module ook maar iets laat zien. Ga naar de Beheer > Blokken pagina en stel de module ook daar beschikbaar.
Je doet dat door voor het blok in de drop-down lijst een region te kiezen voor het 'On This Date' blok en de blokken op te slaan. Verzeker je ervan dat de positie (links/rechts) juist staat ingesteld; in overeenstemming met het theme dat je gebruikt. Je wilt nu misschien ook instellen dat het blok alleen op bepaalde pagina's van je site zichtbaar is, of alleen voor bepaalde rollen. Kijk ook even of het allemaal nu ook voor een gewone bezoeker werkt, tot dusver was je immers nog als Beheerder aan het werk.
Om het blok te zien navigeer je naar een pagina waarop dat mogelijk is. Indien noodzakelijk zul je zelf wat gegevens moeten invoeren, hetgeen trouwens het beste is want vaak heb je die gegevens nog niet op je site beschikbaar. Je kunt natuurlijk ook afzien van de beperking op data en tijden.
Wanneer je een wit scherm krijgt of een PHP-foutmelding wanneer je de module beschikbaar stelt, dan heb je waarschijnlijk tegen de syntaxis gezondigd. Bij een wit scherm kun je via de Apache errorlog uitvinden wat er aan de hand is. Je moet dit oplossen want Drupal zal pogen steeds je module te laden. Als het helemaal niet lukt kun je het beste de module verwijderen.
Denk ook nog even aan het volgende. De eerste Drupal gebruiker is een hele speciale gebruiker het is geen bezoeker maar ook geen beheerder, maar hij heeft wel alle rechten, maak dus een beheerder aan en geef, indien nodig de bezoeker enige rechten. Geef het nieuwe blok alle rechten voor een geverifieerde gebruiker.
Dit is een vertaling van Developing for Drupal.
De documentatiepagina's op deze website zijn © 2000-2009 van de individuele auteurs en kunnen worden gebruikt in overeenstemming met de Creative Commons License, Attribution-ShareAlike 2.0. PHP code is gedistribueerd onder de GNU General Public License