Avatar billede lsskaarup Nybegynder
19. januar 2006 - 13:54 Der er 14 kommentarer og
1 løsning

Sortering af mapper og filer

Jeg har en side, der fungere som en meget skrabet udgave af en stifinder. Det eneste den kan er at vise indholdet af en mappe og åbne undermapper og næsten også filer deri. Den blvier brugt på en intranet-side, til at vise en mappe tilhørende en specifik tilbud/ordre.

Jeg har egentlig 2 ønsker hertil.

1) Kan man sortere indholdet, så mapper altid bliver vist øverst og dernæst filer. Nu har vi om gået problemet ved at døbe alle mappe "0_mappenavn", men kommer der en fil som hedder noget med "0....", så har vi problemet igen.

2) Næste spørgsmål har jeg tidligere oprettet herinde, men fik ikke noget endeligt svar. Filerne bliver lavet via hyperlinks, det har dog, i vores tilfælde, den uheldige virkning, at filerne åbnes gennem IE og så i en skrabet version af programmet. Jeg vil godt have, at de bliver åbnet direkte i de tilhørende programmer.

Koden kommer herefter
Avatar billede lsskaarup Nybegynder
19. januar 2006 - 13:55 #1
<?php
    include('static/opsaetning.php');
     
/*
echo '<p>$SERVER: '.$SERVER.'</p>';
echo $KATALOG."<br>";
echo $SERVER."<br>";
*/
function forceDir($dir){//Funktion der opretter alle undermapper
    $subs = explode('/', $dir);
    $tmp = '';
    foreach($subs as $name){
        $tmp = $tmp . $name;
        if (!file_exists($tmp)){
            mkdir( $tmp );
            }
            $tmp = $tmp . '/';
      }
    return $dir;
}


function showDir($root, $dir) {

    include('static/opsaetning.php');

    //$KATALOG = "DS Spærsalg";
    $SERVER = "srv-fil1";

    $filliste = array();
    //$showdir = "//" . $SERVER . "/" . $KATALOG . "/" . $root;
    $type = substr("$root", 0, strpos($root, "/"));
    $mappe1;
    $mappe2;
    if ($type == Tilbud) {//Tjekker hvilken type sagen er, tilbud/ordre
        $num = substr("$root", -6);
        $mappe1 = substr($num, -5, 1);
        $mappe2 = substr($num, -4, 1);
        $ubermappe = substr($num, -6, 2);
        $slutmappe;
        $startmappe = $mappe1 . $mappe2 . "000";
        if ($mappe1 == 0){
            $slutmappe = (($mappe2 +1) . "000") - 1;
            $startmappe = $mappe2 . "000";
        } else {
            $slutmappe = ((($mappe1 . $mappe2)+1) . "000" -1);
        }
        if ($slutmappe<"1000"){
            $mappenavn = $ubermappe . $startmappe ."-". $ubermappe . "0".$slutmappe;
        } else {
            $mappenavn = $ubermappe . $startmappe ."-". $ubermappe . $slutmappe;
        }
        $root = $type . "/" . $mappenavn . "/" . $num;
    } else {
        $num = substr("$root", -5);
        $mappe1 = substr($num, -4, 2);
        if ($mappe1 > 9) {
            $mappe2 = $mappe1+1;
        } else {
            $mappe1 = substr($num, -3, 1);
            $mappe2 = $mappe1 +1;
        }

        $ubermappe = substr($num, -6, 2);//retunere de 2 første cifre
        if ($mappe1 > 9){
            $mappe1 = substr($num, -3, 1);
            $mappe1 = $mappe1 . "00";

        } else {
            $mappe1 = $mappe1 . "00";
        }

        //Laver slutmappen
        $slutmappe1 = ((substr($num, -3, 1) + 1)."00") -1;
        if ($slutmappe1 < 100) {
            $slutmappe1 = "0". $slutmappe1;
        }

        $mappenavn = $ubermappe . $mappe1 . "-" . $ubermappe . $slutmappe1;
        $root = $type . "/" . $mappenavn . "/" . $num;
    }

    //echo $root;

    $showdir = "//" . $SERVER . "/" . $KATALOG . "/" . $root;


    forceDir($showdir);//Kalder funktion som opretter undermapper

    for($i=1; $i<=count($ORDRE); $i++){
        $mail = "//" . $SERVER . "/" . $KATALOG . "/" . $root . "/" . $ORDRE[$i];
        mkdir($mail);
    }

    for($i=1; $i<=count($TILBUD); $i++){
        $mail = "//" . $SERVER . "/" . $KATALOG . "/" . $root . "/" . $TILBUD[$i];
        mkdir($mail);
    }

    if ($dir != '') {
        $showdir .= $dir;
        $filliste[] = "<a href=\"stifinder.php?root=$root&dir=" . substr_replace($dir, '', strrpos($dir, '/')    ) . "\"> <img src=\"/gfx/mappe.gif\" border=\"0\" width=\"18\"> </a>
                <a href=\"stifinder.php?root=$root&dir=" . substr_replace($dir, '', strrpos($dir, '/')    ) . "\">..</a>";
    }
    if ($handle = opendir($showdir)) {
        while (false !== ($file = readdir($handle))) {
            if ($file != "." && $file != ".." && $file[0] != "~") {
                if (is_dir($showdir . "/" . basename($file))) {
                    $filliste[] = "<a href=\"stifinder.php?root=$root&dir=".$dir."/".basename($file)."\"> <img src=\"/gfx/mappe.gif\" width=\"18\" border=\"0\"> </a>
                            <a href=\"stifinder.php?root=$root&dir=".$dir."/".basename($file)."\">" . basename($file) . "</a>";
                } else {

                    $tmp=explode( '.', basename($file) );
                    if($tmp[1] == "rtf" || $tmp[1] == "doc") {
                        $ikon="/gfx/ikon_word.gif";
                    } else if($tmp[1] == "xls") {
                        $ikon="/gfx/ikon_excel.gif";
                    } else if($tmp[1] == "pdf") {
                        $ikon="/gfx/ikon_pdf.gif";
                    } else {
                        $ikon="/gfx/ikon_fil.gif";
                    }
                    $filliste[] = "<a href=\"file:". $showdir . "/" . basename($file) ."\" target=\"_blank\"> <img src=\".$ikon.\" border=\"0\"> </a>
                            <a href=\"file:". $showdir . "/" . basename($file) ."\" target=\"_blank\">" . basename($file) ."</a>";
                }
            }
        }   
    }
      closedir($handle);

    return $filliste;

}
?>

<html>
<style>
body, table, tr, td {
    margin-bottom : 0px;
    margin-left : 0px;
    margin-right : 0px;
    margin-top : 0px;
    font-family : Geneva, Arial, Helvetica, sans-serif;
    font-size: 13px;
}
a {
    text-decoration: none;
    color: black;

}
</style>
<body>
<table width="500">
<?php
$filliste = showDir($_GET['root'], $_GET['dir']);
foreach($filliste as $fil) {
  echo "<tr><td>$fil</td></tr>";
}

?>
</table>
</body>
</html>
Avatar billede coderdk Praktikant
19. januar 2006 - 15:10 #2
$files = array();
$dirs = array();
if ( $dh = opendir( $showdir ) )
{
  while ( $fil = readdir( $dh ) )
  {
      if ( is_dir( $showdir . '/' . $fil ) && $fil != '.' && $fil != '..' )
      {
        $dirs[] = $showdir . '/' . $fil;
      }
      else if ( !is_dir( $showdir . '/' . $fil ) )
      {
        $files[] = $showdir . '/' . $fil;
      }
  }
}

sort( $dirs );
sort( $files );

Så har du to arrays der er sorteret. Brug foreach eller lign. på hver af dem, så har du dirs først og filer bagefter :)
Avatar billede coderdk Praktikant
19. januar 2006 - 15:14 #3
Ang. 2'eren, hvis du lader det gå igennem et script, f.eks. download.php?fil=sti/til/fil.doc

Så kan download.php være:

header( 'Cache-Control: no-cache, must-revalidate' );
header( 'Pragma: no-cache' );
header( 'Last-Modified: ' . gmdate('D, dMYH:i:s') . ' GMT' );
header( 'Content-Type: application/octet-stream' );
header( 'Content-Disposition: inline; filename="' . basename( $_GET['fil'] ) . '"' );
header( 'Content-Length: ' . filesize( $_GET['fil'] ) );
readfile( $_GET['fil'] );
Avatar billede lsskaarup Nybegynder
19. januar 2006 - 16:03 #4
Kigger på det i morgen
Avatar billede lsskaarup Nybegynder
30. januar 2006 - 11:18 #5
Damm, hvorfor fa.... bliver nogle af ens indlæg ikke lagt op. Nu havde jeg lige skrevet en smøre om status på problemet, men nu må jeg i gang igen, fik ikke taget en kopi af teksten inden jeg trykte send :-(

Desværre får du heller ikke så lang en forklaring igen, coderdk.

1)
Mapper og filer er sorteret, og jeg sørger selv får at hiver mapperne ud før filerne.

2)
Filen bliver ikke åbnet i et nyt vindue. Dette er tvingende nødvendigt, da "stifinderen" ikke er større end ca. 3 x 7 cm. Ikke meget til en Word fil ;-). Som følge af det lille vindue, kan jeg heller ikke se om filen bliver åbnet direkte i programmet, da jeg ingen værkstøjslinier eller menuer kan se.
Avatar billede lsskaarup Nybegynder
30. januar 2006 - 11:23 #6
Hmm, vist jeg sætte target="blank", på mit link, så får jeg den selvfølgelig i et nyt vindue, men kan her se, at der ingen forskel, er fra tidligere. Altså bliver filen åbnet i Word gennem Internet Explorer.

Er det fordi jeg bruger at hyperlink, men hvad skal jeg ellers gøre?

Kode:
.
.
.
$files = array();
$dirs = array();
if ( $dh = opendir( $showdir ) ) {
    while ( $fil = readdir( $dh ) ) {
        if ( is_dir( $showdir . '/' . $fil ) && $fil != '.' && $fil != '..' ) {
            $dirs[] = $showdir . '/' . $fil;
              } else if ( !is_dir( $showdir . '/' . $fil ) ) {
                $files[] = $showdir . '/' . $fil;
        }
      }
}

sort( $dirs );
sort( $files );

for($i=0;$i<count($dirs);$i++){
    echo "<a href=\"".$dirs[$i]."\"> <img src=\"/gfx/mappe.gif\" width=\"18\" border=\"0\"> ".basename($dirs[$i])." </a><br>";
}




for($i=0;$i<count($files);$i++){
                    $tmp=explode( '.', basename($files[$i]) );
                    if($tmp[1] == "rtf" || $tmp[1] == "doc") {
                        $ikon="/gfx/ikon_word.gif";
                    } else if($tmp[1] == "xls") {
                        $ikon="/gfx/ikon_excel.gif";
                    } else if($tmp[1] == "pdf") {
                        $ikon="/gfx/ikon_pdf.gif";
                    } else {
                        $ikon="/gfx/ikon_fil.gif";
                    }
    echo "<a target=\"_blank\" href=\"download.php?fil=".$files[$i]."\"> <img src=\".$ikon.\" width=\"18\" border=\"0\"> ".basename($files[$i])." </a><br>";
}
}
?>
Avatar billede lsskaarup Nybegynder
30. januar 2006 - 13:10 #7
Har ændret linket til undermapperne, da jeg så, at jeg ikke kom ned i dem.

for($i=0;$i<count($dirs);$i++){
    echo "<a href=\"stifinder.php?root=$root&dir=".$dir."/".basename($dirs[$i])."\"> <img src=\"/gfx/mappe.gif\" width=\"18\" border=\"0\"> ".basename($dirs[$i])." </a><br>";
}
Avatar billede lsskaarup Nybegynder
30. januar 2006 - 13:29 #8
Men hensyn til at få filerne åbne direkte i deres respektive program, så synes jeg ikke at kunne finde noget om det her på E!. Men enkelte indlæg, siger at man må konfigurerer de enkelte maskiner individuelt, hvor skal man gør dette, for at få den til at åbne filerne?
Avatar billede lsskaarup Nybegynder
13. februar 2006 - 15:37 #9
coderdk -> Er du røget i svinget?
Avatar billede coderdk Praktikant
13. februar 2006 - 16:56 #10
Der har været noget mail fuckup på min server i forb. med noget DNS hosting...
Du kan lade download.php bruge application/octet-stream - så skulle browseren gerne komme og spørge hvad du vil gøre med den...
Avatar billede lsskaarup Nybegynder
23. marts 2006 - 10:36 #11
Nå, det er vist gået i stå her.

Status:
Mappe og filer bliver sorteret med mapper øverst.
Filer kan endnu ikke åbnes i deres direkte tilhørende program.

Coderdk -> gider du ligge et svar?
Avatar billede coderdk Praktikant
23. marts 2006 - 14:28 #12
Filerne kan kun tvinges til ikke at åbnes i IE...

Håber det kunne bruges, det hele :)
Avatar billede lsskaarup Nybegynder
24. marts 2006 - 08:05 #13
Ja, det tænkte jeg nok, men måske hvad der et klogt hoved som lige havde en eller ander mærkelig hack, som kunne gøre det.

Men hvorfor kan man egentlig så følgende:
Filen, f.eks. .doc, bliver åbnet gennem IE og i en "lite" udgave af word. Hvis man så i adresselinien ændre bare et / til et \, så bliver filen åbnet korrekt, altså i fuldt funktionelt program?
Avatar billede lsskaarup Nybegynder
30. marts 2006 - 10:04 #14
Jeg har lige et tillægsspørgsmål til åbningen af filerne, hvis det kan lade sig gøre :)

Jeg riser lige de 2 situationer (før, nu) op.

Før:
Filerne blev åbnet via IE i deres tilhørende program. Når brugerne så ændrede et eller andet, og ville gemme, så vidste Windows hvor i filsystemet filen lå, så den blev overskrevet.

Nu:
Åbner brugerne filen, igen via IE, og vil gemme den. Så ved Windows ikke hvor den skal gemme henne og vælge C-drevet. Det betyder at brugeren skal langt ned i filsystemet for at gemme dokumentet, og det holder ikke.

Kan det ændres på en eller anden måde, så Windows ved hvilken mappe filen kommer fra?
Avatar billede lsskaarup Nybegynder
30. marts 2006 - 10:48 #15
Jeg fandt selv ud af det, fjernede referencen til download.php, og sagde at det var en fil der skulle åbnes, så hjalp det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester