[PHP] Kundenbegrüßung Gast/Name-Anzeige während des Ausloggens

kuromi

KU ♪ RO ♪ MI ♪ (shy)
Registriert
14 Juli 2013
Beiträge
1.325
Ort
ngb
Komischer Titel, man möge mir verzeihen. :o

Hallo.
Folgendes Problem habe ich:

Ich habe eine Menübar im Header die unter anderem einen Button für Acc-Links enthält. Klickt man den Button öffnet sich ein Menü mit weiteren Buttons [Anmelden], (Hallo Gast. Noch kein Konto bei uns?) [Registrieren], [Mein Konto], [Warenkorb] usw.

Loggt sich ein User ein, werden die Buttons [Anmelden] und [Registrieren] und der Text (Hallo Gast ...) gegen den Text (Hallo 'Vorname') und den Button [Abmelden] getauscht.

Was ich mir dazu jetzt gebastelt habe funktioniert auch schon ganz gut - mit einem kleinen Schönheitsfehler:

[src=php]<?php if ($_SESSION['customer_id'] && CUSTOMER_GREETING == 1)
{
echo href_link(FILENAME_LOGOFF, '', 'SSL');
echo TITLE_LOGOFF;
}
else {
if (STORE_STATUS == '0')
{
echo href_link(FILENAME_LOGIN, '', 'SSL');
echo TITLE_LOGIN;
echo customer_greeting();
echo href_link(FILENAME_CREATE_ACCOUNT, '', 'SSL');
echo TITLE_CREATE_ACCOUNT;
} }
?>[/src]

Meldet sich der User ab, tauchen die Buttons [Anmelden] und [Registrieren] korrekt wieder auf - der Text (Hallo Gast ...) hingegen erscheint als "TEXT_GREETING_GUEST". :confused:

Die Funktion dazu:

[src=php]function customer_greeting() {
138
139 if (isset($_SESSION['customer_id']) && $_SESSION['customer_first_name']) {
140 $greeting_string = sprintf(TEXT_GREETING_PERSONAL, output_string_protected($_SESSION['customer_first_name']), href_link(FILENAME_PRODUCTS_NEW));
141 } else {
142 $greeting_string = sprintf(TEXT_GREETING_GUEST, href_link(FILENAME_LOGIN, '', 'SSL'), href_link(FILENAME_CREATE_ACCOUNT, '', 'SSL'));
143 }
144
145 return $greeting_string;
146 }[/src]

Was muss ich ändern, damit auch während des Abmeldens erkannt wird, dass die Person sich abgemeldet hat und entsprechend der Text richtig umgesetzt wird?
Auf allen anderen Seiten funktioniert das super - nur eben nicht auf der "Sie haben sich erfolgreich abgemeldet"-Seite. Die springt offenbar genau zwischen zwei Zustände - der eine stimmt nicht mehr und der andere stimmt noch nicht. Kann das irgendwie umgangen werden?

Muss dazu wieder erwähnen, hab (immer noch) keine Ahnung von PHP.
Letzter Part steht so in der functions.php und der erste Teil - ja, von mir zusammengeschustert halt. :dozey:

Danke für eure Zeit. :)
 
Zuletzt bearbeitet:
Eventuell ist das schlicht ein Timingproblem:
Wir das Menue generiert, bevor der Nutzer tatsächlich abgemeldet ist oder nachdem?

Typischer Fehler wäre:
Du generierst zuerst das Menue. Dabei ist die Session (noch) gesetzt, also gibt deine Prüfung customer_greeting() den String aus, der eigentlich nur für angemeldete Nutzer sein sollte. Du solltest dort prüfen, ob die Session (noch) existiert und keine Aktion zum Ausloggen gewählt wurde, sonst gibst du den Text für abgemeldete Kunden aus.
Bei $_SESSION solltest du auch nicht mit isset prüfen, ob diese "gesetzt" sind, prüfe lieber mittels !empty(), ob sie nicht leer sind.

Wobei sich das Verhalten von isset zwischen 5.3 und 5.4 geändert hat.


 
  • Thread Starter Thread Starter
  • #3
Dank für deine Antwort. :)

Eventuell ist das schlicht ein Timingproblem:
Wir das Menue generiert, bevor der Nutzer tatsächlich abgemeldet ist oder nachdem?

Also, ich meine das Menü wird als solches nicht neu geladen - durch das Ausloggen wird lediglich der Content-Bereich geladen und zeigt die Meldung "Sie haben sich erfolgreich ausgeloggt ..." an. der Header bleibt, wie er ist - samt Menü. Lediglich der Buttonaustausch findet statt - beim Text passiert ja scheinbar auch etwas, allerdings scheint der Vorgang auf halber Strecke abzubrechen, also genau zwischen zwei Zuständen zu verharren.

Ich wundere mich einfach, wieso der Austausch der Buttons klappt, beim Text jedoch dieses Problem auftritt.

Ich überlege jetzt das Problem zu umgehen, indem ich für die Nachricht des erfolgreichen Abmeldens den Header einfach ausblende, wie auch bei den Seiten Login, Registrieren und PW vergessen. Damit würde das Problem mit dem Text nicht sichtbar werden.

Wenn es jedoch eine andere Lösung gibt bzgl. des obigen Codes, wäre die mir glaube ich lieber. :)

Typischer Fehler wäre:
Du generierst zuerst das Menue. Dabei ist die Session (noch) gesetzt, also gibt deine Prüfung customer_greeting() den String aus, der eigentlich nur für angemeldete Nutzer sein sollte. Du solltest dort prüfen, ob die Session (noch) existiert und keine Aktion zum Ausloggen gewählt wurde, sonst gibst du den Text für abgemeldete Kunden aus.

Das ist es halt - die Funktion gibt unmittelbar nach dem Ausloggen weder den Text für eingeloggte User aus noch den für Gäste, sondern verhält sich, als gäbe es keinen Text zur Ausgabe.
Heißt - der Text für eingeloggte User wird entfernt (was ja richtig ist, schließlich hat sich der User ja ausgeloggt) aber der Text für nicht eingeloggte User wird nicht angezeigt (was seltsam ist, denn offenbar wurde ja registriert, dass sich ausgeloggt wurde). Da steht dann wortwörtlich nur "TEXT_GREETING_GUEST", als würde da das define aus der language.php fehlen.
Dass dies aber nicht der Fall ist zeigt sich ja, wenn man die logoff-Seite verlässt. Dann wird das "TEXT_GREETING_GUEST" korrekt durch "Hallo Gast ..." ersetzt.
Hoffe ich hab dich richtig verstanden. =O
 
[src=php]if ( ($_SESSION['customer_id']) && $_SESSION['customer_first_name']) {[/src]

Füge hier noch eine Abfrage hinzu, ob die aktuelle Aktion, die durchzuführen ist ungleich dem Logout-Vorgang ist.

Ich weiß nicht, wie du die Vorgänge erkennst, zum Beispiel sowas:

$_REQUEST['action']!='logout'
 
  • Thread Starter Thread Starter
  • #5
Ohje, also ich hab jetzt einiges ausprobiert (auch deinen Vorschlag), aber es scheint nichts zu funktionieren. Entweder der Gast-Text verschwindet komplett oder es erscheint die erwähnte Code-Zeile. Es scheint völlig gleich zu sein, welche Abfrage ich einfüge, es sieht aus, als würde sie immer mit Weiterleitung auf die logoff-Seite gestoppt bzw. keine Relevanz mehr haben.

Da ich bisschen unter Zeitdruck stehe, schieb ich den Teil auf meiner Liste mal etwas nach unten und nehm den Header für die logoff-Seite vorerst raus.
Wenn alles andere fertig ist, versuche ich mich noch mal daran. Das fuchst mich :D

Falls du oder jemand anderes noch eine Idee habt, ich verfolge das hier trotzdem weiter. :)

Danke :)
 
Wenn du mir ein wenig mehr Code zugänglich machst, könnte ich mir das genauer anschauen.
Steht deine Arbeit in einem (öffentlichen) Repo? Falls es privat bleiben soll, kannst du auch Daten per PN senden.
Vergiss jedoch nicht sensible Daten aus deinme Code zu entfernen, bevor du ihn irgendwo online stellst.
 
  • Thread Starter Thread Starter
  • #8
Moin :D

Kleine Geschichte: Hab gestern die Antwort von Shodan gelesen und noch überlegt zu schreiben "Die defines sind ja da, auf allen anderen Seiten funktioniert es ja prima", kam aber von ab, weil ich so mit dem Shop beschäftigt war.
Gestern Abend dann, nachdem ich Impressum, AGB etc. eingefügt hatte, stellte ich schockiert fest, dass das oben genannte Problem auch auf diesen Seiten auftrat.
Da fiel mir dann wieder der Kommentar von Shodan ein und ich hab nach Gemeinsamkeiten bei diesen Seiten gesucht.

Und siehe da - das Problem bestand auf allen Seiten, die nicht auf der index basierten - da das aber recht wenige sind, fiel mir das erst nur bei der logoff auf.

Lösung: Hab die greeting defines aus der (irrwtizigerweise index.php genannten) originalen Datei in die global gültige Sprachdatei kopiert. :unknown:

Jetzt läufts. :m

Und ich schäm mich ein bisschen. Fremdes System eben. =/

Danke euch beiden. :D

(@accC stand auch so kurz davor dir ne PN zu schicken :p)
 
Zurück
Oben