Anfänger mit Verständnisfragen mit MySQL Template

Django, Flask, Bottle, WSGI, CGI…
Antworten
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Mittwoch 7. November 2007, 14:34

Hi Leute,
also ich bin noch ziemlicher Anfänger mit Plone aber ich arbeite mich gerade mit aller Gewalt durch dieses Plone online Buch und stoße hier und da auf kleine Probleme...

Gleichzeitig versuche ich eine einfache MySQL Abfrage zu generieren, die auch so einigermaßen klappt. Vielleicht kann mir Jemand helfen dass ich da weiter komme...

Also die Verbindung zur Datenbank steht und ich kann auch in dem ZMI mit meinem Template suchen...

Zum einen habe ich hier ein Template, was in meiner Testploneseite auch dargestellt wird mit einem Feld, in dem ich eine Suchid eingeben kann....

Code: Alles auswählen

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
      lang="en"
      metal:use-macro="here/main_template/macros/master"
      i18n:domain="plone">

<body>
<div metal:fill-slot="main">
<h1>Search PDB ID</h1>
<tal:comment tal:replace="nothing">
 Submits the form's data to the python script searchpdb.  searchpdb is where
 the transaction with the MySQL database actually takes place. 
</tal:comment>
<form name="search_in_bif" action="search_in_bif" method="post">
<fieldset>
<legend>PDB ID</legend>
<div class="field">
    <label>PDB Code</label>
    <p><input size="60" type="text" name="pdbid"></p>
</div>
</fieldset>
<div class="formControls">
    <input type="submit" value="Submit">
</div>
</form>
</div>
</body>
</html>

Danach habe ich ein Pythonscript erstellt nach Anleitung, was die Daten des Formulars an das mysqlscript schicken soll.

Code: Alles auswählen

#Import a standard function, and get the HTML request and response objects.
from Products.PythonScripts.standard import html_quote
request = container.REQUEST
RESPONSE = request.RESPONSE

# Insert data that was passed from the form
context.search_in_bif(pdbid=request.pdbid)

# Re-direct back to your location
RESPONSE.redirect('testfolder/searchpdbid')

Das mysqlscript sieht so aus:
ID: search_in_bif
Arguments: pdbid

Code: Alles auswählen

select entry_key,id from MMS_ENTRY where id=(<dtml-sqlvar pdbid type="string">)



So, mein Problem ist, wenn ich das alles im ZMI teste geht das, aber die Formatierung ist halt nicht da... Im Moment ist es so, das wenn ich auf meinem ersten Template ein Suchwort eingebe komme ich in das ZMI auf die Oberfläche wie wenn ich dort bei meinem mysqlscript test drücken würde...

Irgendwo ist da also ganz sicher ein Fehler und was ich mich auch noch Frage, wenn das Python Script ausgeführt wird, muss ich ja dann mit redirect irgend wo hin leiten. Ich hätte natürlich gerne eine Ergebnisseite, bei der das Ergebnis der MySQL Abfrage zu sehen ist. bin aber im Moment Planlos wie ich das anstellen soll.

Wäre sehr sehr Dankbar für ein wenig Hilfe....
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Montag 19. November 2007, 17:34

Kann mir hier wirklich keiner helfen? Kann doch kein großer Fehler sein... Ich denke es ist einfach nur ein kleines Verständnisproblem...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 19. November 2007, 20:41

Hallo würmchen!

Willkommen im Python-Forum!
würmchen hat geschrieben:

Code: Alles auswählen

# Insert data that was passed from the form
context.search_in_bif(pdbid=request.pdbid)

# Re-direct back to your location
RESPONSE.redirect('testfolder/searchpdbid')
Du rufst mit ``context.search_in_bif(pdbid=request.pdbid)`` eine ZSQLMethode auf, richtig? Wenn ja, warum kümmerst du dich nicht um das was dir die Methode zurück gibt?

``RESPONSE.redirect()`` gibt dem Browser die Anweisung zurück, eine neue URL abzurufen. Das ist das gleiche, als ob du im Browser eine neue URL eingeben würdest. Zwischen der alten und der neuen Seite werden keinerlei Daten ausgetauscht. So läuft das nicht.

Du hast mehrere Möglichkeiten:

1.)
1.1) Eingabeformular ruft PythonScript auf (Parameter werden dabei an PythonScript weitergegeben)
1.2) PythonScript gibt Zielseite zurück und übergibt an Zielseite die Daten.
1.3) Zielseite bekommt die Daten über die Variable ``options`` und zeigt diese an.

2.)
2.1) Eingabeformular ruft Zielseite auf (Parameter werden dabei an Zielseite weitergegeben)
2.2) Zielseite ruft PythonScript auf und übergibt Parameter.
2.3) Zielseite bekommt von PythonScript Daten zurück
2.4) Zielseite zeigt Daten an.

3.) Du machst es auf die Plone Art --> http://www.inqbus-hosting.de/support/do ... -verwenden

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Dienstag 20. November 2007, 09:41

gerold hat geschrieben: Du rufst mit ``context.search_in_bif(pdbid=request.pdbid)`` eine ZSQLMethode auf, richtig? Wenn ja, warum kümmerst du dich nicht um das was dir die Methode zurück gibt?

``RESPONSE.redirect()`` gibt dem Browser die Anweisung zurück, eine neue URL abzurufen. Das ist das gleiche, als ob du im Browser eine neue URL eingeben würdest. Zwischen der alten und der neuen Seite werden keinerlei Daten ausgetauscht. So läuft das nicht.
Hi, danke dass sich doch noch jemand erbarmt hat mir zu helfen :-)

Ich hatte mich versucht an das Howto von der Ploneseite zu halten. http://plone.org/documentation/tutorial/plone-and-mysql
Da ist dann am Schluss eine Anleitung, wie man Argumente verarbeitet, ich hatte dann einfach versucht innovativ das auf meine Bedürfnisse abzuwandeln, aber irgendwo etwas übersehen/nicht verstanden.

Die machen zu mindest den RESPONSE.redirect('/whereever/your/page/is/located') und damit konnte ich nicht wirklich was anfangen.


Was mich aber noch mehr wundert, wenn ich in mein Formular etwas eintrage und dann abschicke, warum komme ich dann in das ZMI und muss da nochmal das selbe eintragen und nochmal schicken... Also scheint schon das weitergeben an die ZSQL Methode nicht zu funktionieren, oder?

Grüße Wurm


EDIT: sollte vielleicht erwähnen, ich nutze folgende Software:
* Plone 3.0.2
* CMF-2.1.0
* Zope (Zope 2.10.4-final, python 2.4.4, linux2)
* Python 2.4.4 (#1, Nov 1 2007, 11:24:50) [GCC 4.0.2 20050901 (prerelease) (SUSE Linux)]
* PIL 1.1.6
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Dienstag 20. November 2007, 10:24

würmchen hat geschrieben:Die machen zu mindest den RESPONSE.redirect('/whereever/your/page/is/located') und damit konnte ich nicht wirklich was anfangen.
Hallo würmchen!

Code: Alles auswählen

# Insert data that was passed from the form
context.insert_users(first_name=request.first_name, last_name=request.last_name)

# Re-direct back to your location
RESPONSE.redirect('/wherever/your/page/is/located')
Das sagt mir, dass die ZSQLMethod ``insert_users`` Daten entgegen nimmt und diese in eine Datenban schreibt. --> Keine Rückgabe.

Es gibt keine Rückgabe, deshalb macht es auch keinen Sinn, irgendeine Rückgabe irgendwohin weiterzureichen. Wurden die Daten eingetragen, dann soll der Browser die Seite wieder frisch/neu anzeigen. Deshalb steht im Beispiel auch ``redirect``.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Dienstag 20. November 2007, 11:04

AHHHHHH Ok, macht Sinn...

Dann war das schon mal mein Verständnisproblem. Jetzt frag ich mich nur, wie ich das Ergebnis an mein Template weitergebe...


Mein Template habe ich listkey genannt und sieht so aus:

Code: Alles auswählen

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
      lang="en"
      metal:use-macro="here/main_template/macros/master"
      i18n:domain="plone">

<body>

<div metal:fill-slot="main">

    <h1>My PDB ID and the Entry Key</h1>

    <table>
        <tr><th>Entry Key</th><th>PDB ID</th></tr>
        <tr tal:repeat="records context/find_entry_key">
            <td><span tal:replace="records/entry_key">Entry Key</span></td>
            <td><span tal:replace="records/id">PDB ID</span></td>
        </tr>
    </table>

</div>
Das sollte normal die Daten die aus der Datenbank kommen darstellen, bei meiner select * from MMS_ENTRY hat es zumindest die Ergebnisse angezeigt, nur hier will es nicht?
Wahrscheinlich muss ich mit dem Pythonscript die Ausgabe eben so verarbeiten das sie das Template lesen kann. Wäre schön wenn Du mir da nochmal helfen könntest...

Grüße Wurm
Antworten