Die Parameterdatei produziere, wobei nur darauf zu achten ist, daß allegro hier keinen Zeilenumbruch einschiebt:
#t{'!OR!'}
#usi p{'sign='} P{'#'}
#005 p{'zstit='} P{'#'}
#t{'!'}
Im Konfigurationsscript ist dann der Hook wie folgt definiert:
sub ResultHook {
s/\!OR\!([^!]*)\!/&orderform($1)/e;
};
und es gibt eine zusätzliche Routine orderform, die ein HTML-Formular generiert, dessen Bestellen-Button dann einen Aufruf von bestell.pl (ein typisches Formmail-Skript etwa) auslöst, wobei Sign und zstit als Parameter übergeben werden:
sub orderform {
local($_) = shift;
my ($Sign, $zstit) = ("", "");
/Sign=([^#]+)\#/i && ($Sign = $1);
/zstit=([^#]+)\#/i && ($zstit = $1);
return <<"XxX";
<form action="bestell.pl" method="GET">
<input type="hidden" name="Sign" value="$Sign">
<input type="hidden" name="zstit" value="$zstit">
<input type="submit" value="Bestellen" name="Bestellen"></form>
XxX
}
Die Idee ist, einen speziellen JobTyp einzusetzen, dessen JobSubtyp die eigentliche Aktion enthält. Im folgenden tunnel.job, der eine Variable Tunnel setzt und ansonsten für die Ausgabe fortfährt gemäß dem JobTyp texts/index, der auch der Standard-JobTyp für die Anwendung ist.
//PO&IniVar(Tunnel,t_tunnel)& //PO&Set(JobTyp,texts/index)&
Das Template texts/index.htm enthält nun die Initialisierung:
<! PO&IniVar(Tunnel)&>
sowie Alternativen bei den Frames, hier also eine Hilfsseite im statischen Fall und alle Übergabeparameter außer natürlich t_tunnel im Tunnel-Fall:
PO?IF(Tunnel)? <FRAME SRC="PO!Pop!?t_PO!Tunnel!=x&PO!Everything(t_tunnel)!" PO?ELSE? <FRAME SRC="PO!Pop!?t_help_hsintro=x" PO?ENDIF?
Im Job für populo steht nun anstatt des üblichen
write "PO:Set(LineTyp,3):" newline list recnum
ein Download mit einer geeigneten Parameterdatei
xport param l-short write "PO:Set(LineTyp,44):" newline download set
Die Parameterdatei l-short.apr muß dabei folgenden Rahmenbedingungen genügen:
Manchmal kommt man mit den Informationen aus der .STL-Datei nicht ans Ziel, etwa weil man in der Kurzliste bereits Thumbnails einbinden möchte. In diesem Fall benötigt man eine Parameterdatei hier etwa d-htmkur.apr, die die gewünschte Information liefert, möglichst durch TAB (Zeichen 9) gegliedert. Zeilenumbrüche sind legal, sie müssen jedoch durch ein vorangestellten Backslach (\) als artifiziell gekennzeichnet sein.
Im Job für populo steht nun anstatt des üblichen
write "PO:Set(LineTyp,3):" newline list recnumkann man dann z.B. folgendes nehmen:
xport param d-htmkur write "PO:Set(LineTyp,44):" newline download setIn der Konfigurationsdatei ist zusätzlich gesetzt:
%LineFlow = ( '44' => \&ParseMyShort, # Parametrierte Kurztitelzeilen );
und das hierfür eingeführte Unterprogramm ParseMyShort ist nicht optimal (die Schwierigkeit sind aber vor allem die Zeilenumbrüche aus der Parameterdatei):
sub ParseMyShort { # LineTyp 44: Kurztitelzeilen
return (undef, {}, []) unless $_;
# Wg. Designfehler in (einziger verfuegbarer Hook ist dieser)
# muss die gesammelte Zeile stets hinterher manipuliert werden
my $collectedstring;
$collectedstring = $RawResult[$#RawResult][2][0] if $concat;
my $typ = $concat ? 'c' : $LineTyp;
$concat = s/\\\\$//;
$concat = $concat ? 1 : 0;
my @fields = split(/\x09/, $collectedstring.$_);
my $temph;
$$temph{'IDN'} = $fields[0];
if ( $collectedstring ) {
$RawResult[$#RawResult]->[1] = $temph;
$RawResult[$#RawResult]->[2] = [$collectedstring, @fields];
}
return ($typ, $temph, [$_, @fields]);
}
Angenommen, eine geeignet gewählte Parmeterdatei produziert RTF (Rich Text), das natürlich mit einem geeigneten Programm (etwa WordView), nach Vorgaben des Benutzers anzuzeigen ist.
Der Job hierfür enthält dann:
//PO&Set(JobTyp, lokdump)& //PO&Set(OutTemplExt, ".rtf")& //PO&Set(ContentType, "text/rtf")&
und das Template lokdump.rtf sieht etwa wie folgt aus, d.h. es enthält den RTF-Kopf, eine Überschrift und die abschliessende geschweifte Klammer:
{\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fnil MS Sans Serif;}
{\f1\fnil\fcharset2 Symbol;}{\f2\fswiss\fprq2 System;}
{\f3\fnil Times New Roman;}}{\colortbl\red0\green0\blue0;}
\deflang1031\pard\qc\plain\f3\fs28 .(Ueberschrift).
\par \pard\plain\f3\fs20
\par \plain\f3\fs24\b Ergebnis
\par \plain\f3\fs20
\par Recherche erfolgte f\'fcr Jahr PO!Jahr!, Inst. PO!Sigel!
<!-- PO?LOOP? -->
PO!L_0!
<!-- PO?ENDLOOP? -->
\par \pard\plain\f3\fs20
\par -----
\par }
Hierfür muß nicht nur ein geeigneter Header Content-Type gesetzt werden, sondern möglichst auch noch ein zusätzlicher Header Content-Disposition:
PO&Set(ContentType, "application/x-allegro-alg")& PO&Append(ContentType, '\nContent-Disposition="inline; filename=xy.alg"')&
Das Ausgabetemplate sollte in diesem Fall besonders minimal sein:
<! PO?LOOP? > PO!L_0! <! PO?ENDLOOP? >