PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [HTML/PHP]Verschiedene Dokumenttypen abwechselnd anzeigen lassen (Diashow-like)


Popopinsel
2009-03-31, 08:37:54
Hallo zusammen,

ich möchte auf einer Webseite einen Frame haben, in dem der Inhalt eines Ordners (verschiedene Dokumenttypen wie .doc, .xls oder .pdf) in Form einer Diashow oder Präsentation, also sich in gewissen Zeitabständen abwechselnd, dargestellt wird.

Falls das mit dem Mix aus verschiedenen Dokumenttypen nicht machbar ist, kann ich auch dafür sorgen, dass es sich z.B. nur um .xls oder .pdf-Daten handelt.

Könnt ihr mir sagen wie ich das machen muss? Danke! =)

Kinman
2009-03-31, 08:44:44
Kannst Du Javascript verwenden?

Popopinsel
2009-03-31, 08:56:53
Kannst Du Javascript verwenden?

Ob ich der Sprache mächtig bin oder ob ich sie verwenden darf? Denn verwenden darf ich sie und die Browser/Systeme sind auch zum Anzeigen fähig.

Ich hab schon das ein ums andere mal JS benutzt, jedoch sehr selten für Webseiten und dort bisher auch nur auf fertige Lösungen zurückgegriffen. Aber wenn Du mir ein paar Anhaltspunkte geben könntest, weiß ich, wo ich anfangen und in welche Richtung ich mich bewegen muss.

Edit: Zu erwähnen sei noch, dass ich die Dateinamen der Dokumente nicht kenne, da sich der Inhalt des Ordners ständig ändert. Es muss also automatisch immer der gesamte Inhalt angezeigt werden, ohne die Dateinamen fest im Quellcode zu verankern.

Kinman
2009-03-31, 09:43:18
PHP Funktionen zum auslesen einen Verzeichnisses

define (BASEPATH, 'fileshow'); //Pfad zur PHP-Datei von Document Root aus

//=== Adds a slash at the end if nessercery ===
function addSlash($str)
{
if (substr($str, -1, 1) != '/') $str .= '/';
return $str;
}


function getFilesFromDir($path, $subdirs = false, $extension = '', $files = NULL)
{
$path = $_SERVER['DOCUMENT_ROOT'] . '/' . BASEPATH . '/' . addSlash($path);
$hndDir = opendir($path);

if ($extension != '')
{
$arrExtension = explode(';', $extension);
$checkExtension = true;
}
else $checkExtension = false;

$files = array();

while (false !== ($file = readdir($hndDir)))
{
if (is_file($path . $file))
{
if (!$checkExtension) array_push($files, $file);
else
{
foreach($arrExtension as $ext)
{
if (substr($file, -strlen($ext)) == $ext)
{
array_push($files, $path . $file);
break;
}
}
}
}

}

sort($files, SORT_STRING);

closedir($hndDir);
return $files;
}

$files = getFilesFromDir('files');




Der Rest

<?php $files = getFilesFromDir('files'); ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />

<title>Frame-Fileshow</title>
</head>

<body>
<script type="text/javascript">
//<!--
files = new Array();
<?php foreach ($files as $index => $file) echo("files[$index] = 'files/$file';\n"); ?>

function getRandomFile(files)
{
alert(files[Math.floor(Math.random() * files.length)]);
}
window.setInterval("getRandomFile(files)", 3000);
//-->
</script>

</body>
</html>



Anstelle Alert setzt Du eine Funktion, die den Inhalt des Frames ändert.

mfg Kinman

EDIT: Es würde auch ohne Javascript gehen. Du müsstest nur per PHP die Datei per Zufall wählen und dann die Seite neu laden. Die eigentlich Datei muss dann allerdings wieder in einen iFrame angezeigt werden, da sonst das autom. Neuladen nicht mehr funktioniert. Wäre so oder so die elegantere Lösung

Popopinsel
2009-03-31, 10:00:43
PHP Funktionen zum auslesen einen Verzeichnisses

define (BASEPATH, 'fileshow'); //Pfad zur PHP-Datei von Document Root aus

//=== Adds a slash at the end if nessercery ===
function addSlash($str)
{
if (substr($str, -1, 1) != '/') $str .= '/';
return $str;
}


function getFilesFromDir($path, $subdirs = false, $extension = '', $files = NULL)
{
$path = $_SERVER['DOCUMENT_ROOT'] . '/' . BASEPATH . '/' . addSlash($path);
$hndDir = opendir($path);

if ($extension != '')
{
$arrExtension = explode(';', $extension);
$checkExtension = true;
}
else $checkExtension = false;

$files = array();

while (false !== ($file = readdir($hndDir)))
{
if (is_file($path . $file))
{
if (!$checkExtension) array_push($files, $file);
else
{
foreach($arrExtension as $ext)
{
if (substr($file, -strlen($ext)) == $ext)
{
array_push($files, $path . $file);
break;
}
}
}
}

}

sort($files, SORT_STRING);

closedir($hndDir);
return $files;
}

$files = getFilesFromDir('files');




Der Rest

<?php $files = getFilesFromDir('files'); ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />

<title>Frame-Fileshow</title>
</head>

<body>
<script type="text/javascript">
//<!--
files = new Array();
<?php foreach ($files as $index => $file) echo("files[$index] = 'files/$file';\n"); ?>

function getRandomFile(files)
{
alert(files[Math.floor(Math.random() * files.length)]);
}
window.setInterval("getRandomFile(files)", 3000);
//-->
</script>

</body>
</html>



Anstelle Alert setzt Du eine Funktion, die den Inhalt des Frames ändert.

mfg Kinman

EDIT: Es würde auch ohne Javascript gehen. Du müsstest nur per PHP die Datei per Zufall wählen und dann die Seite neu laden. Die eigentlich Datei muss dann allerdings wieder in einen iFrame angezeigt werden, da sonst das autom. Neuladen nicht mehr funktioniert. Wäre so oder so die elegantere Lösung

Das hört sich super, tausend Dank! =) Ich werd mir das jetzt mal in Ruhe anschauen und mir eine Lösung in PHP mit dem iframe überlegen, das würde dann auch prima in meinen bestehenden Code passen. Muss dazu nur mal googeln, wie ich Dateien per Zufall auswählen kann...

Kinman
2009-03-31, 10:10:10
Auf das vorherige Bsp. bezogen:


$file = $files[rand(0, count($files) - 1)];

Popopinsel
2009-03-31, 10:58:08
Auf das vorherige Bsp. bezogen:


$file = $files[rand(0, count($files) - 1)];


Das klappt schonmal wunderbar! Allerdings habe ich noch einige Probleme:

1. Der FireFox zeigt das Bild nicht an, selbst wenn ich das Bild mit Pfad fest ins <img>-Tag code. Der IE 7 hingegen zeigt das Bild auch, auch mit dem Zufallsgenerator. Woran liegts?

2. Eigentlich möchte ich ja keinen Zufall in der Reihenfolge haben. Am liebsten wäre mir eine alphabetische Reihenfolge, nach der die Dokumente angezeigt werden! Außerdem hab ich mit Zufalls das Problem, dass das selbe Bild manchmal öfters hintereinander angezeigt wird...

3. Kann ich in einem iframe überhaupt Dokumente verschiedenen Formats anzeigen?

Kinman
2009-03-31, 11:09:48
Das klappt schonmal wunderbar! Allerdings habe ich noch einige Probleme:

1. Der FireFox zeigt das Bild nicht an, selbst wenn ich das Bild mit Pfad fest ins <img>-Tag code. Der IE 7 hingegen zeigt das Bild auch, auch mit dem Zufallsgenerator. Woran liegts?

2. Eigentlich möchte ich ja keinen Zufall in der Reihenfolge haben. Am liebsten wäre mir eine alphabetische Reihenfolge, nach der die Dokumente angezeigt werden! Außerdem hab ich mit Zufalls das Problem, dass das selbe Bild manchmal öfters hintereinander angezeigt wird...

3. Kann ich in einem iframe überhaupt Dokumente verschiedenen Formats anzeigen?

1. Groß-/Kleinschreibung, Umlaute?
2. Einfach bei 0 anfangen und den Wert für den Index erhöhen. Ist der Wert größer als "Anzahl der Elemente" - 1 (count() Funktion), dann wieder bei 0 beginnen.
3. Keine Ahnung und vermutlich von Browsereinstellungen abhängig.

mfg Kinman

Popopinsel
2009-03-31, 11:51:35
1. Groß-/Kleinschreibung, Umlaute?
2. Einfach bei 0 anfangen und den Wert für den Index erhöhen. Ist der Wert größer als "Anzahl der Elemente" - 1 (count() Funktion), dann wieder bei 0 beginnen.
3. Keine Ahnung und vermutlich von Browsereinstellungen abhängig.

mfg Kinman

Ok, also das versteh ich nun wiederum nicht... :redface: Also ich versteh den Ablauf dieser Schleife schon, ich hab nur keine Ahnung, wo und wie ich diese Schleife einbaue. :confused:

Kinman
2009-03-31, 12:02:38
<?php
$files = getFilesFromDir(..);

//Aktuellen Index auslesen / bestimmen
$num = $_REQUEST['num'];
if (!is_numeric($num)) $num = 0;

//Arraygrenzen prüfen
if ($num > count($files) - 1) $num = 0;
if ($num < 0) $num = count($files); //Sollte es auch rückwärts gehen

$file = $files['num'];
?>

<html>
...
<!-- Inhalt anzeigen -->
<iframe src="<?php echo($file); ?>" ... />

<!-- Weiterleitung auf die nächste Datei -->
<meta http-equiv="refresh" content="5; URL=<?php echo(PHP_SELF); ?>?num=<?php echo($num + 1); ?>">


Die Zahl bei der Weiterleitung sind die Sekunden bis zum Wechsel.

Popopinsel
2009-03-31, 12:54:11
Leider hab ichs noch nicht ganz hinbekommen... Also der Frame aktualisiert sich schonmal korrekt, nur ist das <iframe src = ""> leer, also liefert $file kein Ergebnis. Und $num wird immer nur mit 1 übergeben. Woran liegt es?

Hier meine test.php:

<?php

function getFilesFromDir($path, $subdirs = false, $extension = '', $files = NULL)
{
$path = 'C:/images/';
$hndDir = opendir($path);

if ($extension != '')
{
$arrExtension = explode(';', $extension);
$checkExtension = true;
}

else $checkExtension = false;

$files = array();

while (false !== ($file = readdir($hndDir)))
{
if (is_file($path . $file))
{
if (!$checkExtension) array_push($files, $file);

else
{
foreach($arrExtension as $ext)
{
if (substr($file, -strlen($ext)) == $ext)
{
array_push($files, $path . $file);
break;
}
}
}
}
}

sort($files, SORT_STRING);

closedir($hndDir);
return $files;
}

$files = getFilesFromDir('files');

//Aktuellen Index auslesen / bestimmen
$num = $_REQUEST['num'];

if (!is_numeric($num)) $num = 0;

//Arraygrenzen prüfen
if ($num > count($files) - 1) $num = 0;
if ($num < 0) $num = count($files); //Sollte es auch rückwärts gehen

$file = $files['num'];


?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="refresh" content="5; URL= test.php?num=<?php echo($num + 1); ?>">
<title>Test</title>
</head>
<body>
<iframe src = "<?php echo($file); ?>" width="100%" height="950" frameborder="0" align="center" scrolling="no">
</iframe>
</body>
</html>