Warum funktionieren Bilder mit relativem Pfad nicht?
am 26.10.2006 - 23:03 Uhr in
Aloha,
ich versuchte Inline-Bilder mittels relativem URI
<img src="/files/bild.png" alt="mein Bild">
einzubinden, was laut David Mercers Drupal-Buch funktionieren sollte.
Im Quelltext der generierten Seite (Firefox [CTRL U]) taucht der obige Code korrekt auf. Also kann es nicht am HTML-Filter liegen. Ich nutze hier zum Entwickeln XAMPP für Windows Version 1.5.3a.
Gebe ich
http://localhost/drupal/files/bild.png
ein, schickt Apache das Bild an den Browser. Man sieht, dass meine Drupal-Testseite in einem Unterverzeichnis von htdocs liegt. Der Befehl
<img src="/drupal/files/bild.png" alt="mein Bild">
bringt nichts. Das Bild erscheint erst bei der Variante
<img src="/drupal/files/bild.png" alt="mein Bild">
mit absolutem Pfad relativ zum Basis-URI. Nun frage ich mich, wie ich zu relativen Pfadangaben kommen kann, denn mit obiger Arbeitsweise lässt sich die Seite nicht in ein anderes Verzeichnis verschieben.
Könnte es an mod_rewrite liegen (clean URLs), welches aktiviert ist?
Farewell
- Anmelden oder Registrieren um Kommentare zu schreiben
base_path
am 27.10.2006 - 17:08 Uhr
Versuchs mal mit
<img src="/<?php print $base_path ?>/files/bild.png" />
md - drupalcenter
--
www.mdwp.de :: www.go-with-us.de
vg
md - DrupalCenter.de
mdwp* Drupal Consulting & Services
Hallo Meinolf,
am 27.10.2006 - 19:40 Uhr
Hallo Meinolf,
danke für die Antwort und den Hinweis, dass ich ja XHTML verwenden sollte (hatte den slash am Ende vergessen).
Ich habe nun folgende Varianten getestet:
<img src="/drupal/files/bild.png" />
<img src="/<?php echo "/drupal" ?>/files/bild.png" />
<img src="/<?php print $base_path ?>/files/bild.png" />
Die ersten beiden Varianten funktionieren, die letzte leider nicht. Die zweite Variante zeigt, dass PHP ausgeführt wird. Bei der letzten Variante schickt Apache lediglich
<img src="/files/bild.png" />
raus. Anscheinend ist $base_path nicht definiert. Ich habe noch die Variable $base_url probiert, die in settings.php definiert ist, aber da passiert auch nichts: keine Rückgabe.
Als einer der Vorteile von Drupal gilt ja, dass alle Verweise relativ sein sollen. Seltsam, dass dies schon bei einem so einfachen Beispiel nicht funktioniert.
Jetzt müsste ich wohl die PHP-Syntax lernen und den gesamten Code analysieren.
Farewell
http://feodor.de
http://feodor.de
Wo hast du das her, daß
am 27.10.2006 - 19:58 Uhr
Wo hast du das her, daß alle Verweise relativ sein sollen?
Relativ zu was, müsste man hier fragen. Es gibt bei Drupal ja generell zwei Zugriffsarten: /pfad/zum/file, das vom Apache zu der Alternative index.php?q=pfad/zum/file uebersetzt wird. Der feine Unterschied zwischen den beiden Varianten (abgesehen davon daß die erste im Browser schöner aussieht) ist, daß der Browser bei der ersten Variante relative Pfade ab dem angegebenen Verzeichnis interpretiert (er denkt das Verzeichnis existiere), wogegen bei der zweiten Variante vom Hauptverzeichnis der Drupal Seite ausgegangen wird (alles hinter ? wird nicht mehr als Pfad interpretiert).
Mit relativen Pfaden landest du also sehr wahrscheinlich bei den beiden möglichen Zugriffsvarianten jeweils woanders. Von daher kannst du hier mit relativen Pfaden nicht zuverlässig arbeiten. Es sei denn natürlich du gehst davon aus, daß nur eine der Varianten benutzt wird.
Die sauberste Lösung wäre IMO, wenn (man) Drupal selbst Dateien verwalten (lassen) würde. Nur so kann man von beliebig vielen Nodes auf dieselbe Datei verlinken (so das denn nötig ist) und korrekt darauf reagieren, wenn diese Datei sich verschiebt, den Namen ändert oder einfach nicht mehr auf dem Server angeboten wird. Die Alternative dazu (alle betroffenen Nodes von Hand nachkorrigieren oder mit toten Links leben) ist nicht besonders schön.
Wie man das nun in Drupal gescheit macht, ist wieder eine andere Frage...
Relativitätstheorie
am 27.10.2006 - 20:15 Uhr
Es müsste
<img src="/<?php print base_path() ?>files/bild.png" />
heissen.vg
//edit: Achso, zur Relativitätstheorie: relativ zum Drupal-Installations-Root.
Drupal-Installations-Root:
http://www.domain.tld/
Auf der Seite http://www.domain.tld/ führt
<img src="/files/bil01.png" />
zum gewünschten Ergebnis.Auf der Seite http://www.domain.tld/node/12 führt
<img src="/files/bil01.png" />
_nicht_ zum gewünschten Ergebnis.Auf der Seite http://www.domain.tld/ führt
<img src="/files/bil01.png" />
zum gewünschten Ergebnis.Auf der Seite http://www.domain.tld/node/12 führt
<img src="/files/bil01.png" />
zum gewünschten Ergebnis.Beide Varianten sind relativ, die eine funktioniert, die andere nicht.
--
sanduhrs - drupalcenter
--------------------------------
http://erdfisch.de
--
sanduhrs · Stefan Auditor · Drupalcenter
http://drupal.org/user/28074 · http://association.drupal.org/user/646
base_path
am 27.10.2006 - 23:59 Uhr
Die page.tpl.php (und ich dachte darum ging es) kennt die Variable $base_path.
Auszug aus dem Bluemarine Theme:
<?php if ($logo) { ?><a href="/<?php print $base_path ?>" title="<?php print t('Home') ?>"><img src="/<?php print $logo ?>" alt="<?php print t('Home') ?>" /></a><?php } ?>
Wird bei mir ausgegeben als '/drupal/'.
md - drupalcenter
--
www.mdwp.de :: www.go-with-us.de
vg
md - DrupalCenter.de
mdwp* Drupal Consulting & Services
Re: Wo hast du das her, daß
am 28.10.2006 - 11:54 Uhr
Wo hast du das her, daß alle Verweise relativ sein sollen?
Im Buch von David Mercer "Drupal: Creating Blogs, Forums, Portals, and Community Websites" fand ich ein Codebeispiel in der Bildzugriff als file/bild.jpg ohne führenden slash codiert war. Hier irgendwo im Forum las ich, dass es Drupal gestattet, das Installationsverzeichnis zu wechseln, ohne dass Verweise ins Leere führen.
Relativ zu was, müsste man hier fragen.
Was mich interessiert ist, dass ich den Namen des Drupal-Installationsverzeichnisses weglassen kann. Dann kann ich leicht alles verschieben.
Es gibt bei Drupal ja generell zwei Zugriffsarten: /pfad/zum/file, das vom Apache zu der Alternative index.php?q=pfad/zum/file uebersetzt wird.
Das sollte nach meinem aktuellen Verständnis allerdings bei Bildern nicht passieren, denn es handelt sich ja hierbei nicht um XHTML-Inhalt der dynamisch aus Datenbankeinträgen mittels PHP generiert wird. Vielmehr muss ja eine komplette Bilddatei aus dem Dateisystem an den Browser geschickt werden
Von daher kannst du hier mit relativen Pfaden nicht zuverlässig arbeiten.
Den Eindruck habe ich mittlerweile auch. Vielleicht war es nur ein Bug in Mercers Buch.
Die sauberste Lösung wäre IMO, wenn (man) Drupal selbst Dateien verwalten (lassen) würde.
Ja das sehe ich auch so. Ein Referenzzähler wäre hier wirklich schick. Fragt sich, ob es hier schon ein geeignetes Modul gibt. Ich muss mir mal die einschlägigen Module ansehen.
http://feodor.de
$base_path versus base_path()
am 28.10.2006 - 12:07 Uhr
Bingo sanduhrs! Wenn man die Variable $base_path gegen den Funktionsaufruf base_path() austauscht klappt es.
Es hapert bei mir an PHP-Kenntnissen.
Meinolf hat allerdings recht, dass in page.tpl.php die Variable $base_path verwendet wird, was auch nachprüfbar im Kopfteil der generierten Seite funktioniert. Anscheinend fehlt der Zugriff auf $base_path, wenn der PHP-Code im Artikel interpretiert wird. Ich habe auch einige andere Variablen probiert: kein Zugriff.
Farewell
http://feodor.de
http://feodor.de
global $base_path
am 28.10.2006 - 13:22 Uhr
So geht das, wenn du PHP-Code direkt eingibst:
<?php
global $base_path;
print $base_path;
?>
Hab ich gerade getestet.
md - drupalcenter
--
www.mdwp.de :: www.go-with-us.de
vg
md - DrupalCenter.de
mdwp* Drupal Consulting & Services
Re: global $base_path
am 28.10.2006 - 18:24 Uhr
So geht das, wenn du PHP-Code direkt eingibst...
Stimmt, das klappt bei mir auch. Globale Variablen müssen in PHP als solche deklariert werden. U.a. deswegen gibt es auch die Accessor-Funktion base_path().
http://www.dynamicwebpages.de/php/language.variables.scope.php
Es lag also wie vermutet an meinen fehlenden PHP-Kenntnissen. (Jetzt stellt sich die Frage, welches PHP-Buch ich mir kaufe.)
Mal sehen wie das mit den Modulen image und img_assist funtioniert.
Farewell
Feodor
http://feodor.de