Dir structuur met PHP naar XML files.....
Ik wil een gallery maken in flash (AS3) die categorien kan bevatten zonder met de hand steeds de XML's te genereren (flash mag nu eenmaal zelf niet op de server zoeken).
Ik heb een stapel scripts gevonden die netjes de files in een directory leest en in XML zet, maar ik snap PHP niet. (en er volledig in duiken heb ik denk ik niet nodig).
Ik heb deze scripts:
discover.php:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
include_once("imageHandler.php");
$tm=new imageHandler();
$data=$tm->getImageList("./");
print_r($tm->ary2xml($data,0,'',"images.xml"));
?>
include_once("imageHandler.php");
$tm=new imageHandler();
$data=$tm->getImageList("./");
print_r($tm->ary2xml($data,0,'',"images.xml"));
?>
en
imageHandler.php:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
class imageHandler {
public function getImageList($path="img") {
if(file_exists($path))
{
$i1="jpg";
$i2="png";
$i3="jpeg";
foreach(array_diff(scandir($path),array('.','..')) as $f) {
if(is_file($path.'/'.$f) && (($i1)?ereg($i1.'$',$f):1) || (($i2)?ereg($i2.'$',$f):1) || (($i3)?ereg($i3.'$',$f):1) ) $l[]=$f;
}
return $l;
}
else return "Path do not Exists!";
}
public function ary2xml($arr, $d=0, $forcetag='', $file_name='') {
$data="<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n";
$data.="<images>\r\n";
for($h=0; $h<count($arr); $h++) {
$data.="<image nameI=\"".$arr[$h]."\" thumb=\"".$arr[$h]."\" />\r\n";
}
$data.="</images>";
if($file_name!='') {
@unlink($file_name);
$myFile = $file_name;
$fh = fopen($myFile, 'w');
fwrite($fh, $data);
fclose($fh);
return $file_name;
}
else return $data;
}
}
?>
class imageHandler {
public function getImageList($path="img") {
if(file_exists($path))
{
$i1="jpg";
$i2="png";
$i3="jpeg";
foreach(array_diff(scandir($path),array('.','..')) as $f) {
if(is_file($path.'/'.$f) && (($i1)?ereg($i1.'$',$f):1) || (($i2)?ereg($i2.'$',$f):1) || (($i3)?ereg($i3.'$',$f):1) ) $l[]=$f;
}
return $l;
}
else return "Path do not Exists!";
}
public function ary2xml($arr, $d=0, $forcetag='', $file_name='') {
$data="<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n";
$data.="<images>\r\n";
for($h=0; $h<count($arr); $h++) {
$data.="<image nameI=\"".$arr[$h]."\" thumb=\"".$arr[$h]."\" />\r\n";
}
$data.="</images>";
if($file_name!='') {
@unlink($file_name);
$myFile = $file_name;
$fh = fopen($myFile, 'w');
fwrite($fh, $data);
fclose($fh);
return $file_name;
}
else return $data;
}
}
?>
Deze geven als resultaat een XML file die er zo uit ziet:
images.xml:
<images>
<image nameI="bolnacht.jpg" thumb="bolnacht.jpg" />
<image nameI="bolrotterdam.jpg" thumb="bolrotterdam.jpg" />
<image nameI="bolsurfplas.jpg" thumb="bolsurfplas.jpg" />
<image nameI="bolwillemsbrug.jpg" thumb="bolwillemsbrug.jpg" />
<image nameI="bolwolk.jpg" thumb="bolwolk.jpg" />
<image nameI="bolzeeland.jpg" thumb="bolzeeland.jpg" />
<image nameI="bolzonondergang.jpg" thumb="bolzonondergang.jpg" />
</images>
wat ik nou nodig heb is dat er 2 files gemaakt worden..
De bovenstaande XML in de subdirs en de directories zelf in een aparte XML met daarin de directoy namen
categorie.xml:
<categories>
<category nameI="bolpanoramas" />
<category nameI="dieren" />
<category nameI="vrij werk" />
</categories>
zodat ik dit in flash kan lezen en een directory gestuurde gallery kan maken.
Is er iemand die dit voor me kan doen of iemand die weet waar ik dit kan vinden?
Alvast bedankt,
Willem
Gewijzigd op 03/09/2010 22:01:36 door Willem Schulte
Dus
Dank je voor je snelle reactie.
Ja kan ook, maar ik dacht, omdat het nog al groot wordt allemaal, dat ik niet ALLES hoef te gergenereren als ik een foto toevoeg en het maakt het laten zien van een categorie weer makkelijker, want dan kan ik ALLEs in beeld zetten wat in de images.xml staat...
anders wordt de AS3 weer een stuk ingewikkelder.
denk ik :)
maar dat is ook goed als dat in PHP weer makkelijker is.
Willem
Gewijzigd op 03/09/2010 22:43:00 door Willem Schulte
te simpel?
verkeerd gevraagd?
of nog even wachten? :)
Gewijzigd op 05/09/2010 22:45:20 door Willem Schulte
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
function dirToXml($path)
{
$path = realpath($path);
$doc = new DOMDocument('1.0', 'utf-8');
$categories = $doc->createElement('categories');
$doc->appendChild($categories);
foreach(array_diff(scandir($path), array('..', '.')) as $dirName) {
$dirNode = $doc->createElement('category');
$dirNode->setAttribute('name', $dirName);
$dirPath = $path.DIRECTORY_SEPARATOR.$dirName;
foreach(array_diff(scandir($dirPath), array('..', '.')) as $imageName) {
$imageNode = $doc->createElement('image');
$imageNode->setAttribute('name', $imageName);
$dirNode->appendChild($imageNode);
}
$categories->appendChild($dirNode);
}
return $doc->saveXML();
}
?>
function dirToXml($path)
{
$path = realpath($path);
$doc = new DOMDocument('1.0', 'utf-8');
$categories = $doc->createElement('categories');
$doc->appendChild($categories);
foreach(array_diff(scandir($path), array('..', '.')) as $dirName) {
$dirNode = $doc->createElement('category');
$dirNode->setAttribute('name', $dirName);
$dirPath = $path.DIRECTORY_SEPARATOR.$dirName;
foreach(array_diff(scandir($dirPath), array('..', '.')) as $imageName) {
$imageNode = $doc->createElement('image');
$imageNode->setAttribute('name', $imageName);
$dirNode->appendChild($imageNode);
}
$categories->appendChild($dirNode);
}
return $doc->saveXML();
}
?>
Ongetest en kan dus foutjes bevatten. Hopelijk zijn die er makkelijk uit te halen.
Gewijzigd op 05/09/2010 23:22:32 door Pim -
Hij lijkt he tnog niet te doen, maar ik zal er morgen eens met een frisse blik naar kijken :)
Willem
Code (php)
1
2
2
<?xml version="1.0" encoding="utf-8"?>
<categories><category name="catA"><image name="imgA.txt"/><image name="imgB.txt"/></category><category name="catB"><image name="imgC.txt"/><image name="imgD.txt"/></category></categories>
<categories><category name="catA"><image name="imgA.txt"/><image name="imgB.txt"/></category><category name="catB"><image name="imgC.txt"/><image name="imgD.txt"/></category></categories>
terug, lijkt dus te werken.
Let op dat je het pad goed aangeeft. Beginnen met __DIR__ of bij de server root is het betrouwbaarst.
Dus het gebruik:
Code (php)
Gewijzigd op 06/09/2010 09:53:03 door Pim -
Vergeef me mijn onnozelheid, maar ik weet helemaal niets van PHP.
Dus ik heb geprobeerd jouw eerste code aan te roepen uit een andere file, maar dat kreeg ik niet voor elkaar.
Toen geprobeerd er EEN .php file van te maken, maar zelfde resultaat (met zelfde meldingen).
Laatste stand is deze file:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
header('Content-type: text/xml');
function dirToXml($path)
{
$path = realpath($path);
$doc = new DOMDocument('1.0', 'utf-8');
$categories = $doc->createElement('categories');
$doc->appendChild($categories);
foreach(array_diff(scandir($path), array('..', '.')) as $dirName) {
$dirNode = $doc->createElement('category');
$dirNode->setAttribute('name', $dirName);
$dirPath = $path.DIRECTORY_SEPARATOR.$dirName;
foreach(array_diff(scandir($dirPath), array('..', '.')) as $imageName) {
$imageNode = $doc->createElement('image');
$imageNode->setAttribute('name', $imageName);
$dirNode->appendChild($imageNode);
}
$categories->appendChild($dirNode);
}
return $doc->saveXML();
}
$tm=new dirToXml();
echo dirToXml(__DIR__.'/gal2');
?>
header('Content-type: text/xml');
function dirToXml($path)
{
$path = realpath($path);
$doc = new DOMDocument('1.0', 'utf-8');
$categories = $doc->createElement('categories');
$doc->appendChild($categories);
foreach(array_diff(scandir($path), array('..', '.')) as $dirName) {
$dirNode = $doc->createElement('category');
$dirNode->setAttribute('name', $dirName);
$dirPath = $path.DIRECTORY_SEPARATOR.$dirName;
foreach(array_diff(scandir($dirPath), array('..', '.')) as $imageName) {
$imageNode = $doc->createElement('image');
$imageNode->setAttribute('name', $imageName);
$dirNode->appendChild($imageNode);
}
$categories->appendChild($dirNode);
}
return $doc->saveXML();
}
$tm=new dirToXml();
echo dirToXml(__DIR__.'/gal2');
?>
geeft als resultaat:
The XML page cannot be displayed
Cannot view XML input using XSL style sheet. Please correct the error and then click the Refresh button, or try again later.
--------------------------------------------------------------------------------
Only one top level element is allowed in an XML document. Error processing resource 'http://localhost/gal2/dirtoxml.php'. ...
<b>Fatal error</b>: Class 'dirToXml' not found in <b>D:\xampp\xampp\htdocs\gal2\dirtoxml.php</b> on...
Zit ik nou totaal verkeerd?
Willem