Autor Zpráva
Punk-turtle
Profil
Dobrý den, rád bych začal s PHP a tak jsem si podle knihy (Programování WWW stránek pro úplné začátečníky od Martina Mikuľáka) rozdělil hotové stránky na části -hlavicka, menu, paticka atd. a pomocí require části vložil do stránky.
V pořádku funguje.
Problém nastal, když chci vytvořit nějaký systém adresářů. Nevím, jak nastavit cesty v odkazech např. hlavního menu. Ať dělám co dělám, menu mi funguje pouze po vložení do souborů uložených v kořenovém adresáři. Jakmile jej vložím do do souborů hlouběji v adresářové struktuře, nefunguje.
Chápu, že je to asi tím, že z podadresáře je k určitému souboru logicky jiná cesta než z kořene.
Trochu jsem to vyřešil tak, že jsem cesty uvedl celé, např. /mojestranky/recepty/gulas.php atd. To sice funguje, jenže na localhostu, kde mám vlastně celé stránky v /opt/lampp/htdocs/mojestranky. Pokud je budu aplikovat na server, kde jako kořen je třeba adresář www, tak to fungovat nebude anebo bych musel všude v cestách změnit mojestranky na www.
Jak se to tedy správně a elegantně udělá?
Borius
Profil
Punk-turtle:
Rozumím tomu tak, že sis vytvořil jakýsi šablonový systém, kde do hlavního – vždy volaného – skriptu vkládáš jednotlivé části stránky. To by mělo být v pořádku a mělo by to fungovat. Bez ukázky kódu nelze chybu určit.
nemeja
Profil
Punk-turtle:
/mojestranky/recepty/gulas.php
problém bude možná v tom, že lomítko na začátku, značí root. Pokud máš první soubor do kterého vkládáš třeba v rootu tzn. "/mojestranky/" tak cesta k souboru gulas.php je "recepty/gulas.php", třeba ti to pomůže :)
Punk-turtle
Profil
Takže vyřešeno, zkusil jsem to hodit na ostrý server a pokud adresy skutečně začínají lomítky a cesty jsou adresované od roota (/recepty/gulas.php), vše funguje jak má.
Problém byl v tom, že používám xampp a třeba tyto stránky mám uloženy v /opt/lampp/htdocs/mojestránky.
Jenže pro xampp je root v /opt/lampp/htdocs, takže hledal volané soubory tam.
Jen teď nevím, jak tedy stránky zkoušet na localhostu...
Borius
Profil
Viděl bych dvě možnosti, jak na localhost:
1) Pokud si stránky umístíš taktéž přímo do rootu (čili do ‘htdocs/’), pak Ti i tam budou cesty fungovat.
2) Použít relativní cesty – a budou Ti fungovat kdekoli. To je asi použitelnější varianta.
Punk-turtle
Profil
Do rootu je umístit nemohu, protože tam je např. index.php který spouští administrační rozhraní xamppu a jiné soubory. Navíc když budu vyvíjet více www najednou, musím je mít v separé složkách.

Relativní cesty mi právě nefungují, ztrácejí smysl tím, že skripty, které je používají jsou volány na různá místa.
Ugo
Profil
neřeš relativní cesty, absolutní adresu volaného souboru najdeš takto:
PHP > 5.3 - konstanta __DIR__
PHP < 5.3 - dirname(__FILE__)

čili cesty budeš mít jakoby relativně, ale hodíš před ně toto

include(dirname(__FILE__)."/recepty/gulas.php");

doporučuji udělat vlastní konstantu z onoho dirname() jestli nemáš všude php > 5.3
Tori
Profil
Punk-turtle:
Další možnost (k těm v [#5]) je přesměrovat všechny požadavky na jeden skript (např. /index.php). Ten potom includuje jak hlavičku, tak např. recepty/gulas.php. V tom případě by se použil adresář s index.php jako základní, a cesty byste psal relativně k tomuto adresáři (viz [#7]). Jestli to chcete vyzkoušet, zjistěte si, jestli váš hosting umožňuje použít soubor .htaccess.
Punk-turtle
Profil
.htaccess používám, protože mám subdomény a aliasy, ale jinak nerozumím, jak to myslíte, opravdu s tím začínám.
Tori
Profil
Punk-turtle:
.htaccess, který dáte do adresáře s index.php (=nejvyšší adresář webu):
RewriteCond %{REQUEST_FILENAME} .*\.php [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
- všechny požadavky na soubory, které buď neexistují nebo to jsou PHP skripty, přijdou do index.php. Požadovanou (relativní) URL si zjistíte:

/index.php:
<?php
// cesta k nejvyššímu adresáři aplikace, (bez koncového lomítka!)
define('APPROOT', dirname(__FILE__));
// požadovaná URL (= cesta k souboru, který se má includovat, vždy začíná lomítkem)
$soubor = str_replace(APPROOT, '', $_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI']);
if ($soubor === '/' || !is_file(APPROOT.$soubor)) {
  $soubor = 'obsah.php'; // výchozí hodnota, pokud uživ.nezadá jméno skriptu ("localhost/mojestránky/")
}

include APPROOT . $soubor;
?>

/recepty.php, /recepty/gulas.php, /recepty/zverina/muflon/nadivany/s-jalovcem/kde-se-vari.php, ... - všude to už napíšete stejně:
<?php
include APPROOT . '/includes/hlavicka.php';
// ....
include APPROOT . '/includes/paticka.php';

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: