inleiding
Jullie hebben allemaal wel eens gehoord van weblogs. Ikzelf ben er pas een begonnen op http://www.myjamby.com/dennis. Voor het gemak heb ik het design van die site aangenomen...dit wordt uiteraard nog veranderd...
Omdat deze site enorm traag is, en omdat ik graag aan m'n eigen spullen klus, wil ik zelf een leuk weblog in elkaar klussen.
Ik heb wel een aantal eisen. Een daarvan is dat alles template-based moet zijn: met de klik van een muis moet de hele layout verandert kunnen worden. De tabelstructuur staat in een database (voorlopig access), en op het moment dat een pagina aangeroepen wordt, haalt de opgeroepen .asp pagina deze template (.tpl) op uit de database, en vervangt {tags} met content. Zo wordt op de plaats van de {css} tag uit de template, de stylesheet.css inhoud weggezet.
Op http://www.geocities.com/nubster21/blog.zip staat een zip met daarin:
> template_cls.asp (de template rendering class)
> lemonlime.tpl (de template file)
> lemonlime.asp (de pagina die bovenstaande aanroept)
> een img directory met wat plaatjes...
> calendar.asp (genereert een html kalender)
zet ze in een dir op je server, en roep in je browser lemonlime.asp op...door daar de source van te bekijken wordt alles duidelijk. Het is nogal een vraag, maar ik zit echt vast en hoop dat er mensen zijn die die aandacht eraan willen geven...
probleem
Mijn probleem zit hem in calendar.asp. Dit is een .asp pagina die een html kalender genereert. Deze kalender wordt in de template aangeroepen met {calendar}.
-> het probleem is dat de ASP van calendar.asp in zijn geheel naar de client wordt gestuurd, omdat op het moment dat deze pagina aangeroepen wordt, IIS al klaar is met renderen. (ik hoop dat ik het goed definieer).
geprobeerde oplossingen
Ik heb dit opgelost door calendar.asp in een iframe te laden, maar dit is eigenlijk bagger. Dan zou ik dat voor alle .asp content moeten doen die van andere pagina's komt. Server.execute werkt ook niet naar wens: calendar.asp wordt gerendert VOOR de template en komt zodoende niet op de juiste plaats te de pagina (zie zip). Een laatste mogelijkheid is de code in calendar.asp om te bouwen naar een functie, en die te includen in de calling pagina of in de template class. Maar ook hier geldt: dit kan ik toch niet voor ALLE content doen?
vraag
ik zag dat dit forum ook op templating is voorbereid. Heeft iemand ervaring met termplating en kan mij een manier geven waarop ik .asp content in mijn render pagina (lemonlime.asp - zie zip) kan aanroepen? Is er een workaround of moet ik ergens een server-plugin of IIS update vandaan halen?
Alvast enorm bedankt voor jullie reaktie.
- edit: vawege problemen met downloaden zip hier eea gepost: -
############### lemonlime.asp #################
deze pagina geeft een error wanneer ik hem run. De code van
de inlcude template_cls.asp staat hieronder, hoewel niet echt
van belang: het is een vbclass waar je verder weinig aan kunt
veranderen. De code van lemonlime.tpl en calendar.asp staat ook
verder naar onderen. Een voorbeeldje: in lemonlime.asp vervangt
de template class de token siteName uit lemonlime.tpl door
de string "Revellers Weblog". Zoals je ziet wil ik op de plaats
van de calendar-token, een html-kalender wegzetten. Die
kalender wordt in calendar.asp gegenereerd...
############### template_cls.asp ###############
deze template class komt van http://www.4guysfromrolla.com/webtech/061402-1.shtml
############# lemonlime.tpl ################
de template file
############## calendar.asp ################
genereert de html tabel met data, welke ik met {calendar} in
lemonlime.tpl aanroep...
kort samengevat zit het probleem hem in een stukje code uit lemonlime.asp:
het probleem is dat ik op het moment dat deze code gerund wordt (en dus tokens vervangen worden door text-strings) het te laat is om .asp code te runnen die ik op de plek van een token geplaatst wil zien. Met andere woorden; iets als
|
|-> "run calendar.asp en zet de output daarvan op de plaats van de {calender} token"
lukt dus niet. Ik hoop dat eea duidelijk is. Wie kan mij helpen?
Jullie hebben allemaal wel eens gehoord van weblogs. Ikzelf ben er pas een begonnen op http://www.myjamby.com/dennis. Voor het gemak heb ik het design van die site aangenomen...dit wordt uiteraard nog veranderd...
Omdat deze site enorm traag is, en omdat ik graag aan m'n eigen spullen klus, wil ik zelf een leuk weblog in elkaar klussen.
Ik heb wel een aantal eisen. Een daarvan is dat alles template-based moet zijn: met de klik van een muis moet de hele layout verandert kunnen worden. De tabelstructuur staat in een database (voorlopig access), en op het moment dat een pagina aangeroepen wordt, haalt de opgeroepen .asp pagina deze template (.tpl) op uit de database, en vervangt {tags} met content. Zo wordt op de plaats van de {css} tag uit de template, de stylesheet.css inhoud weggezet.
Op http://www.geocities.com/nubster21/blog.zip staat een zip met daarin:
> template_cls.asp (de template rendering class)
> lemonlime.tpl (de template file)
> lemonlime.asp (de pagina die bovenstaande aanroept)
> een img directory met wat plaatjes...
> calendar.asp (genereert een html kalender)
zet ze in een dir op je server, en roep in je browser lemonlime.asp op...door daar de source van te bekijken wordt alles duidelijk. Het is nogal een vraag, maar ik zit echt vast en hoop dat er mensen zijn die die aandacht eraan willen geven...
probleem
Mijn probleem zit hem in calendar.asp. Dit is een .asp pagina die een html kalender genereert. Deze kalender wordt in de template aangeroepen met {calendar}.
-> het probleem is dat de ASP van calendar.asp in zijn geheel naar de client wordt gestuurd, omdat op het moment dat deze pagina aangeroepen wordt, IIS al klaar is met renderen. (ik hoop dat ik het goed definieer).
geprobeerde oplossingen
Ik heb dit opgelost door calendar.asp in een iframe te laden, maar dit is eigenlijk bagger. Dan zou ik dat voor alle .asp content moeten doen die van andere pagina's komt. Server.execute werkt ook niet naar wens: calendar.asp wordt gerendert VOOR de template en komt zodoende niet op de juiste plaats te de pagina (zie zip). Een laatste mogelijkheid is de code in calendar.asp om te bouwen naar een functie, en die te includen in de calling pagina of in de template class. Maar ook hier geldt: dit kan ik toch niet voor ALLE content doen?
vraag
ik zag dat dit forum ook op templating is voorbereid. Heeft iemand ervaring met termplating en kan mij een manier geven waarop ik .asp content in mijn render pagina (lemonlime.asp - zie zip) kan aanroepen? Is er een workaround of moet ik ergens een server-plugin of IIS update vandaan halen?
Alvast enorm bedankt voor jullie reaktie.
- edit: vawege problemen met downloaden zip hier eea gepost: -
############### lemonlime.asp #################
deze pagina geeft een error wanneer ik hem run. De code van
de inlcude template_cls.asp staat hieronder, hoewel niet echt
van belang: het is een vbclass waar je verder weinig aan kunt
veranderen. De code van lemonlime.tpl en calendar.asp staat ook
verder naar onderen. Een voorbeeldje: in lemonlime.asp vervangt
de template class de token siteName uit lemonlime.tpl door
de string "Revellers Weblog". Zoals je ziet wil ik op de plaats
van de calendar-token, een html-kalender wegzetten. Die
kalender wordt in calendar.asp gegenereerd...
ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| <!--#include file="template_cls.asp"--> <% dim objTemplate const TMPLDIR = "" set objTemplate = new template_cls with objTemplate .TemplateFile = TMPLDIR & "lemonlime.tpl" .AddToken "siteName", 1, "Revellers Weblog" 'met een iframe lukt het wel, maar niet in niet-IE .AddToken "calendar", 1, "<iframe src='calendar.asp'></iframe>" 'server.execute zet de kalender op de verkeerde plaats, 'omdat het als eerste gerenderd wordt '.AddToken "calendar", 1, server.execute("calendar.asp") ' nu wordt de asp als tekst naar de client gestuurd '.AddToken "calendar", 1, .loadFile("bodytext.asp", 1) .AddToken "tagLine", 1, "The journey is the reward" .AddToken "topNavItems", 1, "home<br>archives<br>login" .AddToken "cascadingStyleSheet", 1, .loadFile("lemonlime.css", 1) .AddToken "title", 1, "title" .AddToken "body", 1, "<body text=#000000 vLink=#9eb79f>" .AddToken "bodyText", 1, .loadFile("bodytext.asp", 1) .AddToken "navigatorLinks", 1, "navigatorLinks" .parseTemplateFile end with set objTemplate = nothing %> |
############### template_cls.asp ###############
deze template class komt van http://www.4guysfromrolla.com/webtech/061402-1.shtml
ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
| <% '--- --- --- ' template_cls.asp ' ' version 1.5 '---- ---- ---- ' (c)2000 - 2002 James Q. Stansfield (jqs@iridani.net) ' This code is free to be used by anyone provided that the copyright is retained in the script. ' This code may be redistributed provided the copyright is retained in the script. '----- ----- ----- option explicit const cTEMPLATE_VERSION = 1.5 'Define our token type constants const STRINGVARIABLE = 1 const INCLUDEANDPARSE = 2 const INCLUDEANDNOPARSE = 3 const PARSESTRING = 5 const PARSEARRAY = 6 class template_cls '--- 'Declarations '--- private gstrTemplateFile private gobjTokens private gblnReturn private gstrHTML private gstrOpenTag private gstrCloseTag '--- 'Create & Destroy Methods '--- private sub Class_Initialize set gobjTokens = createobject("Scripting.Dictionary") gobjTokens.CompareMode = 1 gblnReturn = False gstrHTML = "" gstrOpenTag = "{" gstrCloseTag = "}" end sub '--- private sub Class_Terminate set gobjTokens = nothing end sub '--- 'Properties '--- public property let TemplateFile(inString) gstrTemplateFile = inString end property '--- public property let OpenTag(inString) gstrOpenTag = inString end property '--- public property let CloseTag(inString) gstrCloseTag = inString end property '--- public property let CI(inBool) if vartype(inbool) = 11 then if inBool then inBool = 1 else inBool = 0 end if gobjTokens.CompareMode = inBool end if end property '--- 'Subroutines '--- public sub AddToken(inToken, inType, inData) if len(inToken) > 0 then if gobjTokens.Exists(inToken) then gobjTokens.Item(inToken) = array(inType, inData) else gobjTokens.Add inToken, array(inType, inData) end if end if end sub '--- public sub DelToken(inToken) if len(inToken) > 0 then if gobjTokens.Exists(inToken) then gobjTokens.Remove(inToken) end if end if end sub '--- public sub RemoveAllTokens gobjTokens.RemoveAll end sub '--- public sub parseTemplateFile parseFile(gstrTemplateFile) end sub public sub parseTemplateString(inString) parseString(inString) end sub '--- 'Functions '--- public function getParsedTemplateFile gstrHTML = "" gblnReturn = true getParsedTemplateFile = parseFile(gstrTemplateFile) end function '--- public function getParsedTemplateString(inString) gstrHTML = "" gblnReturn = true getParsedTemplateString = parseString(inString) end function '--- private function parseString(inString) dim astrData if len(inString) > 0 then astrData = split(inString & vbCrLf, VbCrLf) call parseArray(astrData) end if if gblnReturn then parseString = gstrHTML end function '--- private function parseFile(inFile) if len(inFile) > 0 then if fileExists(inFile) then call parseArray(loadFile(inFile, 10)) end if end if if gblnReturn then parseFile = gstrHTML end function '--- private sub parseArray(inArray) dim strLine for each strLine in inArray call parseLine(strLine & VbCrLf) next end sub '--- private sub parseLine(inLine) dim intA, intB, strLine, strLine2, strToken intA = instr(inLine, gstrOpenTag) if intA > 0 then strLine = left(inLine, intA - 1) intB = instr(inLine, gstrCloseTag) strLine2 = mid(inLine, intB + len(gstrCloseTag)) strToken = trim(mid(inLine, intA + len(gstrOpenTag), (intB - intA - len(gstrOpenTag)))) call printLine(strLine) call getToken(strToken) call parseLine(strLine2) else call printLine(inLine) end if end sub '--- private sub getToken(inToken) if gobjTokens.Exists(inToken) then dim intTokenType, strTokenData intTokenType = gobjTokens.Item(inToken)(0) strTokenData = gobjTokens.Item(inToken)(1) select case intTokenType case 1 'Display Variable call printLine(strTokenData) case 2 'Load File, Parse & Display call parseArray(loadFile(strTokenData, 10)) case 3 'Load File & Display call printLine(loadFile(strTokenData, 1)) case 5 'Parse String call parseLine(strTokenData) case 6 'Parse Array call parseArray(strTokenData) end select end if end sub '--- public function fileExists(inFile) dim objFSO set objFSO = createobject("Scripting.FileSystemObject") if objFSO.FileExists(Server.Mappath(inFile)) then FileExists = True set objFSO = nothing end function '--- public function loadFile(inFileName, inType) dim objFSO, objFile, objStream, strText if fileExists(inFileName) then set objFSO = createobject("Scripting.FileSystemObject") set objFile = objFSO.GetFile(Server.Mappath(inFileName)) set objFSO = nothing set objStream = objFile.OpenAsTextStream(1,0) strText = objStream.Read(objFile.Size) set objStream = nothing set objFile = nothing select case cint(inType) case 0 'Load & Display printLine(strText) case 1 'Load & Return loadFile = strText case 10 'Load & Return As Array loadFile = split(strText & VbCrLf, VbCrLf) end select end if end function '--- private function printLine(inLine) if gblnReturn then gstrHTML = gstrHTML & inLine else response.write(inLine) end if end function end class %> |
############# lemonlime.tpl ################
de template file
ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>{siteName} : {title}</title> {meta} {cascadingStyleSheet} {javaScript} </head> {body} <table width="780" border="0" cellspacing="0" cellpadding="0" align="center"> <tr> <td width="28">[img]"img/top1.gif"[/img]</td> <td width="722"> <table width="722" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="11">[img]"img/topBG.gif"[/img]</td> <td width="711" valign="top" background="img/topBG.gif"> <p>[img]""[/img]<br><b><font size="+2">{siteName}</font></b> <i>{tagLine}</i></p> </td> </tr> </table> </td> <td width="30">[img]"img/top3.gif"[/img]</td> </tr> <tr> <td width="28" background="img/leftBG.gif" valign="top"> [img]"img/leftBG.gif"[/img]</td> <td width="722" bgcolor="#FFFFFF"> <table width="722" border="0" cellspacing="0" cellpadding="0" align="center"> <tr> <td width="120" valign="top"> <table width="120" border="0" cellspacing="0" cellpadding="0"> <tr> <td colspan="3" height="10">[img]""[/img]</td> </tr> <tr> <td width="10">[img]""[/img]</td> <td> <p><b><font size="-2">Navigation<br> </font></b><font size="-2">{navigatorLinks}</font></p> </td> <td width="10">[img]""[/img]</td> </tr> <tr> <td colspan="3" height="10">[img]""[/img]</td> </tr> </table> </td> <td valign="top" width="100%"> <table width="100%" border="0" cellspacing="0" cellpadding="11"> <tr> <td><p>{bodytext}</p></td> </tr> </table> </td> <td width="160" valign="top"> <table width="160" border="0" cellspacing="0" cellpadding="0"> <tr> <td colspan="3" height="10">[img]""[/img]</td> </tr> <tr> <td width="10">[img]""[/img]</td> <td> <p>{calendar}</p> </td> <td width="10">[img]""[/img]</td> </tr> <tr> <td colspan="3" height="10">[img]""[/img]</td> </tr> </table> </td> </tr> </table> </td> <td width="12" align="right" valign="top" background="img/rightBG.gif"> [img]"img/rightBG.gif"[/img]</td> </tr> <tr> <td>[img]"img/bottom1.gif"[/img]</td> <td background="img/bottomBG.gif">[img]"img/bottomBG.gif"[/img]</td> <td>[img]"img/bottom3.gif"[/img]</td> </tr> </table> <p align="center"> <font size="-2">Last update: {lastUpdateString}<br> Copyright {year} {homePageLink (siteName)} </font></p> <p align="center">"this is a manila site" <p align="center"><font size="-2">{themeLink ()}</font></p> </body> </html> |
############## calendar.asp ################
genereert de html tabel met data, welke ik met {calendar} in
lemonlime.tpl aanroep...
ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
| <% Dim ThisMonthYear Dim ThisMonth Dim ThisYear Dim NextMonthYear Dim NextMonth Dim NextYear Dim LastMonth Dim LastYear Dim FirstDay Dim ThisDay ThisDay = 0 ' Set the Month and Year parameters to equal the current values if they do not exist. if (Request.QueryString("Month") = "") Then ThisMonthYear = Now() ThisMonth = Month(Now()) ThisYear = Year(Now()) Else ThisMonth = Request.QueryString("Month") ThisYear = Request.QueryString("Year") End if ' Determine the Last/Next Month and Year if (ThisMonth = 12) Then LastMonth = 11 LastYear = ThisYear NextMonth = 1 NextYear = ThisYear + 1 Else if (ThisMonth = 1) Then LastMonth = 12 LastYear = ThisYear - 1 NextMonth = ThisMonth + 1 NextYear = ThisYear Else LastMonth = ThisMonth - 1 LastYear = ThisYear NextMonth = ThisMonth + 1 NextYear = ThisYear End if End if ' Get the day of the week of the first day in This Month FirstDay = WeekDay(cdate(ThisMonth & "/01/" & ThisYear), vbSunday) DaysInMonth = Day(cdate(NextMonth & "/01/" & NextYear) - 1) %> <style> .today { FONT-SIZE: 9px; COLOR: #aa0000; FONT-FAMILY: verdana,arial,helvetica; } .weekday { FONT-SIZE: 9px; COLOR: #00aa00; FONT-FAMILY: verdana,arial,helvetica; } .weekend { FONT-SIZE: 9px; COLOR: #0000aa; FONT-FAMILY: verdana,arial,helvetica; } .heading { FONT-SIZE: 10px; COLOR: #0000aa; FONT-FAMILY: verdana,arial,helvetica; } .subheading { FONT-SIZE: 10px; COLOR: #000000; FONT-FAMILY: verdana,arial,helvetica; } </style> <table border="0" cellspacing="0"> <tr align="center" valign="top"> <td colspan="3"> <table border="0" cellspacing="0" height="130" bgcolor="#ffffff"> <tr valign="top"> <td class="subheading" width="16" align="right">Su</td> <td class="subheading" width="16" align="right">Mo</td> <td class="subheading" width="16" align="right">Tu</td> <td class="subheading" width="16" align="right">We</td> <td class="subheading" width="16" align="right">Th</td> <td class="subheading" width="16" align="right">Fr</td> <td class="subheading" width="16" align="right">Sa</td> </tr> <% ' Loop through until the number of days In the Month is reached. Do While (ThisDay <= DaysInMonth) %> <tr valign="top"> <% For LoopDay = 1 To 7 ' if ThisDay is still 0, check To see if the current day of the week In the Loop ' matches the day of the week For the first day of the Month. ' if the values match, Set ThisDay To 1. ' Otherwise, the value will remain 0 until the correct day of the week is found. if (ThisDay = 0 And FirstDay = LoopDay) Then ThisDay = 1 End if ' if the ThisDay value is still 0, or it is greater than the number of days ' In the Month, display nothing in the column. ' Otherwise, display the day of the Month and increment the value. if (ThisDay > 0 And ThisDay <= DaysInMonth) Then if (LoopDay <> 1 And LoopDay <> 7) Then %> <td class="weekday" valign="top" align="right"> <%=ThisDay%> </td> <% Else %> <td class="weekend" valign="top" align="right"> <%=ThisDay%> </td> <% End if ThisDay = ThisDay + 1 Else %> <td class="weekday" valign="top" align="right"> </td> <% End if Next %> </tr> <% Loop %> </table> </td> </tr> <tr> <td class="subheading" align="center"><b><%=MonthName(LastMonth)%></b> <b><%=MonthName(NextMonth)%></b></td> </tr> </table> |
kort samengevat zit het probleem hem in een stukje code uit lemonlime.asp:
ASP:
1
2
3
4
5
6
7
| 'met een iframe lukt het wel, maar niet in niet-IE .AddToken "calendar", 1, "<iframe src='calendar.asp'></iframe>" 'server.execute zet de kalender op de verkeerde plaats, 'omdat het als eerste gerenderd wordt '.AddToken "calendar", 1, server.execute("calendar.asp") ' nu wordt de asp als tekst naar de client gestuurd '.AddToken "calendar", 1, .loadFile("bodytext.asp", 1) |
het probleem is dat ik op het moment dat deze code gerund wordt (en dus tokens vervangen worden door text-strings) het te laat is om .asp code te runnen die ik op de plek van een token geplaatst wil zien. Met andere woorden; iets als
ASP:
1
| .AddToken "calendar", 1, calendar.asp |
|
|-> "run calendar.asp en zet de output daarvan op de plaats van de {calender} token"
lukt dus niet. Ik hoop dat eea duidelijk is. Wie kan mij helpen?
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."