Hey, erstmal besten Dank für deine Antwort!
if(!isset($_COOKIE[COOKIE_NAME]) && empty($_COOKIE[COOKIE_NAME])) {
Was versprichst du dir von dieser Abfrage?
Welchen Wert hat die Konstante COOKIE_NAME?
User Contributed Notes: php.net. Wie du siehst ist COOKIE_NAME ('PREF') eine Konstante, ist also völlig irrelevant was diese enthält.
Warum versuchst du den Cookie überhaupt zu löschen, wenn du ihn doch anschließend gleich mit neuem Wert wieder zu setzen versuchst?
Warum setzt du nicht gleich nur den neuen Wert?
Weil ich auf Lösungssuche bin und verschiedene Varianten teste. Wie beschrieben funktioniert es auch nicht, ohne das Cookie zuvor zu löschen und einfach neu zu setzen.
Und warum notierst du den Aufruf von showContent redundant im if- und im else-Zweig - anstatt bedingungsunabhängig *nach* der Abfrage?
Ich habe den Code sehr stark reduziert, um das Problem einzugrenzen. Dabei ist obenstehender Code übrig geblieben. In diesem Context macht es tatsächlich keinen Sinn, ist für die Lösungssuche aber auch nicht relevant.
Dies ist notwendig, da auf $widget refreshContent() angewendet wurde, die Inhalte dieses Widgets also aktualisiert wurden.
Und was macht diese Methode, was für einen Rückgabewert liefert sie?
refreshContent aktualisiert lediglich die Daten innerhalb des Widget-Objekts, in diesem Beispiel (RSS Widget) wird ein Daten Array aktualisiert. Das funktioniert tadellos. Dazu folgendes Beispiel:
if($widget->refreshContent()) {
if(setcookie(COOKIE_NAME, base64_encode(serialize($page)), getCookieExpDate(), '/')) echo "<h2>SUCCESS</h2>\n";
var_dump($widget->items);
$page = unserialize(base64_decode($_COOKIE[COOKIE_NAME]));
$widget = $page->getWidget($_POST['ID']);
echo "<br /><br />\n";
var_dump($widget->items);
}
Der erste Aufruf von var_dump($page); zeigt, dass die Daten innerhalb des Widget-Objektes erfolgreich aktualisiert wurden. Ich serialisiere das Page-Objekt, welches also definitiv das aktualisierte widget-Objekt enthält und schreibe es in das Cookie. Anschließend lese ich das Cookie, deserialisiere das Page-Objekt und der zweite Aufruf von var_dump($page) zeigt, dass die aktualisierten Daten nicht enthalten sind. Daraus schließe ich, dass die Objekte korrekt funktionieren, nur das Cookie nicht geschrieben wurde. Was allerdings auch nicht der Fall sein kann, da die Ausgabe von "<h2>SUCCSS</h2>" bei erfolgreichem Schreiben des Cookies erfolgt.
Führe ich den Code in dieser Form aus, existiert nach dem refreshContent() kein Cookie. D.h. das Cookie wird gelöscht, das neue aber nicht geschrieben. Wende ich setcookie an, ohne das Cookie vorher zu löschen, steht im Nachhinein das alte Cookie geschrieben, d.h. es wird nicht aktualisiert.
Hast du clientseitig analysiert, welche Cookies betreffenden HTTP-Header ankommen?
Bislang nur sporadisch per Firebug. Ich habe hier keine weitere Analyse unternommen, da das Ergebnis mit dem der serverseitigen Verarbeitung übereinstimmt. Das Cookie wird nicht aktualisiert, der Inhalt bleibt der gleiche. Dabei habe ich das Cookie aus dem Header mit dem Wert des Cookies auf der Serverseite verglichen.
Beobachtest du das Problem nur in einem bestimmten Testbrowser, oder übergreifen?
Übergreifend, bislang: FF4, IE8, Chrome
Hast du die Nutzerkommentare im Manual zu setcookie durchgeschaut, welche Fallstricke es ggf. zu beachten gilt?
Ja, und genau deshalb habe ich die verschiedensten Varianten ausprobiert (z.B. Cookie vorher löschen, direkt $_COOKIE zu beschreiben, Cookie erneut zu setzen).
Findet ihr ein Problem in diesem Code?
Einige, aber weniger mit direktem Bezug auf das Problem.
Wie gesagt bin ich seit ca. 12 Stunden auf Fehlersuche, der Code hat sich während dieser Zeit stark vermüllt. Ich denke ich weiß was es heißt sauber zu programmieren, bitte drückt hier mal kurz ein Auge zu, auch wenn es schwer fällt :)
Beste Grüße,
Jonas