login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Include vanuit site header file (Opgelost)

Offline Codestar - 11/04/2009 16:40 (laatste wijziging 11/04/2009 16:42)
Avatar van CodestarNieuw lid Van mijn siteHeader.php probeer ik het volgende:
  1. include_once('./controller/class.ApplicationStarter.php');
  2. $appStart = new controller_ApplicationStarter();


...dit werkt allemaal prima wanneer ik naar pagina's in de root surf (Zoals contact.php of login.php). Maar, wanneer ik naar een bestand surf dat in een map staat (zoals /plugins/news/index.php) dan werkt de bovenstaande include niet meer! Dan moet het opeens include_once('../../controller/class.ApplicationStarter.php'); zijn!

Nou zou je zeggen. O, oke dan maak je er een statisch pad van /rootdir/blabla....Maar de rootdir van mijn CMS staat in een config bestand. (Die is dus variabel: kan / zijn maar ook bijvoorbeeld /mijncms/) die op dat moment nog ingeladen moet worden en dus onbekend is.

Mijn vraag is dus, hoe ga ik die require laten werken ondanks dat mijn header.php zich soms in mappen bevind en soms in de root.

Dit is denk ik het meest storende probleem dat ik ooit met PHP heb ervaren en ik hoop eindelijk een fatsoenlijke oplossing te vinden (Dus niet een statisch pad defineren in de code, die horen in config files thuis ).

Hoop dat iemand me kan helpen!  



18 antwoorden

Gesponsorde links
Offline Martijn - 11/04/2009 16:45 (laatste wijziging 11/04/2009 16:50)
Avatar van Martijn Crew PHP zoiets mssn:
  1. function new_include($string,$int=1){
  2. global $configMappen;
  3. $aantal = (isset($configMappen) ? $configMappen : $int);
  4. $ding = str_repeat("../",$configMappen);
  5. include_once($ding.'controller/'.$string.'.php');
  6. }


dan moet je het nog wel met de hand doen, maar wel simpeler. Je zet nu in je config bestand (die je dus hiervoor moet includen) $configMappen = 2;
en dan doet ie overal netjes twee mappen op
Offline Codestar - 11/04/2009 16:49
Avatar van Codestar Nieuw lid De config map kan ik nog niet gebruiken. Die word pas ingelezen door de application starter. 
Offline NTS64 - 11/04/2009 16:50 (laatste wijziging 11/04/2009 17:00)
Avatar van NTS64 PHP gevorderde Je kan set_include_path gebruiken om meerder include paths te definiëren.
bvb:
  1. set_include_path('./controller/' . PATH_SEPARATOR . '../controller/'
  2. . PATH_SEPARATOR . '.../controller/' . PATH_SEPARATOR . get_include_path());

Nu gaat hij dus eerst in ./controller kijken, dan in ../controller en dan in .../controller(relatief gezien dan)

En dan uiteindelijk nog eens in de huidige map natuurlijk(get_include_path)
Offline Martijn - 11/04/2009 16:51
Avatar van Martijn Crew PHP k heb mijn functie aangepast dat ie nu ook met een simepel extra input werkt, maar dit hierboven lijkt me ook goed
Offline Threetimes - 11/04/2009 16:59
Avatar van Threetimes PHP beginner In contact.php zet je natuurlijk
  1. include_once('./controller/class.ApplicationStarter.php')
en in plugins/news/index.php zet je
  1. include_once('../../controller/class.ApplicationStarter.php')
Dit moet je per pagina veranderen, maar als je het hele systeem verplaats hoef je niks te veranderen.
Offline Codestar - 11/04/2009 17:02 (laatste wijziging 11/04/2009 17:06)
Avatar van Codestar Nieuw lid Hoi Threetimes,

Het is de bedoeling dat het centraal (in siteHeader.php) wordt afgehandeld.

... ben aan het stoeien met de opties die de andere gaven.


Update!
Dit heb ik nu:
  1. set_include_path('./controller/' . PATH_SEPARATOR . '../controller/'. PATH_SEPARATOR . '../../controller/');
  2. require_once(get_include_path() . 'class.ApplicationStarter.php');


Maar krijg deze foutmelding:
Warning: require_once(./controller/:../controller/:../../controller/class.ApplicationStarter.php) [function.require-once]: failed to open stream: Bestand of map bestaat niet in /home/sites/webhosting/codestars/codestars/dev/includes/siteHeader.php on line 19

Fatal error: require_once() [function.require]: Failed opening required './controller/:../controller/:../../controller/class.ApplicationStarter.php' (include_path='./controller/:../controller/:../../controller/') in /home/sites/webhosting/codestars/codestars/dev/includes/siteHeader.php on line 19
Offline NTS64 - 11/04/2009 17:21
Avatar van NTS64 PHP gevorderde
  1. require_once('class.ApplicationStarter.php');

Je moet je include path niet ophalen in require_once, dan krijg je een string die je 4 eerder gesette include paths bevat.
Het idee achter verschillende include paths te definiëren is dat wanneer je een bestand include, hij eerst voor dat bestand gaat kijken op de locatie van je eerste include path(die je hebt opgegeven in set_include_path), dan je tweede, enz.
Offline Codestar - 11/04/2009 17:49
Avatar van Codestar Nieuw lid Dat werkt! Al lijkt het me niet de meeste nette oplossing aangezien ik op verschillende plaatsen die regels code moet toevoegen...

En het brengt een nieuw probleem met zich mee aangezien de oplossing van Woedi niet werkt voor het pad van het config bestand dat ik wil inladen met de functie SimpleXml_load_file($configFile);

Stiekem hoop ik nog op een alternatieve oplossing! 

Ps: Woedi, speel je C&C Kane's Wrath?  
Offline NTS64 - 11/04/2009 17:53
Avatar van NTS64 PHP gevorderde Ik heb lange tijd C&C Tiberium Wars gespeeld.
Ik zou m'n avatar eigenlijk is moeten aanpassen... 
Offline Joost - 11/04/2009 18:33 (laatste wijziging 11/04/2009 19:14)
Avatar van Joost PHP expert Je zou het zo kunnen doen, maar dat is echt enorm omslachtig:
  1. function getFileLocation($file){
  2. $found = false;
  3. $location = "";
  4. for($i = 0; $i < 10; $i++){
  5. if(file_exists($location.$file)){
  6. break;
  7. } else {
  8. $location .= "../";
  9. }
  10. }
  11. if(!file_exists($location.$file){
  12. return false;
  13. }
  14. return $location.$file;
  15. }

Offline Koen - 11/04/2009 18:47 (laatste wijziging 11/04/2009 19:28)
Avatar van Koen PHP expert
Medieval schreef:
Je zou het zo kunnen doen, maar dat is echt enorm omslachtig:
[..code..]


Dan kan je ook gewoon dit doen:
  1. function getFileLocation($loc, $counter=1)
  2. {
  3. return ($counter > 10) ? false : (file_exists($loc) ? $file : getFileLocation('../'.$loc, $counter++));
  4. }

Offline Threetimes - 11/04/2009 19:03
Avatar van Threetimes PHP beginner
Medieval schreef:
Je zou het zo kunnen doen, maar dat is echt enorm omslachtig:
[..code..]
Leker... Ongecontroleerde loop 
Als het bestand helemaal niet bestaat zal hij in een oneindige loop terechtkomen.

sliphead schreef:
[..quote..]

Dan kan je ook gewoon dit doen:
[..code..]
Leker... Ongecontroleerde recursie 
Als het bestand helemaal niet bestaat zal hij in een oneindige loop terechtkomen.
Offline Joost - 11/04/2009 19:05 (laatste wijziging 11/04/2009 19:05)
Avatar van Joost PHP expert Het gaat in alleen even om het idee he ;)
Je zou het gemakkelijk kunnen limiteren op 10 niveau's diep kijken.
Offline Threetimes - 11/04/2009 19:07
Avatar van Threetimes PHP beginner
Medieval schreef:
Het gaat in alleen even om het idee he ;)
Je zou het gemakkelijk kunnen limiteren op 10 niveau's diep kijken.
Dat had ik ook nog wel door 
Offline Joost - 11/04/2009 19:13
Avatar van Joost PHP expert
Threetimes schreef:
[..quote..]Dat had ik ook nog wel door 
Heb de oneindige loop-mogelijkheid er voor je uitgehaald  
Offline Threetimes - 11/04/2009 19:32
Avatar van Threetimes PHP beginner
Medieval schreef:
[..quote..]Heb de oneindige loop-mogelijkheid er voor je uitgehaald  
Mooi zo. Ik zie dat sliphead ook nog wakker is 
Offline Koen - 11/04/2009 19:32
Avatar van Koen PHP expert
Medieval schreef:
[..quote..]Heb de oneindige loop-mogelijkheid er voor je uitgehaald  


Idem 
Offline Codestar - 25/04/2009 13:32
Avatar van Codestar Nieuw lid Eindelijk heb ik iets gevonden dat lijkt te werken!

De onderstaande regel code check de dir waar de siteHeader in staat. - de map includes. Dan kom je uit op de root website dir zonder dat ergens statisch in de code de hoeven plaatsen! Hoera voor mij! 

echo str_replace('includes', '', dirname(__FILE__));
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.422s