Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php/html] zmiana katalogu głównego
Forum PHP.pl > Forum > Przedszkole
macek
Nie jestem pewien czy nazwa tematu adekwatna ale nie wiedziałem jak to nazwać winksmiley.jpg
Mój problem tyczy się php i htmla (głównie smarty)
załóżmy że mamy taką strukturę strony:
* public_html/ - znajduje się w katalogu użytkownika serwera, np /home/user
* public_html/css - arkusze css
* public_html/css/img - obrazki
* public_html/core - jądro aplikacji
* public_html/classes - klasy php
* public_html/templates - szablony smarty

Oczywiście są jeszcze inne katalogi, jednak te wystarczą a by zrozumieć istotę problemu smile.gif
plik index.php jest w katalogu public_html/, jest w nim include pliku public_html/core/load.php w którym jest ładowanie poszczególnych modułów aplikacji. Aby załadować np plik public_html/classes/x.class.php jest w nim:

  1. <?php
  2. include 'classes/x.class.php';
  3. ?>



I teraz moje pytanie: czy można jakąś funkcją zmienić katalog główny na public_html/ aby wpisując w pliku ładującym np:

  1. <?php
  2. include '/classes/x.class.php';
  3. ?>

serwer szukał pliku x.class.php w katalogu /home/user/public_html/classes/ ? smile.gif
Oczywiście wiem że w tym wypadku efekt będzie identyczny, lecz z mojego linuxowego przyzwyczajenia sądzę że o wiele jaśniej jest podawać ścieżki zazynając od /. No i w miarę rozbudowania aplikacji nie trzeba się bawić w ścieżki względne, tylko można wszystkie zawsze podawać względem / czyli np w naszym przypadku /home/user/public_html

Tyczy się to też plikół HTML, np atrybutów src w tagu img .. Dzięki tagowi <base> bez problemu można zmienić owy katalog, ale wtedy ścieżki do obrazków podaje się (nawiązując do przykładu powyżej) bez / na początku, z nim nie działa ( np css/img/obrazek.gif, a nie /css/img/obrazek.gif).. Da się jakoś zmusić serwer do takiej współpracy - teraz najlepsze smile.gif - nie grzebiąc bezpośrednie w php.ini ? smile.gif

---EDIT:
Udało mi się dojść do czegoś w plikach HTML.
W tej chwili projekt mam w katalogu głównym w katalogu/projekt/, w pliku konfuguracynym smarty zainicjowałem:

BaseHref = "http://serwer.pl"
BaseDir = "/projekt"

W sekcji head szablonów dałem: <base href='{#BaseHref#}' />, a przy wszystkich obrazkach daję: <img src='{#BaseDir#}/css/img/obrazek.gif' />, póki co działa .. Ale nie wiem jak całość będzie się zachowywać gdy BaseDir podam pusty .. Co sądzicie o takim rozwiązaniu ? Może ktoś podzieli się doświadczeniami w starciu z tym zagadnieniem ? smile.gif
qrees
Wymagałoby to użycia funkcji chroot, która ma jednak spore ograniczenia, więc pewnie nie będziesz miał możliwości jej użycia (i lepiej żebyć nie miał winksmiley.jpg ). W include w 99% wypadków nie podaje się ścieżki zaczynając od /, bo nie ma to najmniejszego sensu. / to główny katalog więc ścieżka musiałaby wyglądać jakoś tak:

'/home/ktoś/public_html/classes/plik.php'.

Ani tego przenieść nigdzie nie można, ani nie wygląda to estetycznie. Podawaj ścieżki bez / na początku i będzie ok. Linuxowe przyzwyczajenia nie muszą się przenosić na dobre praktyki programowania w php.
macek
Chroot pewnie na 99,9% serwerów jest niedostępna.. Hmm, no tak ale właśnie chodzi mi o jakąś funkcję (?) która zmieni mi korzeń z / serwerowego na moje /home/user/public_html/ winksmiley.jpg Przy większych aplikachach robis ię zamieszanie ze ścieżkami względnymi, raz działają, raz nie i w ogóle jaja z nimi są winksmiley.jpg
franki01
Ja korzystam z innego rozwiazania. Moze nie jest ono takie jakie chcesz, ale moze byc pomocne:

  1. <?php
  2. function setdir() {
  3.  $file = __FILE__;
  4.  $file = str_replace('', '/', $file); // dla windowsa
  5.  $e = explode('/', $file);
  6.  array_pop($e);
  7.  $dir = implode('/', $e).'/';
  8.  define('DIR, $dir);
  9.  return DIR;
  10. }
  11.  
  12. setdir();
  13. ?>


Wlozyc to do pliku, ktory znajduje sie w katalogu public_html, po czym w stalej DIR bedzie ten katalog. Potem mozna latwo uzywac:

  1. <?php
  2. include DIR.'classes/x.class.php';
  3. ?>


Moze pomysl nie taki jakbys chcial, ale bardzo pomocny (przynajmniej mi).
macek
Właśnie bardzo podobnie rozwiązałem go w Smarty przez tą stałą BaseDir o czym pisałem wyżej smile.gif
Pomysł w jakimś stopniu rozwiązujący problem, ale i tak jestem ciekaw czy da się to zrobić jakoś "bardziej automatycznie" tongue.gif Może i da się bez tego pisać, ale taka niestety już natura programisty - tryska ciekawością tongue.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.