TOPlist

Pixylophone - komentáře

Komentáře (od nejstarších po nejnovější)

Komentáře k příspěvku PHP přepínač stylů


[1] Vložil(a): Arthur Dent [web], 2003-11-07, 12:01 Solo | MuteČtenáři: ---

Tohle je samosebou dobré řešení, narazil jsem ale na jeden droboučký problém - někteří lidé mají potlačeno posílání REFERER-u.

A zadruhé si myslím, že napsat na férovku

header ("Location: $css");

není zcela bezpečné... Já pak můžu do CSS-Cookie podstrčit co chci a tu stránku dostanu... Neříkám, že tady v tomhle konkrétním případě to může přinést nějaké problémy, ale obecně je tenhle postup nedoporučovaný.

Já bych to udělal tak, že bych v té COOKIE předal jen číslo stylu a ve styl.php pak podle toho čísla poslal location na konkrétní styl. (Ve skutečnosti to dělám jako Ty a přes switch() si generuju jméno, které jde do @import)

[2] Vložil(a): maja, 2003-11-07, 12:23 Solo | MuteČtenáři: ---

hm... po tom přepínání toužím už dávno, ale chytrá z toho nejsem. budu muset zmastit krtka

p.s. nový styl je fajn :) růžová je moje

[3] Vložil(a): pixy [web], 2003-11-07, 12:44 Solo | MuteČtenáři: ---

Arthur> no, přiznávám, že mi tyhle důsledky hned nedošly - chtěl jsem to zjednodušit, protože já to ve skutečnosti dělám tak, jak popisuješ: do cookie ukládám jen ID stylu a dělám redirekci přes @import...

[4] Vložil(a): LokoN, 2003-11-07, 15:02 Solo | MuteČtenáři: ---

Pri presmerovani by se mela zadavat URL ne jen jmeno souboru, PHP to asi doplnuje, jinak nechapu jak to muze fungovat.

[5] Vložil(a): johnny, 2003-11-07, 15:39 Solo | MuteČtenáři: ---

Nějak tam vypadla podtržítka. $HTTP_COOKIE_VARS / $HTTP COOKIE VARS. Od PHP verze 4.1.0 je lepší používat jen $_COOKIE

[6] Vložil(a): Marek, 2003-11-07, 16:47 Solo | MuteČtenáři: ---

Něco podobného jsem také vyrobil a narazil jsem na zajímavý problém a až dosud mně nikdo nebyl schopen poradit. Pokud máte klienta MSIE6 (na win98) a server je Apache 2, potom to funguje dost pochybně. Pokud jsou stránky na Apache 1, potom je vše OK, stejně tak u ostatních prohlížečů (i u MSIE5.5 a 5).

Při výše zmiňované kombinaci to dělá to, že se soubor css nenačte, pouze při refreshi stránky. A tak to funguje u všech stránek na serveru. Je potom dost otrava kliknout na nějaký odkaz a vzápětí refreshovat.

Testováno na dvou počítačích s WIN 98 se dvěma instacemi IE6 z různých zdrojů, apache 2 (pipni.cz), apache 1(otoman.cz), všechny prohlížeče na win98 co jsem zkoušel kromě IE6 byly bez problémů (MSIE 5, 5.5; NN6,7; Opera6, 7; Mozilla1.1, 1.4; Linux: Opera6; Konqueror3.1; Mozilla 1.3). Hlavičky jsem zkoušel kombinovat jak se jen dalo, zakazoval chache, diskutovat na konferencích a nic.

Kombinace styl.php + apache2 + MSIE6 + WIN98 + (Eurotel GPRS) = kulový :-(

[7] Vložil(a): Arthur Dent [web], 2003-11-07, 18:06 Solo | MuteČtenáři: ---

6 - mírně OT: Měl jsem přesně stejný problém. Ale pak jsem přišel na to, že když ve Windows otevřu Ovládací panely, kliknu na Síť, pak na TCP/IP, pak na Nastavení, pak na Upřesnění, pak na Podrobnosti, pak na Uplatnit rozvržení, pak na Změnit paradigma, pak na Načíst přednastavené hodnoty, pak na Upravit kritéria, tam do toho okénka napíšu "2401", kliknu na ikonu s nápisem "Nikdy neklikejte na tuto ikonu" a restartuju, tak mám furt stejný problém. Proto jsem začal užívat heroin...

(Volně citováno podle knihy "Dave Barry v kyberprostoru", kapitola "Jak to chodí na diskusních fórech o Windows")

[8] Vložil(a): Roj [web], 2003-11-07, 18:19 Solo | MuteČtenáři: ---

A Pixy, proc u tech ostatnich stylu, ktere nejsou "checked" zaskrtnute, neudelas do hlavicky te "hlavni" stranky <alternative stylesheet..> ? Styly by pak sly prepinat "rovnou" z menu mozilly.

Sice to IE zavislaci neoceni, ale napr. me by to udelalo radost :-)

[9] Vložil(a): rarous [web], 2003-11-07, 20:49 Solo | MuteČtenáři: ---

Mozilla sice umí přepínat mezi alternativními styly, ale má to jeden háček. Styl změní u právě prohlížené stránky a po kliknutí na link jine stránky ze situ se opet nastavi puvodni (nevim jestli se tak chovaji vsechny ale moje 1.3 pod Wxp jo), vyse zminovane reseni je elegantnejsi. Aslternative stylesheet je ale dobry pro nahlidnuti před trvalým nastavenim stylu, je to rychlejsi.

[10] Vložil(a): Jiří Novák [web], 2003-11-07, 21:26 Solo | MuteČtenáři: ---

Uvedené problémy s nutností refreshe řeším jednoduše - stránku načtu prostě ihned ještě jednou (vlastně ještě přímo na serveru, uživatel nic nezaznamená - ani nemá šanci). A je po problémech - funguje mi to patrně v naprosto všech prohlížečích, ať už je zapnutá nějaká cache či nikoliv.

REFERER tam zatím nemám, doplním...

[11] Vložil(a): Marek, 2003-11-07, 22:28 Solo | MuteČtenáři: ---

10 - mám tomu rozumět tak, že se všem dokumentům zakáže cache a styl se mění přímo v tagu <link> ? To se mi vůbec nelíbí. Já bych měl lepší řešení:

a) dělat stránky tak aby odpovídaly Dogma W4

b) nepoužívat IE a návštěvníkům to doporučit

c) nepoužívat server s apache 2.

Zkusím ještě použít přesměrování pomocí header, třeba tím jedině správný prohlížeč oblafnu :-) .

[12] Vložil(a): Jiří Novák, 2003-11-07, 23:36 Solo | MuteČtenáři: ---

Kdeže píšu o "zakázání" cache na každé stránce?

Tím že stránku načtu ihned ještě jednou myslím samozřejmě jen a pouze tu jednu (referer) ihned po změně stylu. Pak už samozřejmě nic takového nedělám a cache funguje vesele dál...

[13] Vložil(a): Marek, 2003-11-08, 01:11 Solo | MuteČtenáři: ---

12 - Jasně. Myslím, že to nemůže fungovat, protože tím sotva můžete dosáhnout toho aby se v prohlížeči obnovily jakékoliv inkluze, které stránka obsahuje. Navíc já neřeším to, že se mně po změně stylů nic nezmění. Řešil jsem to, že se mi za jistých okolností styl.php nenačítá do prohlížeče a stránky tak zůstávají bez formátování.

[14] Vložil(a): Arcao [web], 2003-11-08, 09:55 Solo | MuteČtenáři: ---

Ja osobne pouzivam:

<?

if (!ini_get('register_globals')) {

   $types_to_register = array('GET','POST','COOKIE','SESSION','SERVER');

   foreach ($types_to_register as $type_to_register) {

     if (@count(${'HTTP_' . $type_to_register . '_VARS'}) > 0) {

       extract(${'HTTP_' . $type_to_register . '_VARS'}, EXTR_OVERWRITE);

     }

   }

}

if ($newskin):

   SetCookie("skin",$newskin,Time()+2*365*3600);

   if ($HTTP_REFERER):

      Header("Location: $HTTP_REFERER");

   else:

      Header("Location: http://$SERVER_NAME/mujblog/");

   endif;

else:

   if (!$skin) $skin="original";

   Header("Content-type: text/css");

   @require("skins/$skin.css");

endif;

?>

A imho, podle nejakych pravidel HTTP protokolu se musi pri pouziti Loacation pouzit absolutni adresa. Tedy:

Header("Location: http://server/cesta/soubor.txt");

[15] Vložil(a): cown [web], 2003-11-08, 10:44 Solo | MuteČtenáři: ---

[9] Pokud mas v <link rel="alternate stylesheet" ...> odkaz na samotny styl je jasne, ze to bude fungovat jen u prohlizene stranky. Proto bych to resil odkazem na php skript, ktery posle uzivaleli cookie se stylem. No a pak uz je to podobne jak to bylo popsane v clanku. Resim to tak a funguje mi to na 1.3 pod WinXP. Viz muj web.

[16] Vložil(a): Marek, 2003-11-08, 13:48 Solo | MuteČtenáři: ---

Ha, jedině správný prohlížeč byl poražen. Takže komu by to dělalo stejnou rutiku jako mně, potom věřte, že lepší řešení než cpaní jakéhokoliv obsahu do souboru php s tím, že mu dáte hlavičku Header('Content-type: text/css'); je když uděláte přesměrování Header('Location: ./styl2.css').

14 - podle nějakých pravidel možná musí být absolutní. Co jsem se díval do knížek co mám o php je vždy uváděná adresa relativní. Nikde jsem se nepotkal s tím, že by přesměrování na relativní adresu nefungovalo.

[17] Vložil(a): Vita [web], 2003-11-08, 17:08 Solo | MuteČtenáři: ---

2 marek: co tohle?

- uzivatel meni styl, sve css volam s nejakym parametrem (ted prave ted menil)

- ulozim si jake css chce (session, cookie)

- poslu mu prazdny css soubor s informaci o tom ze tenhle uz je prosly a musi se reloadnout (expires v 2000 a spol)

- header sam na sebe

- nactu komplet novou stranku s tim ze diky predchozi informaci (expired) mam jistotu ze se mu stahne novy stylesheet i bez reloadu

re 14: ano, musi byt absolutni. A ano, relativni vsude funguje :) Zrejme se s tim server vyrovna bez potizi

[18] Vložil(a): Vita [web], 2003-11-08, 17:12 Solo | MuteČtenáři: ---

<?

// Skript 1

$css = $HTTP COOKIE VARS['Moje-CSS-Cookie'];

if (!$css) $css = 'default.css';

header ("Location: $css");

die();

?>

opravena verze :)

<?php

$css = is_file ($_COOKIE ['Moje-CSS-Cookie']) ? $_COOKIE ['Moje-CSS-Cookie'] : 'default.css';

die ();

?>

Mozna by bylo jeste lepsi misto is_file () pouzit is_readable ()

[19] Vložil(a): Michal Kubeček, 2003-11-09, 01:09 Solo | MuteČtenáři: ---

Ad [17]: to přesměrování s relativním URL není problém serveru, server jen klientovi pošle to, co dostane jako argument funkce header(). Zda a jak se to interpretuje, to už záleží na prohlížeči. Podle RFC 2068, sekce 14.30 tam musí být absolutní URI, takže pokud je tam něco jiného, může s tím prohlížeč naložit v podstatě jakkoli. Je to něco podobného jako spoléhat na konkrétní implementaci nekorektně zapsaného HTML.

[20] Vložil(a): Endlife [web], 2003-11-16, 16:03 Solo | MuteČtenáři: ---

Proč není možné použít metodu, kdy je v hlavičce:
<link rel="stylesheet" href="style<?php
switch ($css)
 case "x":
  echo "x";
  break;
 case "y":
  echo "y";
  break;
 ...
 default:
 echo "a";
endswitch;
?>">
($css je samozřejmě v cookie; stylea.css, styleb.css ... stylex.css jsou výměnné styly)?
Prakticky to nemusí loadovat externí style.php, ale přímo základní zdroj ukazuje cestu na styl..
Jsem celkem začátečník, tak mě nebijte, ale budu rád, když se dozvím, proč je mám etoda špatná...

[21] Vložil(a): pajax, 2005-04-02, 12:24 Solo | MuteČtenáři: ---

no a nejakej navod pro magory by byl někde k mání? třeba i v angličtině,. to jako stačí tuhle stránku zkopírovat a vložit mezi ty mý ostatní a bude to fungovat?


Váš názor

Přidat nový komentář

Váš komentář

Přidávání komentářů k tomuto příspěvku již bylo ukončeno.

Chcete-li autorovi přesto sdělit nějakou podstatnou informaci, která se příspěvku týká, kontaktujte jej e-mailem.



 RSS 0.9x  Export  RDF  Export  RSS 0.9x  Komentáře  TXT  Komentáře  XHTML 1.0  Validate  W3C  CSS 2.1  Em-web  Resizable  W4D  90% dogmatic

Vygenerováno: [stránka generována dynamicky]