Einzelnen Beitrag anzeigen

axellang

Registriert seit: 3. Mai 2003
Ort: München
138 Beiträge
 
Delphi XE2 Enterprise
 
#1

Benötige Hilfe bei TPageProducer

  Alt 3. Sep 2014, 14:12
Hallo Leute,

schreibe gerade an einer ISAPI Extension für den IIS (Srv. 08/12). Soweit so gut, alles funktioniert wie es soll, nun will der Kunde natürlich
seine eigene Templates verwenden. Ok, Templates mit Tags bestückt (<#MeinTag>) und den TPageProducer (PP) für die Verarbeitung vorbereitet.
Das haut auch bestens hin, bis mir beim debuggen auffiel, dass der PP im OnHTMLTag die Tags zweimal ersetzt und das ist sehr, sehr schlecht.

Ich verwende mit unter ein "Data Modul" das verschiedene Werte verarbeitet und im OnHTMLTag des PP die Werte den Tags zuweist.
Hier mal etwas BeispielCode:
Delphi-Quellcode:
procedure TWebModuleMain.PageProducer1HTMLTag(Sender: TObject; Tag: TTag;
  const TagString: string; TagParams: TStrings; var ReplaceText: string);

var
 dm: TDataModuleHtml;
begin
  dm := TDataModuleHtml.Create(nil);
  try
    if SameText(TagString, 'TAG_1') then
      ReplaceText := dm.GetBlaBla1

    else if SameText(TagString, 'TAG_2') then
      ReplaceText := dm.GetBlaBla2

   // Usw...

    else
      ReplaceText := '';

  finally
    dm.Free;
  end;
end;

end.

procedure TWebModuleMain.WebModuleMainDefaultHandlerAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  PP.HTMLFile := Request.TranslateURI('/templates/template1.html');
  Response.Content := PP.Content;
end;
Also wenn OnHTMLTag aufgerufen wird dann passiert folgendes:
1. DataModule (dm) wird erstellt
2. Er findet den ersten Tag und ersetzt diesen mit dem Wert der function dm.GetBlaBla1
3. Springt ins finally
4. Erstellt DM
5. Findet den zweiten Tag und ersetzt diesen mit dem Wert der func. dm.GetBlaBla2
6. Springt ins finally

Nun sind alle Tags ersetzt und das wars dachte ich, doch dann fängt alles von vorne an.
Nachdem der zweite Durchlauf beendet ist, spuckt er die Seite aus.

Wenn ich nun in den Tamplates nur eine einzige Tag-Stelle setze, dann macht der PP das richtig.
Damit meine ich, der Tag wird ersetzt und der PP geht aus der Methode raus und Ende.

Das Problem hierbei ist, das die function dm.GetBlaBla1 aus dem DataModule z.B. Werte von einem anderen
Server abfragt und die function dm.GetBlaBla1 womöglich auch. Im Umkehrschluss bedeutet das,
um so mehr Tags ich im Template habe um so mehr Fremd-Serveraufrufe ich damit produziere.

Wie kann ich das abstellen?
Mache ich bei der Verwendung des TPageProducer generell einen Fehler?
Ist diese Komponente dafür gedacht oder nur für PP.ReplaceText := 'Hallo ' +Request.ContentFields.Values['FirstName'] + ', Guten Tag' ?

Danke

Alexander
Alexander Lang
  Mit Zitat antworten Zitat