[PHP] ALA Stylesheet switcher: blanco scherm?

Pagina: 1
Acties:
  • 160 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Boelie-Boelie
  • Registratie: November 2004
  • Laatst online: 26-09-2020
(Waarschuwing: topic geopend door php-n00b :/ )

Met behulp van het artikel op A List Apart over de PHP stylesheet switcher heb ik geprobeerd de switcher op mijn eigen site aan de gang te krijgen. Ik krijg echter een blanco scherm bij het switchen van stylesheet (FF), of er gebeurt gewoon niks (IE).

Eigen demo ter illustratie.

Wisselen van stijl gebeurt door klikken op een link.
code:
1
<a href="switcher.php?set=1" title="stijl 1">Normaal</a>
Bij het aanklikken van een link om van stijl te wisselen, wordt het bestand switcher.php opgevraagd, met de volgende
code:
1
2
3
4
<?php
setcookie ('sitestyle', $set, time()+31536000, '/', 'mijndomein.com', '0');
header("Location: $HTTP_REFERER");
?>
Waarbij 'mijndomein' natuurlijk is vervangen door mijn eigen domein.

In de head van de index.php staat de volgende
code:
1
2
3
<link rel="stylesheet" type="text/css" media="screen" title="User Defined Style" href="<?php echo (!$sitestyle)?'1':$sitestyle ?>.css">
<link rel="alternate stylesheet" type="text/css" media="screen" href="1.css" title="1">
<link rel="alternate stylesheet" type="text/css" media="screen" href="2.css" title="2">


Overigens, de stylesheets werken wel goed, daar ligt het niet aan.

Wat doe ik verkeerd? Waardoor werkt het niet? En hoe los ik het op?

[ Voor 32% gewijzigd door Boelie-Boelie op 16-06-2005 14:39 ]

Cogito ergo dubito


Acties:
  • 0 Henk 'm!

  • DR
  • Registratie: December 2000
  • Niet online

DR

Superglobals, staat in de FAQ wel iets meer over ;)

Acties:
  • 0 Henk 'm!

  • André
  • Registratie: Maart 2002
  • Laatst online: 12-09 14:32

André

Analytics dude

Hij blijft bij mij op switcher.php staan dus je redirect gaat niet goed. Kun je omdat te testen eens dit proberen:

PHP:
1
header("Location: /index.php");

Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 12:54
Iet wat relevante code mag ook wel, hoe ziet je code er dan uit. Hoe kom jij aan $sitestyle in je script? Zit daar nog iets voor?

/edit
Houw maar op. Die tutorial is al 3 jaar oud. Sinds die tijd is er het een en ander veranderd in PHP land. Binnenkomende variabelen kun je benaderen via $_GET en voor formulieren $_POST. Voor de referen kom je eerder in $_SERVER['HTTP_REFFERER'].

[ Voor 50% gewijzigd door Sybr_E-N op 16-06-2005 14:42 ]


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Sybr_E-N schreef op donderdag 16 juni 2005 @ 14:39:
Iet wat relevante code mag ook wel, hoe ziet je code er dan uit. Hoe kom jij aan $sitestyle in je script? Zit daar nog iets voor?
Kijk dan even naar 't voorbeeld :/

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • Boelie-Boelie
  • Registratie: November 2004
  • Laatst online: 26-09-2020
André schreef op donderdag 16 juni 2005 @ 14:39:
PHP:
1
header("Location: /index.php");
Ik heb dit even geprobeerd, als ik alleen deze code erin zet, gaat word je naar index.php gestuurd (de pagina zelf). (overigens heb ik de slash weggehaald).
Als ik deze code ter vervanging neerzet van "Location: $HTTP_REFERER", dan gebeurt er niks/blanco scherm.

[ Voor 29% gewijzigd door Boelie-Boelie op 16-06-2005 14:51 ]

Cogito ergo dubito


Acties:
  • 0 Henk 'm!

  • Boelie-Boelie
  • Registratie: November 2004
  • Laatst online: 26-09-2020
Euhm.. Voor mij is dat superglobals bijna abracadabra. Ik snap dat bepaalde dingen 'vroeger' wel konden, maar nu moet je gebruik maken van iets gewijzigde code. Dat zou de reden zijn dat die oude ALA-code niet werkt.
Ik heb daar verder geen kaas van gegeten als n00b, dus met bovenstaande opmerkingen kom ik helaas op dit moment weinig verder. Dus ben oplossingen gaan proberen die in de discussie op ALA n.a.v. het artikel werden geplaatst. Eén van de suggesties die ik probeerde, heeft voor switcher.php deze
code:
1
2
3
4
5
6
<?php
$set = $_GET['set'];
$set = preg_replace('#[^a-zA-Z0-9_-]#', '', $set);
setcookie ('sitestyle', $set, time()+31536000, '/', 'yourdomain.com', '0');
header('Location: '.$_SERVER['HTTP_REFERER']);
?>
Die werkte niet bij mij.

Een andere suggestie werkt wel bij mij, zie mijn tweede voorbeeldpagina. Boven de doctype staat
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
session_start();
?>
<?php
if(isset($_GET['css'])){
switch ($_GET['css']) {
case 'css1':
$stylesheet = '<link href="theme1.css" type="text/css" rel="stylesheet">';
$_SESSION['csschanger']=$stylesheet;
break;
case 'css2':
$stylesheet = '<link href="theme2.css" type="text/css" rel="stylesheet">';
$_SESSION['csschanger']=$stylesheet;
break;
default:
$stylesheet = '<link href="cssdefault.css" type="text/css" rel="stylesheet">';
$_SESSION['csschanger']=$stylesheet;
}
}
?>
In de head staat
code:
1
<?php echo ($_SESSION['csschanger'])? $_SESSION['csschanger']: '<link href="cssdefault.css" type="text/css" rel="stylesheet">' ;?>
In de body staat
code:
1
2
<A href="<?php echo $_SERVER['PHP_SELF']; ?>?css=css1">Stylesheet 1</a><br>
<A href="<?php echo $_SERVER['PHP_SELF']; ?>?css=css2">Stylesheet 2</a><br>
Het werkt dus, maar iemand enig idee of dit een goeie werkwijze is? En of dit misschien korter kan? (En de url wordt er ook niet mooier op helaas.)

[ Voor 34% gewijzigd door Boelie-Boelie op 16-06-2005 16:00 ]

Cogito ergo dubito


Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 19-09 22:02

krvabo

MATERIALISE!

Als je stylesheets genummerd zijn en verder hetzelfde heten (style1.css, style2.css) kan je misschien zoiets proberen, misschien dat je het dan meer snapt.

set.php:
PHP:
1
2
3
4
5
6
7
8
$id = $_GET['id']; // haal ?id waarde op
$file = 'style'.$id.'.css'; // style[1|2|3].css
if (file_exists($file)) { // als het bestand bestaat
    $_SESSION['style'] = $file; // zet de sessie
    header('Location: '.$_SERVER['HTTP_REFERER']);
} else {
    die('Sorry, geen goede file'); // bestand bestaat niet, script stoppen
}


PHP:
1
2
3
4
5
6
7
8
9
10
 <? session_start(); ?>
<html><head>
<title></title>
<link href="<?=$_SESSION['style'];?>" type="text/css" rel="stylesheet">
</head><body>
<a href="set.php?id=1">stijl1</a>
<a href="set.php?id=2">stijl2</a>
<a href="set.php?id=3">stijl3</a>
</body>
</html>


Zoiets zou ook moeten werken.
Boelie-Boelie schreef op vrijdag 17 juni 2005 @ 14:07:
Thnx krvabo voor je probeerseltje. Werkte helaas niet (voorbeeld, maar dat zal wel aan mij liggen, want dat was mijn zesde probeersel. Ben qua php nog in de fase 'knip, plak, verander variabele' en als dat niet werkt, dan zoek ik een nieuw script.
Dit was ook geen klaar script ;)

[ Voor 56% gewijzigd door krvabo op 17-06-2005 19:54 ]

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • Gwaihir
  • Registratie: December 2002
  • Niet online
Boelie-Boelie schreef op donderdag 16 juni 2005 @ 15:52:
Euhm.. Voor mij is dat superglobals bijna abracadabra.
Ok; kort gezegd komt het erop neer dat als je voor een variabelen in de URL een waarde meegaf, deze variabele in je script met die (begin)waarde beschikbaar was. Hierdoor kon een niet zo goed bedoelende bezoeker evenwel vaak beginwaarden zetten voor allerlei variabelen waar hij af zou moeten blijven. Daarom moet je nu als script schrijver bewust aangeven dat je een zo'n waarde wilt gebruiken.

In jouw geval gebruik je er maar één: 'set', welke via de URL meekomt en daarmee in $_GET zit. Dit regeltje vooraan in je script zetten zou dus alles moeten zijn:
code:
1
$set = $_GET['set'];


Edit.. nvm.. zit te slapen; je gebruikt nog heel wat meer (cookie, referer)..
Switchen m.b.v. de HTTP_REFERER zou ik vandaag de dag afraden. I.v.m. de privacy stuurt lang niet iedere gebruiker je nog een betrouwbare refererstring mee.

[ Voor 19% gewijzigd door Gwaihir op 17-06-2005 12:46 ]


Acties:
  • 0 Henk 'm!

  • Boelie-Boelie
  • Registratie: November 2004
  • Laatst online: 26-09-2020
Thnx krvabo voor je probeerseltje. Werkte helaas niet (voorbeeld, maar dat zal wel aan mij liggen, want dat was mijn zesde probeersel. Ben qua php nog in de fase 'knip, plak, verander variabele' en als dat niet werkt, dan zoek ik een nieuw script.

Ook thnx Birdie, voor iets meer uitleg, stel ik zeer op prijs (jij snapte gelukkig m'n hint wel :) ).

Inmiddels heb ik eindelijk een versie gevonden die wel werkt, Another PHP Styleswitcher van Rob Ballou, die op de ALA styleswitcher is gebaseerd (zoals zovelen zijn). Er staat een voorbeeld van de source online voor degenen die geïnteresseerd zijn.

Overigens, daar staat ook iets in over dat HTTP_REFERER, namelijk
PHP:
1
2
3
4
5
if(isset($_SERVER['HTTP_REFERER'])){
    // Send the user back to the refering page
    header("Location: ". $_SERVER['HTTP_REFERER']);
    exit;
}
Zou dat dan anders moeten, of begrijp ik Birdie verkeerd?

Cogito ergo dubito


Acties:
  • 0 Henk 'm!

  • Gwaihir
  • Registratie: December 2002
  • Niet online
HTTP_REFERER bevat - volgens de bedenkers ervan - de pagina waar de link waarop geklikt is in staat. Een geinige eigenschap die bijvoorbeeld door stats programma's wordt gebruikt om te kijken van welke zoekmachines / linkspagina's de bezoekers van een website komen. So far so good en keurig door je geïmplementeerd.

Nou vindt helaas niet iedereen het even leuk om die info te delen; gaat het de (eigenaar van de) website die ik bezoek wel een donder aan waar ik net daarvoor geweest ben? Daarom filteren diverse firewalls, zoals bijvoorbeeld Norton, die referer standaard eruit: ze laten hem leeg (of zetten er zoiets in als "weggefilterd door programma X"). In dat geval gaat je switcher de mist in. Het zou goed zijn dat in elk geval te ondervangen door dan maar naar de homepage te sturen of zo.

Meer fool proof / algemeen werkzaam is het de stylesheet switcher in elke pagina zelf op te nemen (met een include bijvoorbeeld). Je maakt dan m.b.v. $_SERVER['PHP_SELF'] voor het wisselen steeds een linkje naar de pagina zelf i.p.v. naar een losse set.php. De referer heb je dan niet meer nodig.

[ Voor 3% gewijzigd door Gwaihir op 18-06-2005 02:35 ]

Pagina: 1