2017-10-24 2 views
0

Ich habe eine Funktion, die einen Ordner mit Bildern ausliest.
Das Problem ist, dass es nur funktioniert, wenn der Pfad zu dem Ordner absolut ist.PHP lesen Ordner funktioniert nur mit absoluten Pfad

Wenn ich es in einen dynamischen Pfad ändern, wirft es mir einen Fehler. Hier

ist die Funktion:

<?php 
function getPathsByKind($path,$ext,$err_type = false) 
{ 
    # Assign the error type, default is fatal error 
    if($err_type === false) 
     $err_type = E_USER_ERROR; 
    # Check if the path is valid 
    if(!is_dir($path)) { 
     # Throw fatal error if folder doesn't exist 
     trigger_error('Folder does not exist. No file paths can be returned.',$err_type); 
     # Return false incase user error is just notice... 
     return false; 
    } 
    # Set a storage array 
    $file = array(); 
    # Get path list of files 
    $it  = new RecursiveIteratorIterator(
     new RecursiveDirectoryIterator($path,RecursiveDirectoryIterator::SKIP_DOTS) 
    ); 
    # Loop and assign paths 
    foreach($it as $filename => $val) { 
     if(strtolower(pathinfo($filename,PATHINFO_EXTENSION)) == strtolower($ext)) { 
      $file[] = $filename; 
     } 
    } 
    # Return the path list 
    return $file; 
} 
?> 

und hier ist, wie ich es holen:

<?php 
# Assign directory path 
//$directory = '/Applications/MAMP/htdocs/domainname/wp-content/themes/themename/images/logos/'; 
// THIS PART ABOVE IS THE ABSOLUTE PATH AND IS WORKING. 

$directory = get_bloginfo('template_directory').'/images/logos/'; 


$files = getPathsByKind($directory,'svg'); 
if(!empty($files)) { 
    for($i=0; $i < 32; $i++){ 
     echo '<img src="'.$files[$i].'">'; 
    } 
} 
?> 

Wie kann ich es mit einem relativen Pfad funktioniert?

+0

Und Ihre Frage? –

+0

Mein schlechtes. Siehe Updates Frage – Interactive

Antwort

1

Ich werde Ihre Frage mit einer Frage beantworten: Warum sollte es mit einem relativen Pfad funktionieren?

Der wahrscheinlichste Grund, warum es nicht mit einem relativen Pfad funktioniert, ist, das aktuelle Arbeitsverzeichnis ist nicht das, was Sie denken, dass es ist. Sie können es mit getcwd() Funktion überprüfen.

Dies ist auch das größte Problem mit relativen Pfaden: Sie können nie auf ihnen verlassen. Das aktuelle Arbeitsverzeichnis kann jederzeit außerhalb des Skripts mit chdir() aus irgendeinem Grund gesetzt werden.

Wenn Sie mit Dateien auf Ihrem Server arbeiten, verwenden Sie IMMER absolute Pfade. Wenn Sie einen Pfad relativ zur Skriptdatei auflösen möchten, verwenden Sie IMMER__DIR__ oder dirname().

In Ihrem Fall ist das Problem mit Ihrem Code, dass Ihre getPathsByKind Funktion absolute Pfade zu den Bildern zurückgibt, die für alle außer localhost nutzlos sind. Was Sie tun können, ist getPathsByKind nur Dateinamen statt vollständige Pfade zurückgeben. Ersetzen Linie

$file[] = $filename; 

mit

$file[] = pathinfo($filename, PATHINFO_BASENAME); 

dann, prepend dem Weg in img tag:

for($i=0; $i < 32; $i++){ 
    echo '<img src="/images/logos/or/whatever/'.$files[$i].'">'; 
} 
+0

Okay macht Sinn. Aber wie schlägst du vor, dass ich das löse? Ich meine, ich möchte den Pfad in einen ' Interactive

+0

Ersetzen Sie in Ihrer 'getPathsByKind'Funktion die Zeile' $ file [] = $ filename; 'durch etwas, das Pfade relativ zu Ihrem Bilderverzeichnis zurückgibt. Sie müssen keine relativen Pfade an die Funktion übergeben, um relative Pfade von der Funktion zu erhalten. –

+0

Tut mir leid, ich bin ein bisschen über meinen Kopf hier. Ich werde etwas googeln, um das ein bisschen besser zu verstehen! – Interactive

Verwandte Themen