Einbinden eines Bestätigungfeldes (onClick) in grok.action

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Hazel75
User
Beiträge: 5
Registriert: Dienstag 28. Juli 2009, 12:30

Moin, moin liebe Forumsteilnehmer und Experten von der Küste,
ich habe hier einen Sachverhalt, der mir schon seit einiger Zeit das Gehirn schmelzen lässt. Bevor ich jetzt weitergrübel, möchte ich sichergehen, dass die Idee überhaupt umsetzbar ist und bin für jeden Tipp / für jede Antwort dankbar!

Es geht hierbei um eine mittels Zope 3 / Grok erstellte Webanwendung. Genutzt wird eine SQL-Datenbank.
Daten dieser Datenbank werden auf einer Seite angezeigt und es gibt zwei Arten der weiteren Verarbeitung (grok.action (bearbeiten und loeschen). Sowohl das Bearbeiten als auch das Löschen funktionieren reibungslos. Beim Löschen ist allerdings der Datensatz sofort ohne weiter nachzufragen weg.

Zum Nachfragen gibt es bekanntlich die JavaScript-Anweisung "onClick="return window.confirm('Loeschen?')". Diese kann ich im PageTemplate aber scheinbar nicht sinnvoll einbauen, da die Verlinkung in der Python-Datei erfolgt.

An der entsprechenden Stelle sieht das PageTemplate wie folgt aus:

<tr class="controls">
<td>
<input tal:repeat="action view/actions"
tal:replace="structure action/render" />
</td>
</tr>

Das Python-Coding hat folgenden groben Aufbau:

@grok.action(_u(u'Loeschen'))
def loeschen(self, **kw):
context = self.context
...
...
store = getUtility....
delbef = store.find.....
delbef.remove()
url = 'xyz'
self.redirect(url)

Jetzt stellt sich die Frage, ob es überhaupt grundsätzlich möglich ist, in diesem Fall das "onClick" anzuwenden oder ob es nicht sinniger wäre, im Python auf eine Zwischenseite zu verweisen, wo dann nachgefragt wird und je nach Antwort dann mit delbef redirected oder eben ohne delbef weitergeleitet wird.
Ferner besteht m.E. noch die Möglichkeit, die URL's im Template zu generieren und dann beim HREF das "onClick" mit einzubauen.

Was wäre Eurer Meinung nach die sauberste Alternative? Habe ich etwas übersehen? Vielen lieben Dank.
Hazel75
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Das ist ja eher ein HTML-Javascript-Problem, und kein Python-Problem. Code solltest du trotzdem in Codetags rein machen :)

Wie siehts damit aus?

Code: Alles auswählen

<a href="foo" onClick="if(!confirm('foo?')) return false" >foo</a>
Hazel75
User
Beiträge: 5
Registriert: Dienstag 28. Juli 2009, 12:30

Hallo Dauerbaustelle,
danke erstmal für die Antwort. In meinen Augen ist es doch ein Python-Problem, da ich im HTML keine weiteren Verlinkungen vornehme.

Code: Alles auswählen

<tr class="controls">
   <td>
       <input tal:repeat="action view/actions"
                 tal:replace="structure action/render" />
   </td>
</tr> 
Die Logik der Weiterleitung auf die Bearbeitungsseite bzw. das Löschen und Weiterleiten beim Drücken des Löschbuttons erfolgt komplett im Pythoncode:

Code: Alles auswählen

@grok.action(_u(u'Loeschen'))
def loeschen(self, **kw):
    context = self.context
    ...
    ...
    store = getUtility....
    delbef = store.find..... 
    delbef.remove()
    url = 'xyz'
    self.redirect(url) 
Das onClick kann ich nicht im Python-Code verwenden und "a href" gibt es nicht im Page Template... oder ich habe eine Gedankenfehler...
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Naja, dann tu das onclick-Zeug halt in das HTML-Element rein, das die Löschvorgang aufruft (Hyperlink, Submit-Button o.ä.).

Gruß
Hazel75
User
Beiträge: 5
Registriert: Dienstag 28. Juli 2009, 12:30

Dauerbaustelle hat geschrieben:Naja, dann tu das onclick-Zeug halt in das HTML-Element rein, das die Löschvorgang aufruft (Hyperlink, Submit-Button o.ä.).

Gruß
Genau das ist das Problem. Es gibt keinen Hyperlink und keinen Submit-Button.
Der Hyperlink erfolgt im Python-Code durch:

Code: Alles auswählen

self.redirect(url)
Und der Submit-Button ergibt sich aus:

Code: Alles auswählen

@grok.action(_u(u'Loeschen'))
HTML zeigt diese lediglich durch

Code: Alles auswählen

<input tal:repeat="action view/actions"
                 tal:replace="structure action/render" />
an.

Und dort kann ich das OnClick-Zeugs reinwurschteln, wie ich lustig bin - es passiert nichts.

Lieben Gruß
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Hazel75 hat geschrieben:Und dort kann ich das OnClick-Zeugs reinwurschteln, wie ich lustig bin - es passiert nichts.
Naja, du ersetzt ja mit tal:replace den kompletten Tag, also musst du das irgendwo auf der Python-Seite rendern. Evtl. hat der action-Decorator da eine entsprechende Option. Am besten wäre imo aber eh eine Zwischenseite da a) confirm() das nervigste ist, was es gibt(modale Dialoge sollte man imo nur verwenden, wenn es unbedingt nötig ist, also quasi nie) und b) das sowieso nur funktioniert, wenn Javascript angeschaltet ist.
Hazel75
User
Beiträge: 5
Registriert: Dienstag 28. Juli 2009, 12:30

Darii hat geschrieben:
Hazel75 hat geschrieben:Und dort kann ich das OnClick-Zeugs reinwurschteln, wie ich lustig bin - es passiert nichts.
da a) confirm() das nervigste ist, was es gibt(modale Dialoge sollte man imo nur verwenden, wenn es unbedingt nötig ist, also quasi nie) und b) das sowieso nur funktioniert, wenn Javascript angeschaltet ist.
Yupp - das ist doch eine Ansage (bin mit Java nicht so bewandert) - werde mich dann mal auf diesen Weg begeben. Danke schön!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

JavaScript != Java. Die Sprachen könnten kaum unterschiedlicher sein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Hazel75
User
Beiträge: 5
Registriert: Dienstag 28. Juli 2009, 12:30

Leonidas hat geschrieben:JavaScript != Java. Die Sprachen könnten kaum unterschiedlicher sein.
Hm, das ist dann ja genau die Bestätigung meiner Aussage, dass ich mich mit Java und Java Script nicht auskenne.

Habe den Sachverhalt jetzt mit einer "Zwischenseite" gelöst. Thema kann geschlossen werden.

Danke!
Antworten