Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kansiorakenne ja include

Sivun loppuun

punppis [06.04.2009 21:10:41]

#

Tässä on nyt työn alla tällänen php-sivupohja, jolla voisin sitten helposti ja nopeasti tehdä sivut valmiilla funktioilla ja luokilla. Ongelma tuli includen ja kansioiden kanssa. Nähkääs nytten kansiorakenne menee suurinpiirtein näin:

/index.php
/modules/settings.php
/modules/mysql.php
/lang/en.php

Esimerkiksi settings.php:ssa includetan ../lang/en.php. Tämä toimii ok jos selaa suoraan settings.php-tiedostoa (mitä siis ei olla tekemässä), mutta kun tätä filua olisi tarkoitus includettaa selattavilla sivuilla, eli tässä esimerkissä index.php:ssa. Nyt kun includetan /index.php:ssa tuota /modules/settings.php:ta, niin php vääntää sen tietysti sillain, että se yrittää includettaa ../lang/en.php:ta, mutta kun tätä tehdään juurihakemistosta (siitä index.php:sta), niin moista tiedostoahan ei tietysti löydy.

Ongelmaa häviäisi sillä, jos pistäisin kaikki includet suoraan ilman tuota ../-etuliitettä. Mutta sitten ne ei taas toimisi jos teen jonkun erillisen kansion tuonne juurihakemistoon, jossa taas on paljon samaan ryhmään kuuluvia sivuja. Miten ihmeessä tälläinen systeemi sitten kannattaisi rakentaa. Tuleeko nuo kaikki includet sitten tehdä selattavan sivun puolelta vai kuinka?

kinnala [06.04.2009 21:41:49]

#

Jos nyt oikein ymmärsin, niin ongelma selviää mm. käyttämällä absoluuttisia polkuja.

Tyyliin index.php:ssa

<?php
include "/home/user/public_html/modules/settings.php";
?>

ja settings.php:ssa

<?php
include "/home/user/public_html/lang/en.php";
?>

http://www.computerhope.com/jargon/a/absopath.htm

punppis [06.04.2009 21:58:07]

#

Pitänee kokeilla jonkilaista dynaamista systeemiä tuohon. Kiitos vinkistä!

Metabolix [06.04.2009 22:04:29]

#

kinnala kirjoitti:

Jos nyt oikein ymmärsin, niin ongelma selviää mm. käyttämällä absoluuttisia polkuja.

Tuollaisenaan tuo tapa ei ole alkuunkaan hyvä, koska nythän kaikki koodi hajoaa, jos sen yrittää siirtää jonnekin.

Yksi järkevä ratkaisu on sijoittaa johonkin yksittäiseen tiedostoon jokin sovelias polku. Yhden tiedoston saa helposti sitten liitettyä includella tuolla nykyiselläkin tavallasi eli kustakin skriptistä soveliaalla suhteellisella polulla, ja loput includet voi tehdä tiedostoon asetetun polun avulla.

Jos nyt äsken esitettyä absoluuttista polkua käytetään, toteutus näyttää tältä:

<?php
# asetus.php
$etuliite = "/home/user/public_html";
?>
<?php
# jokin/toinen/sivu.php
require_once "../../asetus.php";

include "$etuliite/kirjasto/funktiot.php";
?>

Parempiakin tapoja on, mm. __FILE__-vakion käyttö.

tsuriga [06.04.2009 22:43:19]

#

<?php
//settings.php
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(dirname(__FILE__)));
?>

Tässä nyt tuo settings ajaa vähän kuin bootstrapin virkaa.

punppis [06.04.2009 22:56:51]

#

tsuriga kirjoitti:

<?php
//settings.php
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(dirname(__FILE__)));
?>

Tässä nyt tuo settings ajaa vähän kuin bootstrapin virkaa.

Kiitos. Jos nyt ymmärsin oikein tuon __FILE__:n toiminnan, niin enkös voisi myös laittaa jokaisen includen eteen vain tuon dirname(__FILE__) ja homma toimisi oikein?

Onhan tuo set_include_path paljon järkevämpi, mutta ihan vain mielenkiinnosta, että ymmärsinkö oikein.

tsuriga [06.04.2009 23:33:45]

#

tias (try it and see), ts. kokeilemallahan sen näet. Tai katso manuaalista, mitä dirname tekee ja mieti (tai kokeile ja tulostele), mikä lopulliseksi sisällytyspoluksi tulee, kun includeja tehdään eri hakemistoista.

punppis [07.04.2009 08:55:56]

#

tsuriga kirjoitti:

tias (try it and see), ts. kokeilemallahan sen näet. Tai katso manuaalista, mitä dirname tekee ja mieti (tai kokeile ja tulostele), mikä lopulliseksi sisällytyspoluksi tulee, kun includeja tehdään eri hakemistoista.

Juu näinhän se piti kokeilla. En kyllä manuaalista löytäny tuolla hakusanalla kun file()-funktion mutta kokeilemallahan tuon sai selville. Kiitos, tästä oli apua myös toisen jutun kanssa!

TeNDoLLA [07.04.2009 09:44:10]

#

https://www.php.net/manual/en/language.constants.predefined.php

Tuolta ainakin löytyy php:n vakioita mm. tuo __FILE__ .


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta