CFModule wordt twee keer uitgevoerd

31-12-2012 | Marcel van Langen | ColdFusion | cfmodule, cfinclude, double, execute

De CFModule tag is bedoeld om een custom tag binnen ColdFusion te invoken. Nou weet ik niet wat jullie doen, maar ik gebruik deze tag eigenlijk nooit. Let gewoon op je scope en je kunt net zo goed een CFInclude doen. Of roep gewoon de custom tag rechtstreeks aan. Maar goed, ik moest werken aan een applicatie van iemand anders, en die was er wel gek op. Alleen werd de custom tag twee keer uitgevoerd.

De pagina in kwestie presenteerde een rapport. Alleen duurde het genereren van dat rapport bijna 2 minuten. Dat is een eeuwigheid voor gebruikers. Aan mij de taak om deze tijd terug te brengen. Bij het doorspitten van de bestaande code viel het mij op dat bepaalde queries twee keer werden uitgevoerd. Vreemd. Het enige dat hier vreemd aan was, was dat het een include via een CFModule betrof. Iets dat ik zelf eigenlijk nooit gebruik.

Maar waarom wordt de code dan twee keer uitgevoerd? De reden is eigenlijk kinderlijk eenvoudig. Er zijn nogal wat CF tags die geen sluittag (closing tag) hebben. Denk bijvoorbeeld aan CFSET of CFPARAM. Nogal wat ontwikkelaars hebben daarop de gewoonte aangenomen om deze tags toch af te sluiten op een XHTML achtige wijze, als volgt:

<cfparam name="variables.varAansluiting" default="0" />

Door de / aan het eind sluit je de tag ook netjes af. Probleem is dat je dit bij CFModule niet moet doen. Doe je dat wel, dan wordt hij twee keer uitgevoerd. CFModule is namelijk een zogenaamde wrapping tag, wat betekent dat het twee keer wordt uitgevoerd: een keer als template en een keer als content. Let wel: dat betekent dat eventuele content uit de custom tag maar 1 keer wordt getoond!

Er zijn in essentie drie oplossingen mogelijk. De eerste en meest eenvoudige is om de CFModule tag niet meer af te sluiten met />, maar alleen met >. Dat lost het probleem al op. Wellicht zuiverder is om gebruik te maken van de execution modes van CFModule. Dat zijn er namelijk twee: start en end. Deze kun je als conditie aanspreken binnen de custom tag, bijvoorbeeld <cfif ThisTag.ExecutionMode IS "start">. De derde oplossing heeft mijn voorkeur: gebruik gewoon geen CFModule, maar stap over op een CFInclude of aparte functies binnen componenten.

Over Morloff

Morloff ontwerpt en realiseert succesvolle webtoepassingen op het gebied van procesoptimalisatie, eCommerce en rapportage door de inzet van moderne webtechnieken, sociale media en zoekmachine optimalisatie.

over ons | diensten | portfolio | contact | route

naar website IJsmonster.nl naar website ICT intermediairs naar website marcelvanlangen.com

Twitter

Morloff

Cuneraweg 169a
3911 RH Rhenen

M +31 (0)6 - 515 96 189
W www.morloff.nl
E contactformulier

Morloff op Twitter Morloff op Facebook Morloff op LinkedIn Morloff via RSS