Hi Tim!
Wenn du die ZSQL-Methode richtig formulierst, dann kannst du es so einrichten, dass du nicht alle Parameter übergeben musst und trotzdem eine Rückgabe bekommst.
Ich habe zufallig eine Testdatenbankverbindung zu einer Gadfly-Datenbank offen. Damit kann man zwar keine LIKE-Bedingungen in Abfragen verwenden, aber zum Demonstrieren genügt das schon. Es existiert eine Tabelle mit dem Namen ``adressen`` und mit zwei Feldern: ``vorname`` und ``nachname``. Das ist die Basis für mein Beispiel.
Jetzt kommt noch die ZSQL-Methode. In diesem Fall nenne ich sie ``addresses_search_sql``. Als Parameter gebe ich ``vorname`` und ``nachname`` an.
Code: Alles auswählen
SELECT vorname, nachname FROM adressen
<dtml-sqlgroup where>
<dtml-sqltest vorname op=eq type=string optional>
<dtml-and>
<dtml-sqltest nachname op=eq type=string optional>
</dtml-sqlgroup>
Dann erstelle ich mit Hilfe des ``Z Search Interface`` ein Suchformular und eine Seitenvorlage für die Anzeige des Ergebnisses. Das was uns dieses ``Z Search Interface`` liefert, ist zwar nicht besonders schön, aber es kann wunderbar als Basis für die Weiterentwicklung dienen, da es auch automatisch Code generiert, der das Ergebnis "Seitenweise" ausgibt.
"Z Search Interface" aus der Kombinationsliste auswählen.
Es erscheint das Fenster "Add Search Interface".
Werte in das Z Search Interface eingeben:
- Select one or more searchable objects: addresses_search_sql
- Report Id: addresses_result
- Report Title: Adressen Suchergebnis
- Report Style: Tabular
- Search Input Id: addresses_search
- Search Input Title: Adressen Suche
- Generate Page Templates: Ja
Mit einem Klick auf [Add] generiert uns nun dieses "Z Search Interface" zwei neue Dateien ``addresses_search`` und ``addresses_result``.
``addresses_result`` kann auch direkt aufgerufen werden. Es werden alle Adressen angezeigt, wenn keine zusätzlichen Parameter übergeben werden. Ruft man die Seite aber mit einem zusätzlichen Parameter auf, dann wird dieser automatisch über das REQUEST-Objekt an die ZSQL-Methode weitergeleitet.
Der Aufruf ``
http://localhost:8080/adressen/addresse ... hname=Mair`` gibt nur Adressen zurück, bei denen der Nachname ``Mair`` ist.
Ruft man die Seite ``addresses_search`` auf, dann hat man dort ein Formular, in welches man die Argumente eingeben kann. Allerdings funktioniert die Suche noch nicht so ganz, da vom Formular ein Leerstring ("") übermittelt wird, wenn in ein Textfeld nichts eingegeben wurde. Somit generiert uns die ZSQL-Methode eine SQL-Abfrage, die uns kein Ergebnis liefert, wenn auch nur ein Feld nicht befüllt wird. Wird z.B. nur der Vorname ``Gerold`` eingegeben, aber nichts in das Feld Nachname, dann würde die ZSQL-Methode diese SQL-Abfrage an die Datenbank schicken:
Code: Alles auswählen
select vorname, nachname from adressen
where
(vorname = 'Gerold'
and nachname = ''
)
Damit können wir aber nichts anfangen. Wir müssen uns darum kümmern, dass ein Argument NICHT übergeben wird, wenn ein Feld leer ist.
Dafür schalten wir ein Python-Script dazwischen (``addresses_searchmethod``):
Code: Alles auswählen
from Products.PythonScripts.standard import html_quote
request = context.REQUEST
response = request.RESPONSE
vorname = request.get("vorname", None)
nachname = request.get("nachname", None)
result_url = container.addresses_result.absolute_url() + "?"
if vorname:
result_url += "vorname=" + html_quote(vorname)
if nachname:
result_url += "&nachname=" + html_quote(nachname)
response.redirect(result_url)
In der Datei ``addresses_search`` muss deshalb die Formular-Action geändert werden. Aus
wird
lg
Gerold