ich habe folgende Extension installiert:
function main($content,$conf){
$style = $_COOKIE["design"];
if (isset($this->piVars['style'])) {
$style=$this->piVars['style'];
setcookie("design", $style, time()+60*60*24*365);
$GLOBALS['TSFE']->additionalHeaderData[$extKey]='<link rel="stylesheet" type="text/css" href="fileadmin/template/main/'.$style.'.css" media="screen" />';
}
elseif (!isset($this->piVars['style'])) {
if ($style) {
$GLOBALS['TSFE']->additionalHeaderData[$extKey]='<link rel="stylesheet" type="text/css" href="fileadmin/template/main/'.$style.'.css" media="screen" />';
}
else {
$GLOBALS['TSFE']->additionalHeaderData[$extKey]='<link rel="stylesheet" type="text/css" href="fileadmin/template/main/standard.css" media="screen" />';
}
}
$this->piVars['style'] = 'standard';
$content.= '<ul><li>';
$content.= $this->pi_linkTP_keepPIvars('Standard').'';
$content.= '</li><li>';
$this->piVars['style'] = 'kontrast';
$content.= $this->pi_linkTP_keepPIvars('Kontrast').'';
$content.= '</li></ul>';
return $content;
}
}
Der Cookie wird beim drücken von "Standard" oder "Kontrast" richtig gesetzt und das css wird in den header geschrieben, sprich korrekt gewechselt. Wenn ich dann im Menü durch die Seiten klicke scheinen manche den Cookie auszulesen und andere nicht. Auf jeden Fall macht die Extension scheinbar was sie will. Im Cookie steht immer das richtige. Manchmal wird standard.css oder kontrast.css genommen, obwohl es eigentlich in 100 Jahren nicht sein kein.
Ich hab schon eine ganz wunde Stirn: #angry# #angry# #angry#
Ich schätze mal, das ist ein Problem mit dem Caching.
Füg doch mal
$this->pi_USER_INT_obj=1;
unter main ein, um das Caching für das Skript auzuschalten.
das müßte es sein. Vom Verhalten würde es auf jeden Fall zutreffen, weil manchmal Werte aus dem Nichts zu kommen scheinen.
Kann es leider erst am Montag testen und sagen, ob es daran lag. Vielen Dank erst mal!
schönes Wochenende
Übrigends: Es gibt noch eine Möglichkeit. Du mußt den Aufruf von pi_linkTP_keepPIvars erweitern:
$this->pi_linkTP_keepPIvars('Standard',$this->piVars,true)
Jetzt bekommen die Links einen cHash dran gesetzt und es sollte auch gehen.
bin nicht sicher, ob es nur daran lag. Habe außerdem noch folgendes hinzugefügt:
$GLOBALS["TSFE"]->set_no_cache();
jetzt scheint alles zu gehen. Ich werde das Ergebnis in einem extra Beitrag für alle noch posten, da sicher einige nach einer solchen Lösung für eine barrierefreie Umsetzung (ohne JavaScript) suchen.
Grüße
Mopps schrieb
bin nicht sicher, ob es nur daran lag. Habe außerdem noch folgendes hinzugefügt:
$GLOBALS["TSFE"]->set_no_cache();
Das solltest du unter allen Umständen vermeinden!! (vor allem, wenn du den Code später für andere postest).
Dadurch wird wird das komplette Caching für alle Seiten ausgeschalten, die das Skript einsetzen.
Ich seh schon die Beiträge: Warum funktioniert mein indexed_search nicht??
Also besser den cHash verwenden!
meinst Du:
var $pi_checkCHash = TRUE;
auf False?
deinen Post von heute morgen hab ich übersehen. Bei $this->pi_linkTP_keepPIvars('Standard',$this->piVars,true) beschwert er sich
$this->piVars['size'] = 'standard';
$content.='<ul><li>';
$content.= $this->pi_linkTP_keepPIvars('Standard',$this->piVars,true)
$this->piVars['size'] = 'kontrast';
$content.='</li><li>';
$content.= $this->pi_linkTP_keepPIvars('Kontrast',$this->piVars,true)
$this->piVars['size'] = 'ohne';
$content.='</li><li>';
$content.= $this->pi_linkTP_keepPIvars('ohne Stylesheet',$this->piVars,true)
$content.='</li></ul>';
oder hab ich das falsch verstanden?
Nein! Unbedingt auf 'True' lassen.
Du solltest die Erzeugung der Links in die Form $this->pi_linkTP_keepPIvars('Standard',$this->piVars,true) umschreiben.
Das fette true schaltet den cHash ein.
Dann setz doch in der Zeile zuvor einen Srichpunkt. #giggle# #giggle#
Und: Nicht immer alles nur rauskopieren, mitdenken erlaubt! ;-)
Ja wer löschte denn da seine Beiträge ... ?
hatte schreibfehler vorhin. Hab jetzt folgendes:
$this->piVars['size'] = 'standard';
$content.='<ul><li>';
$content.= $this->pi_linkTP_keepPIvars('Standard',$this->piVars,true);
$this->piVars['size'] = 'kontrast';
$content.='</li><li>';
$content.= $this->pi_linkTP_keepPIvars('Kontrast',$this->piVars,true);
$this->piVars['size'] = 'ohne';
$content.='</li><li>';
$content.= $this->pi_linkTP_keepPIvars('ohne Stylesheet',$this->piVars,true);
$content.='</li></ul>';
return $content;
umschalten der css geht nun nicht mehr, er schreibt den cookie gar nicht mehr.
hab den nur gelöscht, weil ich den Fehler bemerkt hab.
Achso, du meinst auch den anderen in "Barrierefreiheit"? Warum soll ich den nicht löschen, scheint ja etwas voreilig gewesen zu sein, das Ganze zu posten.
War ja auch nicht so ernst gemeint ;-)
Mich hats nur im ersten Moment verwundert, als ich die Antwort auf einen Post geschrieben hab, die Frage weg war.
Funktionierts jetzt?
Der Link den du in
#38285 gepostest hast, funktioniert nicht; den könntest du noch editieren ...
nicht so richtig. Hier nochmal die momentane main:
function main($content,$conf) {
$this->conf=$conf;
$this->pi_setPiVarDefaults();
// $this->pi_loadLL();
$this->pi_USER_INT_obj=1;
$size = $_COOKIE["design"];
if (isset($this->piVars['size'])) {
$size=$this->piVars['size'];
setcookie("design", $size, time()+60*60*24*365);
$GLOBALS['TSFE']->additionalHeaderData[$extKey]='<link rel="stylesheet" type="text/css" href="fileadmin/template/main/'.$size.'.css" media="screen" />';
}
elseif ($size) {
$GLOBALS['TSFE']->additionalHeaderData[$extKey]='<link rel="stylesheet" type="text/css" href="fileadmin/template/main/'.$size.'.css" media="screen" />';
}
else {
$GLOBALS['TSFE']->additionalHeaderData[$extKey]='<link rel="stylesheet" type="text/css" href="fileadmin/template/main/standard.css" media="screen" />';
}
$this->piVars['size'] = 'standard';
$content.='<ul><li>';
$content.= $this->pi_linkTP_keepPIvars('Standard',$this->piVars,true);
$this->piVars['size'] = 'kontrast';
$content.='</li><li>';
$content.= $this->pi_linkTP_keepPIvars('Kontrast',$this->piVars,true);
$this->piVars['size'] = 'ohne';
$content.='</li><li>';
$content.= $this->pi_linkTP_keepPIvars('ohne Stylesheet',$this->piVars,true);
$content.='</li></ul>';
return $content;
}
Wenn $this->pi_USER_INT_obj=1; drin ist. Setzt er keinen Cookie und wechselt auch nicht die css. Kommentiere ich es aus, lösche alle caches und den cookie, passiert folgendes:
-> er startet mit standard.css (richtig)
-> ich schalte durchs Menü und es bleibt standard.css
-> Wechsel auf kontrast.css
-> von da ab auf einigen Seiten standard, auf anderen kontrast, obwohl im Cookie das richtige steht
Es scheint da kein System zu geben, ich erkenne zumindest keins. Nur mit dem $GLOBALS["TSFE"]->set_no_cache(); hat es funktioniert wie es sollte.
Hab mal ein bisschen drüber nachgedacht:
Wenn man $this->pi_USER_INT_obj=1; setzt, wird die Erzeugung des cHashes komplett abgeschalten. Deshalb erkennt das Skript die Variablen nicht, die ihm übergeben werden und macht gar nichts.
Mit $GLOBALS["TSFE"]->set_no_cache() wird das Caching auf allen Seiten, auf denen die Ext eingebunden ist, ausgeschalten. Es funktioniert wie gewünscht. Nur hat man kein Caching mehr (=> Performanceverlust).
Schalten wir das Caching ein, passiert folgends:
Auf Seite 1 wähle ich 'Standard'. Die Seite wird erzeut und so im Cache abgelegt.
Ich gehe auf Seite 2, danach auf Seite 3. Beide Seiten liegen somit im Cache und verwenden 'Standard'.
Auf Seite 3 klicke ich dann auf 'Kontrast'. Die richtige CSS-Datei wird eingebunden.
Jetzt gehe ich zurück auf Seite 2. Typo3 schaut nach, ob die Seite im Cache vorliegt und liefert sie aus. => Ich habe wieder 'Standard' drin, da die Seite ja nicht weiß, das auf einer anderen Seite die CSS-Datei gewechselt wurde (ich übergebe dieser Seite ja keinen Parameter).
Lösung:
Das Caching für die Ext aussschalten, aber die Erzeugung des cHashes eingeschalten lassen. Dazu in der Datei ext_localconf.php die '1' in der Zeile
t3lib_extMgm::addPItoST43($_EXTKEY,'pi1/class.tx_txstyleswitcher_pi1.php','_pi1','',1);
in eine '0' ändern:
t3lib_extMgm::addPItoST43($_EXTKEY,'pi1/class.tx_txstyleswitcher_pi1.php','_pi1','',0);
das $this->pi_USER_INT_obj=1; muß raus, dafür sollte überhalb der main() noch var $pi_checkCHash = TRUE; stehen.
das funktioniert wunderbar 😃
Zum Verständnis: Die Seiten werden jetzt trotzdem gecached, die extension aber nicht? Wenn das so ist, verstehe ich nicht, warum es geht. Merkt er sich dann einfach den letzten wert von der extension und führt ihn auch bei den Seiten im cache aus?
bin dir sehr dankbar für die ausdauernde Hilfeleistung.
Ja so ist es:
Alle Elemente einer Seite, die zum Cachen freigegeben werden, landen im Cache. An der Stelle, an der Plugins stehen sollen, die nicht gecacht werden, wird ein Marker geschrieben (HTML-Kommentar), der dann bei der Auslieferung der Seite mit dem entsprechenden Inhalt befüllt wird.
Hallo Ihr,
gibt es die hier beschriebene Extension mittlerweile als Extension auf typo3.org? Wenn ja, wie heißt sie? Ich würde gerne die Beschreibung nachmachen. Gibt es vielleicht eine Anleitung?
Falls ich nur durch eine eigene neu geschriebene Extension vorankomme, was muss ich alles beachten?
Gruß, Nick