[PHP-MVC] Template verschillende malen gebruiken

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • maartenlambrech
  • Registratie: Mei 2006
  • Laatst online: 04-05-2024
Beste
Ik gebruik de laatste tijd php in combinatie met TemplatePower. Via een mod rewrite (.htaccess) stuur ik een pagina zoals /foto/jeugd/ door naar index.php?page=foto&reeks=jeugd.

De index pagina laadt dan:
- een main template (voor alle paginas)
- een template die specifiek voor de inhoud van een pagina is ( via $_GET['page'] )

Door de modrewrite denken sommige pagina’s nu echter dat ze in een andere map zitten, waardoor de relatieve url's naar mijn afbeeldingen niet meer werken.

Het komt er dus op neer dat index.php?page=foto goed weergegeven wordt, maar /foto/ niet.

Ik kan natuurlijk de main template aanpassen en iedere url beginnen met ../
- dan werkt /foto/ goed
- maar dan werkt /foto/jeugd/ niet meer

Ik ben er zeker van dat er sites bestaan die dit probleem omzeilen en had dan graag ook jullie mening hierover geweten.

Dank bij voorbaat

Acties:
  • 0 Henk 'm!

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Niet rewriten als het bestand of de directory bestaat? Zoiets:
code:
1
2
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Of ben je op zoek naar base? Dus:
HTML:
1
<base href="http://www.wibberdewebsite/" />


Of begrijp ik het niet helemaal? :)

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Acties:
  • 0 Henk 'm!

  • ChessSpider
  • Registratie: Mei 2006
  • Laatst online: 01-08 19:01
Ik loste dit altijd op door de volledige pad mee te geven. Dus in plaats van <img src="images/plaatje.jpg" />, <img src="{URL}images/plaatje.jpg" /> te doen, en een global replace te doen:
PHP:
1
$tpl->assignGlobal("URL","http://www.website.nl/t");


Maar ik denk dat de base href misschien een betere oplossing is..

Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 21:12
In plaats van die base href kun je ook elke link beginnen met een backslash. Zo geef je aan dat het een pad vanaf de root is. Bijv. href="/img/plaatje.jpg" wordt dan 'www.domein.ext/img/plaatje.jpg'; maakt niet uit in welke subdir de pagina met die link staat.

Acties:
  • 0 Henk 'm!

  • maartenlambrech
  • Registratie: Mei 2006
  • Laatst online: 04-05-2024
Bedankt voor de snelle replies!
Ik wist niet dat zoiets bestond als base. Dit ziet er echt een goede methode uit mijn probleem op te lossen zonder de pagina veel te hoeven veranderen. Bedankt daarvoor! _/-\o_

Er een absolute url van maken had ik ook al eens gedaan. Dat lukt natuurlijk ook, maar het lijkt me netter om dit met base op te lossen. Ook al weet ik niet precies wat de voor en nadelen zijn van absolute links.
In plaats van die base href kun je ook elke link beginnen met een backslash
Zelfs dat wist ik niet 8)7
Ziet er inderdaad een goed methode uit. Nu ik echter al een volledige template heb, zal het minder werk zijn om deze een base te geven in plaats van alle urls te wijzigen.
Niet rewriten als het bestand of de directory bestaat? Zoiets:
Dit zou in mijn geval niet werken want als je op een foute pagina kijkt naar de locatie van een afbeelding staat daar:
mijnsite/foto/jeugd/afbeeldingen/...
in plaats van
mijnsite/afbeeldingen/...

Ik ga nu snel gaan testen met 'base' :P !

[ Voor 16% gewijzigd door maartenlambrech op 04-01-2008 14:38 ]


Acties:
  • 0 Henk 'm!

  • ChessSpider
  • Registratie: Mei 2006
  • Laatst online: 01-08 19:01
Het is natuurlijk wel makkelijker om alles vanuit het begin absoluut te maken. Zo weet je zeker dat ook javascript en etc naar behoren functioneerd, mocht je daar het absoluut pad ooit nodig hebben.
PHP:
1
2
3
define('url','http://website.nll');
$tpl->assign('url',"link website: ".url);
$tpl->assignGlobal('url',url);

Acties:
  • 0 Henk 'm!

Verwijderd

Kap gwn met die rewrite mod.. gebruik multiviews ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op vrijdag 04 januari 2008 @ 22:58:
Kap gwn met die rewrite mod.. gebruik multiviews ;)
Wat lul jij nou slap? Multiviews zuigen zwaar ten opzichte van mod rewrite. Daarnaast is het altijd verstandig om een slash aan het begin van je URL's te plaatsen. Aangenomen dat je bv de volgende map structuur hebt:

code:
1
2
3
4
5
root
    static
        css
        images
        js


Vervolgens altijd een URL gebruiken als; <... href="/static/css/screen.css" ...>. Werkt prima, zo'n base tag is in mijn ogen gewoon ranzig, aangezien je bepaalde informatie in je HTML frot die helemaal niet nodig is.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op zaterdag 05 januari 2008 @ 12:20:
[...]


Wat lul jij nou slap? Multiviews zuigen zwaar ten opzichte van mod rewrite. Daarnaast is het altijd verstandig om een slash aan het begin van je URL's te plaatsen. Aangenomen dat je bv de volgende map structuur hebt:

code:
1
2
3
4
5
root
    static
        css
        images
        js


Vervolgens altijd een URL gebruiken als; <... href="/static/css/screen.css" ...>. Werkt prima, zo'n base tag is in mijn ogen gewoon ranzig, aangezien je bepaalde informatie in je HTML frot die helemaal niet nodig is.
Ga jij maar ff voor HTML, PHP en Javascript telkens alle variabelen instellen en in je htaccess AL je URLs opgeven.. veel plezier knakker

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op zaterdag 05 januari 2008 @ 12:41:
[...]

Ga jij maar ff voor HTML, PHP en Javascript telkens alle variabelen instellen en in je htaccess AL je URLs opgeven.. veel plezier knakker
Voor de default cases voldoet onderstaande RewriteRule prima waarbij de URL herschreven en doorgestuurd wordt naar de index.php waar de Controller de desbetreffende actie in de module uitvoert. Mits je een MVC Framework gebruikt, is dit een zeer makkelijke manier.

code:
1
RewriteRule ^([a-zA-Z]+)/([a-zA-Z]+)$ index.php?module=$1&action=$2


Daarnaast snap ik niet wat je bedoelt. Als de mappenstructuur op de server gelijk is aan die voorgestelde structuur, dan kan je in je templates gewoon dingen doen als:

code:
1
<link href="/static/Website/css/screen/screen.css" rel="stylesheet" type="text/css" title="default" media="screen">


Dat is namelijk gewoon een geldig pad. Kortom; in je .htaccess hoef je vervolgens niets in te stellen.
Voor bv registratiemodules kan je dan doen:

code:
1
<a href="/registration/register">Registreren</a>

Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Verwijderd schreef op zaterdag 05 januari 2008 @ 12:20:
Vervolgens altijd een URL gebruiken als; <... href="/static/css/screen.css" ...>. Werkt prima, zo'n base tag is in mijn ogen gewoon ranzig, aangezien je bepaalde informatie in je HTML frot die helemaal niet nodig is.
Het werkt, maar dat is dan ook het enige ;)

Dit is geen goede oplossing. Je maakt je paden absoluut waardoor je website niet meer werkt als je hem naar een ander pad verplaatst.

Verder is het semantisch ook beter om een base tag te gebruiken. Je hebt een document met daarin relatieve hyperlinks, het is wel zo praktisch als ergens aangegeven staat wat de basis url is die daarbij hoort :). Natuurlijk kun je daarvoor de URL van het document zelf gebruiken maar die is niet altijd beschikbaar; het is beter als die informatie ook in het document zélf beschikbaar is.

Mijn voorkeur gaat dus uit naar het gebruik van een base href en relatieve links, maar ook het gebruik van absolute paden heeft de voorkeur boven jouw oplossing :)

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
eamelink schreef op zaterdag 05 januari 2008 @ 21:44:
Dit is geen goede oplossing. Je maakt je paden absoluut waardoor je website niet meer werkt als je hem naar een ander pad verplaatst.
[...]
Mijn voorkeur gaat dus uit naar het gebruik van een base href en relatieve links, maar ook het gebruik van absolute paden heeft de voorkeur boven jouw oplossing :)
Correct me if I'm wrong here, maar ook bij absolute paden werkt je site niet meer zodra je'm naar een andere map verplaatst - en juist dan werkt je site ook niet als je'm aan een andere host koppelt, dan zou ik nog eerder gaan voor de oplossing van Quist.

Verder is base href wel leuk, maar heb je daar afaik weinig aan in je CSS files. Zelf definieer ik doorgaans dan ook een template variabele met het absolute pad tot aan de index (die vrij simpel automagisch uit het request uri te halen is) en mocht die aangepast worden is het een kwestie van de template cache leeggooien en opnieuw laten parsen met de juiste paden - vooral handig in situaties met een aparte webserver voor statische content die nog wel eens van host wil veranderen :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

Verwijderd

eamelink schreef op zaterdag 05 januari 2008 @ 21:44:
[...]

Het werkt, maar dat is dan ook het enige ;)

Dit is geen goede oplossing. Je maakt je paden absoluut waardoor je website niet meer werkt als je hem naar een ander pad verplaatst.

Verder is het semantisch ook beter om een base tag te gebruiken. Je hebt een document met daarin relatieve hyperlinks, het is wel zo praktisch als ergens aangegeven staat wat de basis url is die daarbij hoort :). Natuurlijk kun je daarvoor de URL van het document zelf gebruiken maar die is niet altijd beschikbaar; het is beter als die informatie ook in het document zélf beschikbaar is.

Mijn voorkeur gaat dus uit naar het gebruik van een base href en relatieve links, maar ook het gebruik van absolute paden heeft de voorkeur boven jouw oplossing :)
Wellicht zie ik het verkeerd hoor, maar in welke gevallen verplaats je een complete website? Zelfs als dat gebeurt, verplaats je die naar een dieper liggende map, waardoor je in dat geval een base element kan opnemen:

code:
1
<base href="http://website.nl/oud">


Vervolgens wordt je pad voor het CSS bestand dan dus:

code:
1
<base href="http://website.nl/oud/static/css/Website/screen/screen.css">


Oftewel; waarom een base element gebruiken wanneer dat niet noodzakelijk is? Of zie ik nu iets fout? :)

Acties:
  • 0 Henk 'm!

  • ChessSpider
  • Registratie: Mei 2006
  • Laatst online: 01-08 19:01
Verwijderd schreef op zondag 06 januari 2008 @ 14:56:
[...]


Wellicht zie ik het verkeerd hoor, maar in welke gevallen verplaats je een complete website? Zelfs als dat gebeurt, verplaats je die naar een dieper liggende map, waardoor je in dat geval een base element kan opnemen:

code:
1
<base href="http://website.nl/oud">


Vervolgens wordt je pad voor het CSS bestand dan dus:

code:
1
<base href="http://website.nl/oud/static/css/Website/screen/screen.css">


Oftewel; waarom een base element gebruiken wanneer dat niet noodzakelijk is? Of zie ik nu iets fout? :)
Ja volgens mij best wel.. Sowieso klopt de code die je geeft niet. Daarbij zei jij:
(...) zo'n base tag is in mijn ogen gewoon ranzig, aangezien je bepaalde informatie in je HTML frot die helemaal niet nodig is.
Ondanks dat een migratie van een website niet vaak voor kan komen, moet je er wel rekening mee houden. Met relatieve paden of de half/half oplossing die jij voorstelt houd je nog steeds dat met een migratie, alle pagina's moeten worden aangepast.

Met de absolute urls op de manier die ik gebruik hoef je maar één keer de url aan te passen en je bent klaar.

Acties:
  • 0 Henk 'm!

  • Joshua
  • Registratie: Juli 2005
  • Laatst online: 16-09 15:47
Zou je met php niet iets met de $_SERVER variable doen?
Ik zelf gebruik vaak zoies om te linken naar een bestand:

PHP:
1
require_once($_SERVER['DOCUMENT_ROOT']. "/map/naar/bestand.php");


Er is vast ook wel een mogenlijkheid om dit te gebruiken met betrekking tot wat jij wilt.

Acties:
  • 0 Henk 'm!

  • maartenlambrech
  • Registratie: Mei 2006
  • Laatst online: 04-05-2024
Spike1506 schreef op zondag 06 januari 2008 @ 16:24:
Zou je met php niet iets met de $_SERVER variable doen?
Ik zelf gebruik vaak zoies om te linken naar een bestand:

PHP:
1
require_once($_SERVER['DOCUMENT_ROOT']. "/map/naar/bestand.php");


Er is vast ook wel een mogenlijkheid om dit te gebruiken met betrekking tot wat jij wilt.
En als ik nu $_SERVER['DOCUMENT_ROOT'] gebruik als path in de base tag. Dit lijkt me wel een goede oplossing. Dan moet ik namelijk geen bestanden wijzigen bij het testen op de localhost of bij het online plaatsen!

Acties:
  • 0 Henk 'm!

  • ChessSpider
  • Registratie: Mei 2006
  • Laatst online: 01-08 19:01
Die heb je juist niet nodig. Met HTTP_HOST kom je wel een stapje verder, maar dan heb je de map nog niet.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op zaterdag 05 januari 2008 @ 21:15:
[...]


Voor de default cases voldoet onderstaande RewriteRule prima waarbij de URL herschreven en doorgestuurd wordt naar de index.php waar de Controller de desbetreffende actie in de module uitvoert. Mits je een MVC Framework gebruikt, is dit een zeer makkelijke manier.

code:
1
RewriteRule ^([a-zA-Z]+)/([a-zA-Z]+)$ index.php?module=$1&action=$2


Daarnaast snap ik niet wat je bedoelt. Als de mappenstructuur op de server gelijk is aan die voorgestelde structuur, dan kan je in je templates gewoon dingen doen als:

code:
1
<link href="/static/Website/css/screen/screen.css" rel="stylesheet" type="text/css" title="default" media="screen">


Dat is namelijk gewoon een geldig pad. Kortom; in je .htaccess hoef je vervolgens niets in te stellen.
Voor bv registratiemodules kan je dan doen:

code:
1
<a href="/registration/register">Registreren</a>
Wat ik bedoel is dat je met rewrite voor elke pagina wat moet definieren.. ga jij bijv ff tweakers op die manier nabouwen dan zie je wel wat er makkelijker is.. voor alle pagina's of 1 keer ;)

Acties:
  • 0 Henk 'm!

  • maartenlambrech
  • Registratie: Mei 2006
  • Laatst online: 04-05-2024
Beste
Ik vind die base tag heel handig voor html code. Echter werkt dit natuurlijk niet voor php scripts doordat dit serverside is. Maar weet iemand een gelijkaardig script voor php code?

Acties:
  • 0 Henk 'm!

Verwijderd

maartenlambrech schreef op maandag 07 januari 2008 @ 20:45:
Beste
Ik vind die base tag heel handig voor html code. Echter werkt dit natuurlijk niet voor php scripts doordat dit serverside is. Maar weet iemand een gelijkaardig script voor php code?
Je definieerd gwn 1 keer de url oftewel gwn de home.. en dat doe je dan in een pagina die overal in geladen word

Acties:
  • 0 Henk 'm!

  • maartenlambrech
  • Registratie: Mei 2006
  • Laatst online: 04-05-2024
Verwijderd schreef op maandag 07 januari 2008 @ 22:28:
[...]

Je definieerd gwn 1 keer de url oftewel gwn de home.. en dat doe je dan in een pagina die overal in geladen word
Ik bedoelde meer iets als
code:
1
include("test.php");

in plaats van
code:
1
include($url."test.php");

Ik vroeg me dus gewoon af of er geen variant van base bestond voor php. Url's met een slash starten om zo in de root te geraken lukt namelijk niet in php.

Acties:
  • 0 Henk 'm!

  • ChessSpider
  • Registratie: Mei 2006
  • Laatst online: 01-08 19:01
Ik snap niet echt wat je wilt of waarom je het perse zo wilt doen ofzo, maar bedoel je misschien
http://nl2.php.net/manual/en/function.chdir.php
?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
This only changes the directory for PHP, the output directory stays the same. If you are trying to access images from a relative path and you use the following then it will fail to render the image:
<?php
chdir ('images');
if (file_exists('php.gif')) 
{
echo '<html>';
echo '<body>';
echo '<img src="php.gif">';
echo '</body></html>';
}
?>

//However, it is possible to use the <base> tag in the header to change the directory for the resulting HTML, as you can see however this requires you to put the full path in place.
<?php
chdir ('images');
if (file_exists('php.gif')) 
{
echo '<html>';
echo '<head><base href = "http://uk.php.net/images/"></head>';
echo '<body>';
echo '<img src="php.gif">';
echo '</body></html>';
} ?> 

Acties:
  • 0 Henk 'm!

Verwijderd

maartenlambrech schreef op dinsdag 08 januari 2008 @ 18:05:
[...]

Ik bedoelde meer iets als
code:
1
include("test.php");

in plaats van
code:
1
include($url."test.php");

Ik vroeg me dus gewoon af of er geen variant van base bestond voor php. Url's met een slash starten om zo in de root te geraken lukt namelijk niet in php.
PHP:
1
2
define('absolutepath','/var/www/blaa');
define('url','http://www.ghey.nl');

datte?

Acties:
  • 0 Henk 'm!

  • maartenlambrech
  • Registratie: Mei 2006
  • Laatst online: 04-05-2024
Dit lijkt op wat ik zoek, maar is het nog niet helemaal:
code:
1
2
3
<?php
chdir ('images');
?>

Ipv images moet dan de locatie naar de rootfolder staan.

Ik zal nog eens proberen uitleggen waarom ik dit zoek:
Ik probeer het MVC principe toe te passen, maar gebruik daar geen extern framework voor zoals zend.

Als iemand mijnsite.be/gastenboek/toon.html intypt, zal de mod rewrite deze persoon doorzenden naar mijnsite.be/controllers/gastenboek.php?actie=toon.
De controller include dan models/gastenboek/toon.php en deze rendert dan views/gastenboek/toon.tpl.

Ik had echter graag gezien dat de mod rewrite de mensen doorzendt naar mijnsite.be/index.php?... (in de rootfolder) en dat deze dan de juiste controller etc laadt.

De index zou dus deze code moeten bevatten:
code:
1
2
3
<?php
include ('../controllers/gastenboek.php');
?>


Maar indien men mijnsite.be/gallerij/vakantie/weetikveelwat/index.php intypt, zal de include niet meer geldig zijn.
Het zou dus beter zijn als die altijd vanaf de root werkt (relatief).
Pagina: 1