7 Tricks

    1. Externe Anbindungen
      1. Übergang zu einem Bestellformular anbieten
    2. Navigationsfunktionalität
      1. Frameset von aussen aufbauen
    3. Beeinflussung der Ausgabe
      1. Parametrierte Kurzliste: Ersatz
      2. Parametrierte Kurzliste II: völlig frei und ohne interne Satznummern
      3. RTF-Dateien weiterleiten
      4. Download-Dialog auslösen
Im folgenden einige einfache Lösungen für Standardsituationen:

7.1 Externe Anbindungen

7.1.1 Übergang zu einem Bestellformular anbieten

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
}

7.2 Navigationsfunktionalität

7.2.1 Frameset von aussen aufbauen

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&amp;PO!Everything(t_tunnel)!"
PO?ELSE?
 <FRAME  SRC="PO!Pop!?t_help_hsintro=x"
PO?ENDIF?
…

7.3 Beeinflussung der Ausgabe

7.3.1 Parametrierte Kurzliste: Ersatz

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:

7.3.2 Parametrierte Kurzliste II: völlig frei und ohne interne Satznummern

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 recnum
kann man dann z.B. folgendes nehmen:
xport param d-htmkur
write "PO:Set(LineTyp,44):" newline
download set
In 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]);
}

7.3.3 RTF-Dateien weiterleiten

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 }

7.3.4 Download-Dialog auslösen

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? –>