Seite 1 von 1

Aktions-Feedback zum User schicken, wie? (flash messages)

Verfasst: Donnerstag 15. Mai 2008, 10:49
von jens
Ich frage mich wie man am besten dem User eine Nachricht als feedback zu einer ausgeführten Aktion in der Web App auf der nächsten Seite zeigen kann.

Der einfachste Weg wäre wohl in den GET Daten einfach sowas wie ?msg=Text dran zu hängen und die Daten dann in der Webseite einzublenden.
Wäre aber eine sehr dumme Idee, weil man so Cross-Site Scripting einfach macht ;) Die Nachricht in den POST Daten zu "verstecken" ist wohl ebenso Sinnlos.

Die Nachricht in den Session Daten auf dem Server belassen wäre ok. Es gibt da sogar schon mehrere Varianten:
http://www.djangosnippets.org/snippets/319/
http://www.djangosnippets.org/snippets/331/

Dumm ist es allerdings, wenn der User mehrere Seiten gleichzeitig anzeigen läßt. So kann es sein, das die Nachricht evtl. auf einer falschen Seite angezeigt wird.

In Pylons und turbogrars heißt das wohl "flash messages". Ich hab das in einem Pylons Template gefunden:

Code: Alles auswählen

<%  flash_message = h.flash.pop_message()  %>
% if flash_message:
<div id="flash-message">${flash_message | h}</div>
% endif
Hab noch gefunden: http://www.splee.co.uk/2005/11/23/fancy ... -tg_flash/ Dort wird mit Ajax mitteln gearbeitet.

In PyLucid habe ich eine selbe Funktion, die jedoch die Nachricht nicht in die "nächste" Seite anzeigen kann, sondern immer nur in die aktuell gerenderte Seite. Das ist auch für 99% der Fälle bisher vollkommen ok.

Alternativen? Wie macht ihr das?

Verfasst: Donnerstag 15. Mai 2008, 11:38
von HWK
Ich hab's selbst noch nicht verwendet, aber die Turbogears-Variante klingt für mich nicht schlecht und sie kann ja problemlos auch ohne Turbogears verwendet werden. Im Master-Template, von dem die eigenen Templates erben, wird - falls vorhanden - eine bestimmte dem Template übergebene Variable (bei Turbogears TG-Flash) in einer Extrazeile ausgegeben. Das sieht also wie Deine Pylons-Variante aus (hier heißt die Variable flash_message) und es kann wohl mit jeder Template-Engine nachgebildet werden. Du brauchst dabei auch nicht unbedingt ein Master-Template, es macht die Nachrichtenausgabe aber sicher einheitlicher.
Schön ist dabei, dass du selbst festlegen kannst, auf welcher Seite die Nachricht ausgegeben werden soll.
MfG
HWK

Verfasst: Donnerstag 15. Mai 2008, 19:12
von sma
Ich hatte mir für Django etwas nach dem Vorbild von Rails gebaut, wo ich im Quelltext gespickt hatte, wie das funktioniert. Und ich meine mich zu erinnern, dass das auch dort ganz simpel mit einem Hash in der Session funktioniert, welcher nicht berücksichtigt, dass der Anwender zwei Workflows in zwei Fenstern haben könnte.

Wenn du sowas willst, musst du wohl Workflow-IDs in den URLs mitführen und kannst nicht einfach ein Cookie benutzen, so wie Django das standardmäßig macht.

Stefan

Verfasst: Freitag 16. Mai 2008, 01:03
von lunar
Man kann ja auch ganz old-school arbeiten, und einfach einen passenden Response zurückschicken, oder?

Verfasst: Freitag 16. Mai 2008, 12:57
von Y0Gi
Nachdem ich es schon lange auf'm Zettel hatte, habe ich dieses Thema zum Anlass genommen, ein Snippet zu Flash Messages zusammen zu stellen. Der Code entstammt ("unserem") Palaver, das aber nicht so öffentlich ist, dass ich darauf verweisen möchte - deshalb hier separat.

Den Code, um das Session-Objekt zugänglich zu machen habe ich da rausgehalten; wer ohnehin auf einer Ebene bastelt, auf der er Flash Messages selbst implementieren möchte, der kriegt das drumherum auch so (entsprechend der eingesetzten Komponenten) hin. Ganz trivial ist der Teil mit den Context Locals vielleicht nicht, aber dafür hier umso eleganter. Variationen, die z.B. die Session als Argument übergeben, dürfen natürlich gerne hier dargelegt werden :)

Verfasst: Freitag 16. Mai 2008, 17:31
von mitsuhiko
lunar hat geschrieben:Man kann ja auch ganz old-school arbeiten, und einfach einen passenden Response zurückschicken, oder?
Und wie ohne Session/Cookie für den State?