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?
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"; ?>
Pitänee kokeilla jonkilaista dynaamista systeemiä tuohon. Kiitos vinkistä!
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ö.
<?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.
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.
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.
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!
https://www.php.net/manual/en/language.
Tuolta ainakin löytyy php:n vakioita mm. tuo __FILE__ .
Aihe on jo aika vanha, joten et voi enää vastata siihen.