Zoals je reeds kon zien in een vorige post over hoe je een formulier gemaakt met de Drupal webform module kon afsluiten na een bepaald aantal inzendingen, is dit ook mogelijk om dit te doen wanneer een bepaald veld een opgegeven aantal inzendingen heeft bereikt.
Toen ik begon aan deze post was het eigenlijk de bedoeling om opnieuw gebruik te maken van de optie 'Additional processing' binnen de Drupal webform module waarmee je PHP code kon toevoegen. Het was echter al een tijdje geleden dat ik dit zelf nog had toegepast maar blijkbaar is deze optie verdwenen sinds Webform 3.x is verschenen.
Deze optie heeft men verplaatst naar de module Webform PHP, maar wordt ten zeerste afgeraden om te gebruiken. Eindgebruikers toegang geven tot PHP code kan inderdaad vrij gevaarlijk zijn.
Om deze mogelijkheid toch te kunnen gebruiken heb ik even een kleine module geschreven die deze functionaliteit kan bieden. Deze module biedt geen admin interface pagina's maar vraagt enkele kleine aanpassingen in de module code zelf om het te personaliseren.
Voor te testen heb ik lokaal even een webformulier toegevoegd met enkele velden, om de data in de database te kunnen vergelijken zorg ik ook dadelijk voor 2 inzendingen.

Als we dan naar de database gaan kijken (zelf gebruik ik even PHPMyAdmin) kunnen we de inzendingen terug vinden in de tabel 'webform_submitted_data'. Klik bovenaan op 'verkennen' en je krijgt de records voor deze tabel te zien.

Zoals je in de tabel kan zien hebben we 2 inzendingen gekregen voor ons webformulier:
- nid: staat voor de Node ID van het webfomulier
- sid: is de ID voor de inzending (Elke inzending krijgt zijn eigen ID mee)
- cid: is de ID voor de velden die we hebben toegevoegd bij het aanmaken van ons webformulier
- data: hier vinden we de ingevulde waardes door de inzender terug
Zoals je kan zien zijn er 2 verschillende inzendingen voor het formulier met node ID 103. Het veld met ID 3 (het select veld dat ik heb aangemaakt) heeft 2 verschillende waardes mee gekregen.
Op basis van deze gegevens kunnen we onze module schrijven en de benodigde waardes invullen.
Als module naam heb ik zelf gekozen voor "webform_limit_submissions". Indien je een andere naam wenst te gebruiken, hou er dan wel rekening mee dat je ook de namen voor de bestanden en functie namen aanpast.
- Eerst maken we een map aan in sites/all/modules met de naam voor onze module: "webform_limit_submissions"
- Het eerste bestand dat we toevoegen in deze map is onze .info waar we Drupal de benodigde info geven over onze module: sites/all/modules/webform_limit_submissions.info
- Geef het volgende op in ons .info bestand:
name = Webform limit submissions
description = Schakel een webformulier uit na een opgegeven aantal inzendingen
core = 6.x
package = Webform
dependencies[] = webform - Het volgende bestand dat we toevoegen voor onze module is het .module bestand waarin onze code komt te staan: webform_limit_submissions.module
- Voorzie dit bestand van de volgende code:
<?php
/*
* @file
* Deze module sluit het formulier af van zodra er een opgegeven aantal inzendingen
* bereikt is met een bepaalde waarde.
*/
/*
* Implementation of hook_nodeapi()
*/
function webform_limit_submissions_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
// Controleer of de opgevraagde node ons formulier is op basis van de Node ID
if ($node->nid == 103) {
switch ($op) {
case 'load':
// Max aantal inzendingen
$aantalInzendingen = 5;
// De ID van het veld waarop we gaan controleren
// Deze kunnen we terug vinden in de database of wanneer we de velden voor het formulier gaan bewerken,
// dan wordt deze ook meegegeven in de URL. Bv: webform/components/3
$veldnr = 3;
// De sleutel of key die we wensen te tellen
$key = 1;
// Tel het aantal inzendingen voor dit formulier met de opgegeven waarde
$count = db_result(db_query("SELECT count(*) FROM {webform_submitted_data} WHERE nid = %d AND cid = %d AND data = %d", $node->nid, $veldnr, $key));
if ($count >= $aantalInzendingen) {
// Indien het max aantal inzendingen bereikt is, verwijderen we alle rollen voor deze node
// uit de {webform_roles} tabel.
db_query("DELETE FROM {webform_roles} WHERE nid = %d", $node->nid);
}
break;
}
}
}
Wanneer we nu naar sites/all/modules gaan zullen we onze module zien verschijnen en kunnen we deze inschakelen en is deze klaar voor gebruik. Let wel dat de hoofdgebruiker (UID1) wel inzendingen zal kunnen blijven doen, dus bij het testen kan je best gebruik maken van een testaccount.
Als je beschikt over verschillende webformulieren waar je dit wilt toepassen kan je deze code in deze module gewoon toevoegen door gebruik te maken van enkele if else statements.

Recente reacties