Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak tworzyć linki, żeby kod był w pełni prznośny?
Forum PHP.pl > Forum > Przedszkole
Przemek1
Mam prośbę o porady na temat sposobu tworzenia linków w strukturze witryny generowanej w php, tak aby wszystko działało niezależnie od lokalizacji plików na serwerze.
Obecnie tworzę szkielet serwisu i mam wszystkie pliki umieszczone na swoim komputerze w katalogu, który jest ustawiony jako DocumentRoot dla Apache. U mnie jest to "D:/www". Niby wszystko działa ale:
* docelowo serwis trafi na serwer providera i domyślam się, że znajdzie się wewnątrz jakiegoś przydzielonego mi katalogu w DocumentRoot, tak więc odniesienia bezwzględne staną się chyba nieaktualne, bo nie będą uwzględniały tego, że doszła jeszcze nazwa katalogu
* nie wiem, czy w ogóle linki ze ścieżką bezwzględną do pliku na serwerze mają jakiś sens (mam na myśli linki nawigacyjne w strukturze witryny), ale w takim razie jak się pozbyć z URL całego członu ścieżki wskazującego na położenie mojej witryny na serwerze?
* próbowałem stosować ścieżki względne, ale dzieje się coś dziwnego, to znaczy każde kolejne kliknięcie na przykład na link do "index.php" powoduje "dolepienie" do adresu kolejnego członu. Po kilku kliknięciach adres w przeglądarce wygląda mniej-więcej tak:
Kod
http://localhost/index.php/index.php/index.php/index.php/index.php

A sam link, wygląda tak:
Kod
<a href:"index.php">index</a>

Rozumiem, że jest to link "względny", który powoduje poszukiwanie pliku w bieżącym katalogu. Gdy zamieniam go na link bezwzględny:
Kod
<a href:"/index.php">index</a>

wszystko działa jak należy. Ale co się stanie, gdy wszystkie pliki znajdą się w jakimś katalogu na serwerze? Wówczas będę musiał poprawiać wszystkie ścieżki bezwzględne.

Zauważyłem, że linki na stronach nie zawiarają, żadnych członów, które określałyby lokalizację na serwerze u providera. A przecież na pewno nie wszysto jest umieszczane w jednym katalogu DocumentRoot. Na czym więc polega sztuka tworzenia dobrych linków, tak aby niezależnie od lokalizacji zawsze wszystko działało i nie powstawały zlepki jaki tworzą się u mnie przy zastaosowaniu ścieżki względnej jak w pierwszym przykładzie?
Będę wdzięczny za wszelkie wskazówki. Temat jest podstawowy i pewnie był już wałkowany ale nie mogę nic znaleźć.
Przemek
czachor
Ja używam $_SERVER['PHP_SELF'] i to mi wystarcza w 100%.
NuLL
U mnie generacja wyglada o tak
Kod
<a href='{"parametr:wartosc;parametr2:wartosci"|url}'>Link</a>

Nietruno zauwazyc jest to modifier do smarty - on autmatycznie dodaje http://adresstrony.pl i inne potrzebne rzeczy.
Przemek1
Cytat(czachor @ 2005-11-14 20:21:54)
Ja używam $_SERVER['PHP_SELF'] i to mi wystarcza w 100%.

A jak to zrealizować w praktyce?
Jest taka sytuacja. Mam następującą strukturę plików, u siebie na komputerze:
Kod
D:/www                        <-- katalog ustawiony jako DocumentRoot dla Apache
D:/www/abc                    <-- katalog z zawartością serwisu, który tworzę
D:/www/abc/index.php          <-- strona startowa, z której linki kierują zarówno
                                             z powrotem do index.php jak i do innych plików
                                             umieszczonych w katalogu src
D:/www/abc/src                <-- katalog z pozostałymi plikami .php tworzącymi witrynę
D:/www/abc/css                <-- katalog z plikami stylów
D:/www/abc/grafika            <-- katalog z grafikami dla wszystkich stron serwisu

Zmienna $_SERVER['PHP_SELF'] zwraca mi całą ścieżkę do aktualnej lokalizacji oprócz początkowego katalogu "www", który ustawiony jest DocumentRoot dla Apache. Jednak domyślam się, że po umieszczeniu mojego katalogu na serwerze, strona otrzyma swój bazowy adres w domenie hosta, czyli np. www.mojastrona.domenahosta.pl.
Jak wówczas "przetworzyć" ścieżkę zwracaną przez $_SERVER['PHP_SELF'], tak aby wygenerować linki zawierające poprawny URL do mojej strony wraz z podkatalogami ale bez początkowych ścieżek wskazujących na katalog na serwerze.
Inaczej mówiąc jak ze ścieżki:
"/DocumentRoot/katalog_uzytkownika/podkatalog_z_pilkami/plik.php"
utworzyć poprawny URL, wyświetlany "na zewnątrz", który skieruje do właściwej domeny, czyli coś takiego:
"http://www.mojastrona.pl/podkatalog_z_plikami/plik.php"

Próbuję też cały czas wykorzystywać w URL ścieżki względne, to znaczy na przykład z pliku "/www/abc/index.php", aby dostać się do "/www/abc/src/jakisplik.php" używam <a href:"src/jakisplik.php"tojestlink</a>. Liczyłem na to, że obsługa takiego URL będzie po stronie przeglądarki, która sama zmodyfikuje aktualną ścieżkę w pasku. Niestety efekt jest taki, że do paska dopisywane są kolejne człony, po "index.php", tak, że tworzy się coraz dłuższy zlepek.
Innym problemem, jest to, że po kliknięciu choćby jednego linka, katalog ze stylami css (w strukturze plików opisanej wyżej) nie jest odnajdowany i strona traci styl, chociaż jest wyświetlana. Zastanawiam się, czy wskazanie ścieżki do pliku css w "src=" nagłówka strony rządzi się jeszcze innymi prawami?

Będę bardzo wdzięczy za porady, ponieważ nie mam jeszcze możliwości umieszczenia kodu na serwerze i przypisania mu poddomeny u hosta, dlatego nie mam jak sprawdzić jakie wartości zwróci mi PHP_SELF, a muszę napisać działający kod u siebie w domu.

Może ktoś ma doświadczenie jak tworzyć poprawanie działające linki działające w obrębie struktury witryny, niezależnie od lokalizacji witryny w drzewie katalogów na serwerze i domeny, która jest jej przypisana? I jak tworzyć poprawne ścieżki "include" dla plików .php i "src=" dla .css?

Pozdrawiam,
Przemek!
dtb
przykładowa struktura plików i katalogów:
d:/www/plik1.html
d:/www/k1/index.html
d:/www/k1/k2/plik2.html
d:/www/k1/k2/plik3.html

zawartość pliku d:/www/k1/index.html (localhost/k1/index.html):
<a href="./../plik1.html">d:/www/plik1.html</a> <- plik katalog wyżej (./../) - ilość ../ określa ile katalogów wyżej
<a href="./index.html">d:/www/k1/index.html</a> <- plik w tym samym katalogu (./)
<a href="./k2/plik2.html">d:/www/k1/k2/plik2.html</a> <- plik w katalogu niżej (./NAZWA_KATALOGU)
<a href="./k2/plik3.html">d:/www/k1/k2/plik3.html</a> <- to samo co wyżej

myslę że to wszystko tłumaczy
Przemek1
Dziękuję bardzo za pomoc. Problem został rozwiązany.
Mam jeszcze tylko jedno pytanie - czy jest możliwe połączenie adresowania "wzglęnego" w drzewie katalogów, z "przyjaznymi URLami" takimi jak opisane a artykule tutaj: php.pl - przyjazne urle ? Chcę zastosować właśnie taką metodę, ale powoduje ona powstawanie pozornej lokalizacji w nieistniejących katalogach, która skutecznie uniemożliwia tworzenie linków względnych. Jak sobie z tym poradzić? Generować każdy link po wcześniejszym sprawdzeniu PATH_INFO i wyrzuceniu "wirtualnych" katalogów ze ścieżki?
Chodzi mi o to, że adres typu "index.php/informacje/artykuly/123" powoduje wykonanie kodu z index.php ale PATH_INFO zawiera całą ścieżkę, więc aby utowrzyć link z tej strony z powrtoem do index.php nie wystarczy już "./index.php" a potrzebne jest "./../../../index.php". Czyli adresowanie do tego samego pliku będzie różnie wyglądało, nawet z tego samego miejsca, w zależności od tego co znalazło się, jako "wirtualne" katalogi w URL i PATH_INFO. Czy można jakoś skutecznie rozwiązać ten problem?
Przemek
dtb
  1. <?
  2. define ('DIR', dirname($_SERVER['PHP_SELF']));
  3. echo DIR . '/text/text/text';
  4. ?>
Przemek1
Wielki dzięki za pomoc, dokładnie o to mi chodziło.
Pozdrawiam!
Przemek
Sabistik
@NuLL: Co to za modifier? Mozesz podac jakiegos linka? Czy to autorski ? snitch.gif Mozna troche wiecej info?

Pozdrawiam.
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.