Alltså, när man väl börjar kika på det, så inser man att det borde varit gjort för länge sedan. Jag tror visserligen inte det har någon avgörande betydelse, men det har alltid stör mej lite, att xVis själv genererar en del av HTML koden. Visserligen har ju jag själv sett till vilken HTML kod som kommer ut, men det har stört mej att inte kunderna har full kontroll över all HTML kod.

Men som sagt, nu är det iaf gjort.

Det finns två typer av kodblock som xVis genererar.

1. Ett statiskt block, t. ex en rubrik med tillhörande text.

2. Ett statisk och dynamiskt block, dvs i det statiska blocket kan det finnas ett dynamiskt block, i form av någon slags loop, där du inte alls vet hur många loopar det blir.

För att fixa detta behöver vi någonting i mallarna som talar om för oss vad som är startblocket i mallen, vad som är stop blocket och vad som är det block som skall repeteras. Vi behöver dessutom har nånting som ska ersättas med faktisk data, t. ex en rubrik. För detta definierar vi ett antal taggar. 

{$start} – Definierar det block av kod i mallen som skall finnas i början.

{$foreach} […] {$next} – Kod däremellan skall repeteras. 

{$stop} – Kod som kommer efter denna tagg skall avluta den av mallen genererade koden.

Exempel på ersättningstagg:

{$headertext} – Rubriktext

Ersättningstaggarna kan se lite olika ut, beroende på vilken mall det handlar om, men ovan tagg förekommer mer eller mindre i alla mallar.

En mall i det första fallet behöver bara innehålla erättningstaggar, eftersom ingen kod skall repeteras eller göras nåt annat avancerat med. Vi läser bara in mallfilen och ersätter ersättningstaggarna med den faktiska datan. Ett exempel på mallfil:

<h1>{headertext}</h1>
<div>{helptext}</div>

 Detta är mallen för den s.k hjälptexten i xVis. Vi läser in filen och ersätter:

 
string templateFile = HttpContext.Current.Server.MapPath("help.tpl");
TextReader tr = new StreamReader(templateFile);
string fileContent = "";

fileContent = tr.ReadToEnd();

 

tr.Close();
fileContent = fileContent.Replace("{headertext}", helpHeaderText);
fileContent = fileContent.Replace("{helptext}", dt.Rows[i]["hText"].ToString().Replace("\n","
"));

I det andra fallet är det lite klurigare.

Ett exempel på mallfil för detta är menyn:

{$start}
<ul>
{$foreach}
<li>
<a href="{link}">{linktext}</a>
</li>
{$next}
{$stop}
</ul>

Vi behöver alltså först läsa in startblocket. Startblocket slutar när {foreach} taggen kommer, så vi efter vi läst in filen, läser vi in allt mellan {start} och {foreach}:


System.Text.RegularExpressions.Regex sr = new System.Text.RegularExpressions.Regex("{\\$start}.+\\$foreach}");
System.Text.RegularExpressions.Match s = sr.Match(fileContent);
string start = s.Value;

Nu har vi en sträng med det som kommer först i filen. Om mallfilen skulle innehålla någon ersättningstagg, får vi göra en replace på det, men det gör inte menymallen. Däremot får vi ta bort {start} och {foreach} taggarna, dom vill vi ju inte ha med.


start = start.Replace("{$start}", "");
start = start.Replace("{$foreach}", "");

Sen gör vi samma med det block som skall repeteras:

System.Text.RegularExpressions.Regex rr = new System.Text.RegularExpressions.Regex("{\\$foreach}.+\\$next}");
System.Text.RegularExpressions.Match r = rr.Match(fileContent);
string repeat = r.Value;
repeat = repeat.Replace("{$foreach}", "");
repeat = repeat.Replace("{$next}", "");

Och till sist, samma vända med slutet av mallfilen:


System.Text.RegularExpressions.Regex ss = new System.Text.RegularExpressions.Regex("{\\$stop}.+");
System.Text.RegularExpressions.Match st = ss.Match(fileContent);
string stop = st.Value;
stop = stop.Replace("{$stop}", "");

Nu behöver vi hämta det som skall loopas från t. ex en databas. För varje träff i databasen gör vi replace på ersättningstaggarna med datan vi har hämtat.

string thisRepeat = "";
//Hämta från databas

//För varje rad i resultatet
{
thisRepeat += repeat;
thisRepeat = thisRepeat.Replace("{link}", dt.Rows[i]["lUrl"].ToString() + "?lang=" + lang);
thisRepeat = thisRepeat.Replace("{linktext}",dt.Rows[i]["lName"].ToString());
}

Nu har vi all data vi vill visa i tre strängar, start, thisRepeat och stop och kan bara skicka ut dem till klienten:


this.Control.Add(new LiteralControl(start));
this.Control.Add(new LiteralControl(thisRepeat));
this.Control.Add(new LiteralControl(stop));

Som sagt, inte så avancerat när man börjar pilla med det. xVis är förresten skrivet i C#, vilket kanske kan vara bra att veta.