4. Emettere sezioni di HTML e spedire il buffer
Per queste operazioni si utilizza la procedura
wrtsection.
In una chiamata si possono emettere una o più sezioni.
Importante.
Una volta che tutte le sezioni desiderate
sono state emesse, non si dimentichi di
spedire al client il buffer di output.
Questo si fa emettendo una sezione fittizia di nome
*fini.
Esempio:
* Emetti una sola sezione
C callp wrtsection('start')
* Emetti due sezioni
C callp wrtsection('part1 part2')
* Spedisci il buffer html al client
C callp wrtsection('*fini') |
Nota 4. Il nome della sezione non risente del maiuscolo/minuscolo.
La lunghezza massima è di 50 caratteri. Non si accettano nè lettere accentate nè caratteri speciali.
Nota 5. La procedura wrtSection può avere due parametri facoltativi:
- Indicatore NoNewLine.
Lo si imposta ad *on per segnalare che la wrtsection
NON deve inserire il carattere di a-capo x'15' alla fine di ogni riga dell'HTML.
Ciò è indispensabile quando al browser vengono inviati dei dati binari.
- Valore NoDataString.
Segnala che cosa va fatto quando viene trovata una variabile di output
a cui non è stato assegnato valore alcumo tramite UpdHtmlVar.
In sua assenza, alle variabili di output non valorizzate viene assegnato il valore
"**Missing Data**".
Esempi:
D NoDataString c '<b>*** no substitution! ***</b>'
* Write a section without newline characters
C callp wrtsection('mysection':*on)
* Write a section with non-default warning for
* missing substitution variables
C callp wrtsection('mysection':*off:
C NoDataString) |
5. Procedure particolari di output
La procedura
wrtNoSection
invia dati al browser senza usare variabili di sostituzione
nè sezioni.
È ideale quando si debba inviare in output
un grosso blocco di dati,
per esempio quando si tratti di emettere immagini o comunque
dati non testuali.
L'esempio seguente illustra come leggere un file IFS esterno
(una pagina HTML, una immagine, ...) e come inserirla
nel buffer di output di un programma CGI:
D IfsInpBuff s 10000a varying
D InpBuffLen s 10i 0
D IfsObj s 255a
D FileHandle s 10i 0
D ReturnInt s 10i 0
D BytesIn s 10i 0
* ... ... ...
* Read an IFS object into "IfsInpBuff"
C eval IfsObj = '/mypath/mysubpath/myobj.xxx'
* 1-Open the IFS file
C eval FileHandle = open(%trim(IfsObj)
C : O_RDONLY + O_TEXTDATA)
* 2-Read the IFS file
C eval BytesIn = read(FileHandle
C : %addr(IfsInpBuff)
C : %size(IfsInpBuff))
* 3-Close the IFS file
C eval ReturnInt = close(FileHandle)
C eval IfsInpBuff = %trim(IfsInpBuff)
* Insert the string read into the CGI output buffer
C ' ' checkr IfsInpBuff InpBuffLen
C callp WrtNoSection(%addr(IfsInpBuff):
C InpBuffLen) |
La procedura
clrHtmlBuffer
pulisce tutto quanto è stato posto
nel buffer di output HTML, purchè
non sia già stato spedito al client
o scritto in uno stream file.
Questo è utile quando la logica del programma
impone di fornire in output qualcosa di diverso
da quanto è già stato posto nel buffer.
La procedura
getHtmlBytesBuffered
Restituisce la lunghezza (numero di byte)
del buffer HTML di output
La lunghezza aumenta ogni volta che si scrive dell'output
con la procedura WrtSection o con la procedura
WrtNoSection
La lunghezza viene ripristinata a 0 quando si esegue
WrtSection('*fini') oppure WrtHtmlToStmf
Se si lascia che la lunghezza del buffer HTML di output
superi i 16 Mb, il programma CGI fallisce.
Questa procedura può essere utile per decidere
di troncare una pagina HTML di output quando le sue
dimensioni superino un limite ragionevole.
D buffsize s 10i 0
C eval buffsize = getHtmlBytesBuffered |
La procedura
getHtmlBufferP
Restituisce il puntatore al buffer HTML di output ed il numero di byte utilizzati in questo buffer.
Utile per effettuare del debugging o per prelevare dal buffer quanto ivi scritto.
D OutBuffer s 32767 based(OutbufferP)
D OutBufferInfo ds
D OutBufferP *
D OutBufferLen 10u 0
C eval OutBufferInfo=callp(GetHtmlBufferP) |
La procedura
crtTagOpt
Restituisce una tag HTML <option value="...">...</option>
da utilizzarsi nell'ambito di una <select ...> .
Naturalmente esistono altri modi per creare le <option>
all'interno di una selection list.
/$strselect
<table>
<tr><td>Please select desired date:</td></tr>
<tr><td><select name="date">
/$option
/%optionvalue%/
/$endselect
</select>
</td></tr>
</table>
|
D dates s 15 dim(3)
D i s 10i 0
D optionValue s 200 varying
/free
wrtsection('strselect');
for i=1 to 3;
optionValue=CrtTagOpt(%char(i):dates(i));
updhtmlvar('optionvalue':optionValue);
wrtsection('option');
endfor;
wrtsection('endselect');
|
Abbiamo un programma che dimostra l'utilizzo della procedura CrtTagOpt: