In the CMS system I work with – Dynamicweb CMS – content is build around various templates, each containing a output from the system. The output is generated using ASP.NET and each bit of content is represented in a “tag”. For instance if you want the name of the user which has logged on the page you enter
<!—@Global:Extranet.Name-->
Such templates are based on HTML, it is: You create static parts of HTML and insert tags where you want the system to insert dynamic content.
You might want to do something like this:
...<div>Hi <!—@Global:Extranet.Name-->!</div>...
So far so good! But what if the user has not logged in? You will need to do one of three things:
The Javascript soloution
Put shortly: Using javascript to control which content is shown is basically not a good idea. But today almost anyone browsing the net has javascript turned on, and the trend (IMHO) goes towards very powerfull javascript parts. Another discussion is that: “Why give a visitor contents if you allready before you start sending information (HTML) that the content is not really relevant?”. Well, another article about that..
Here goes:
...<script type="text/javascript">
if ('<!—@Global:Extranet.Name-->'!='') {
document.write('<div>Hi <!—@Global:Extranet.Name-->!');
}
</script>...
The CSS soloution
This is actually not a way which I would say always works! But the theory is that you put CSS classes on HTML tags that are build around a classname-prefix (“customerNumber” for instance) and then add the dynamic value from Dynamicweb CMS as postfix. So if a user has logged in a classname would be for instance “customerNumber342” for a customer with the number 342. A customer who has not yet logged in would give a classname “customerNumber”. So if we by default hide the classname “customerNumber” any other classnames would be displayed!
Cute right? But the problem can rise when sometime certain Dynamicweb template tags are not replaced, even if it has no value. That way you might end up with
“customerNumber<!--@Global:Extranet.CustomerNumber-->”
That would even be invalid HTML!
Anyway here is how a CSS based soloution could be.
<head>.. <style type="text/css">
.customerNumber {display: none;}
</style>
..
</head><body>
...
<div class="customerNumber<!--@Global:Extranet.CustomerNumber-->">
Hi <!—@Global:Extranet.Name-->!
</div>
The If Defined soloution
Dynamicweb CMS offers a way to check if a tag has content, and only pass the content within the IF-ENDIF if a tag has content.
<!--@If Defined(Global:Extranet.Name)--> <div>Hi <!—@Global:Extranet.Name-->!</div> <!--@EndIf(Global:Extranet.Name)-->
...<div>Hi <!—@Global:Extranet.Name-->!</div>...
These are just 3 ways of making workaround in Dynamicweb CMS, you could ofcause come up with more! For instance combining the javascript and CSS soloution.
XSLT Templates comes to our rescue – well almost!
Imagine that you build your content using XSLT: Dynamicweb CMS will build a XML document containing all the “template tag values” in a structured way. A tiny bit of this XML document might be:
...<Global.Extranet.Name>342</Global.Extranet.Name>...
So this way you decide if it is relevant to produce output based on “real” values! You can use the power of XSLT/XPATH to decide what to do. An example:
<xsl:if test="Global.Extranet.Name!=''"> <div>Hi <xsl:value-of select="Global.Extranet.Name" />!</div> </xsl:if>
All this is done before the content has been send to the client (in Dynamicweb Backend). It is a clean powerfull way to produce exactly what is needed for the page to render as wished.
Nothing is perfect…
When all this is said, I must warn you: The XSLT templates path is – I am sad to say – not always perfect in Dynamciweb CMS. The XML document does not always have all tags. I have some workarounds which I will write about in a later article.
You can see all template tags at templates.dynamicweb.dk.