Pages :
Bonjours à tous Smiley biggrin

Après avoir souvent parcouru ce forum où j'ai souvent trouvé des éléments de réponse à mes questions, je vous en pose une nouvelle ...

J'ai un album en flash, avec un fichier xml qui contient les infos pour les photos (ci-dessous). Mais le flash, deviens vite lourd, surtout que j'atteinds les 300 photos ... je voudrais donc refaire une version en php, tout en me servant de ce fichier xml, ce qui est bien pratique.
En fait, j'aimerais que 25 photos s'affiche dans un tableau en 5x5 par exemple, puis quand on clique sur une photo, elle s'affiche dans la meme fenetre, à côté... ça je sais faire, mais c'est simplement, l'utilisation du fichier xml, qui me pose probléme, ainsi que l'affichage 25 par 25 des photos, avec des flèches pour voir les photos suivantes ou précédentes...
J'ai fait déjà pas mal d'essai avant de vous déranger... mais je n'y arrive pas ...

Donc merci d'avance pour votre aide qui me sera ci précieuse !

Voici le code type de la liste des photos en xml :
<?xml version="1.0" encoding="UTF-8" ?>
<SIMPLEVIEWER_DATA maxImageDimension="552" textColor="0xffffff" frameColor="0x555555" bgColor="0x000000" frameWidth="1" stagePadding="35" thumbnailColumns="5" thumbnailRows="5" navPosition="left" navDirection="LTR" title="" imagePath="images/" thumbPath="thumbs/">
<IMAGE><NAME>0002.jpg</NAME><CAPTION></CAPTION></IMAGE>
<IMAGE><NAME>0001.jpg</NAME><CAPTION></CAPTION></IMAGE>
</SIMPLEVIEWER_DATA>

Modifié par azhdar (07 May 2006 - 11:45)
Slt,

quelles technololgies utilises tu ?
Xslt, DOMXML (php4), DOM (php5) ?
As tu des connaissances en Xslt, DOM ?

a+
Voici les connaissances en programmation qui peuvent m'être utile pour cela je pense : html, php (ça dépend...), css 2, et un début en xml et xls ...
Smiley cligne

mais si tu veux utiliser d'autres langage, n'hesite pas, ça me fera apprendre
Modifié par azhdar (30 Apr 2006 - 17:32)
En xslt ça doit être un début Smiley cligne
Mais en fait j'aurais aimé savoir avec quelle version tu travailles car avec PHP5, les fonctions DOM qui permettent de manipuler des documents XML est incluse dans le coeur du langage. DOM est une API que tu as peut être déjà utilisé en javascript.

a+
Ce sera un script qui sera héberger sur free, mais je l'utiliserais certainement sur mon autre hebergeur 1&1.
La version du php dans les 2 cas est : PHP Version 4.4.2
(PHP Version 4.3.10 pour free)



(J'avais bien compris Smiley cligne ! )
Re,

tu peux avoir PHP5 sur les serveurs Free, soit en ajoutant l'extension .php5 à tes fichiers ou en écrivant "PHP 1" dans un .htaccess dans le dossier dont tu veux faire passer php à la version 5.
Renseigne toi pour voir si c'est aussi possible chez 1&1 parcequ'en php4, tu as pour manipuler des fichiers XML l'extension DOMXML, dépassée, et l'extension Xslt Sablotron pour faire des transformations Xslt, et cette extension n'est pas très performante par rapport à l'extension XSL de PHP5 basée sur libxslt.

Bref, si tu passes à PHP5, je pourrais t'aider, sinon... Smiley confus

a+
Et bien parfait !
Je viens de vérifier, sur 1&1 : Scripting PHP3, PHP4, PHP5
et sur free, avec ta méthode, ça ira... Smiley biggrin

[Edit]

Voila ! j'ai mis le .htaccess dans le répertoire
Modifié par azhdar (30 Apr 2006 - 21:40)
Parfait !

Maintenant tu peux à ta guise utiliser les fonctions DOM.
DOM est une API, c'est à dire une interface de programmation. C'est un standard du W3C qui permet de représenter un document XML comme un arbre et d'accéder à tous ses noeuds (attributs, éléments, commentaires, processing-instruction, etc) grâce à des fonctions prédéfinies. Tu peux utiliser DOM avec php5, javascript, python, etc etc ce seront toujours les mêmes fonctions. Donc si tu n'auras pas besoin de réapprendre d'autres API quand tu changera de langage de programmation.
Voilà pour la présentation ^^

Maintenant voici le lien vers la documentation PHP5 des fonctions DOM, à mettre de préférences dans les favoris.

Après, pour apprendre DOM je ne connais pas de bonne ressource sur le web, j'espère que les membres du forum pourront t'aider sur ce sujet. Perso, j'ai appris DOM dans PHP5 Référence de Micro App.

Voici comment je coderais ton système de photos :

<?php

/* début du code de la page */

/* on crée un objet DOMDocument puis on récupère le fichier XML */
$photos = new DOMDocument;
$photos->load('http://adresse.de/mon/fichier.xml');

/* on compte le nombre de photos grâce à une requête XPath 
 http://fr3.php.net/manual/fr/function.dom-domxpath-evaluate.php  */
$XPath = new DOMXpath($photos);
$nombreDePhotos = $XPath->evaluate('count(/SIMPLEVIEWER_DATA/IMAGE)');


echo '<table id="photos">';

/* et après on boucle */
for($i=0;$i<=ceil($nombreDePhotos/5);$i++)
{
echo '<tr>';

for($j=1;$j<=5;$j++)
{
$numeroPhoto = $i*5+$j;
// on vérifie qu'on ne dépasse pas le nombre de photos présentes dans le fichier
if($numeroPhoto <= $nombreDePhotos)
{
echo '<td><img src="';
echo $photos->getElementsByTagName('IMAGE')->item($numeroPhoto)->textContent;
echo '" alt="';
echo $photos->getElementsByTagName('CAPTION')->item($numeroPhoto)->textContent;
echo '"/></td>';
}
}
echo '</tr>';
}

echo '</table>';

/* fin du code */
?>


Bon c'est quand même plus propre quand c'est fait avec Xslt, si tu as des notions dans ce langage, tu peux t'en sortir avec les modulos.
Dans cet exemple, tout est affiché mais faire un système de pagination ça doit vraiment pas être compliqué, d'autant plus qu'on peut passer des paramêtres à une feuille de style Xslt avec l'extension XSL.

Quant à ceci :
$photos->getElementsByTagName('IMAGE')->item($numeroPhoto)->textContent;

signifie :
dans le document XML $photos, je veux une liste de tous les éléments qui s'appellent IMAGE, ce qui me donne une DOMNodeList (une liste de noeuds dans l'ordre d'apparition dans le document) que je parcours en utilisant un indice (item(n)) et dont je prends le texte (textContent).

Voilà si tu as d'autre question... Smiley lol

a+
Et bien.. merci bcp !!!! et je vais acheter le livre que tu me recommandes Smiley cligne pout quand j'aurais plus de temps Smiley biggrin

Merci encore pour toutes ces explications !

Voici l'erreur qui m'est retourné :


Parse error: parse error, unexpected T_OBJECT_OPERATOR, expecting ',' or ';' in /var/www/sdc/8/0/lulusurf/ptbum5/xml.php on line 57


Ligne 57 :
echo $photos->getElementsByTagName('IMAGE')->item($numeroPhoto)->textContent;


Mais j'ai pas compris pourquoi ... décidément ... ce script remet enquestion mes connaissances... Smiley rolleyes

[Edit]

Et je pensais... comment faire pour permettre de voir les photos suivantes ?
Modifié par azhdar (01 May 2006 - 12:36)
salut
en php5 tu a plusieur solution
la plus simple c'est l'utilisation simple xml, tu accede a un fichier xml comme a un tableau
la deuxieme est l'utilisation de xsl (tres simple si tu connais un peut les feuilles de style xslt)
et la solution dom

tout est sur
Slt, merci de participer aussi Smiley biggrin

Et aurais tu une solution à mon probléme, autre que celle de SirWam, ou une simplification à apporté ?

Car, je me suis bien sur penché sur le lien que tu me donnes ... mais il faut déjà assez bien savoir en faire pour utiliser ce manuel il me semble... Smiley confus
Modifié par azhdar (01 May 2006 - 12:40)
avec simplexml ca devrai donné queleque chose comme ca
<?php 
$xml = simplexml_load_file('adresse.de/mon/fichier.xml');
echo '<table>';
foreach ( $xml->SIMPLEVIEWER_DATA as $val){
	echo '<tr><td><img src="'.$val->IMAGE->NAME.'" /></td></tr>';
}
echo '</table>';
?>


et avce xsl
<?php
$xslt = new XSLTProcessor();
$xslt->importStylesheet(DOMdocument::load('mafeuilledestyle.xsl'));
$document = $xslt->transformToDoc(DOMDocument::load('adresse.de/mon/fichier.xml'));
echo $document;
?>

Modifié par jeff (01 May 2006 - 13:38)
alors ... j'a testé, et voila ce que me donne la méthode avec simplexml

Fatal error: Call to undefined function: simplexml_load_file() in /var/www/sdc/8/0/lulusurf/ptbum5/xml2.php on line 3

line 3:
$xml = simplexml_load_file(imageData.xml);


Il ne dois donc pas avoir simplexml sur free... j'ai pas testé sur 1&1


et pour l'autre, je ne sais pas faire le fichier xsl nécessaire
Modifié par azhdar (01 May 2006 - 13:28)
etonnat car simplexml est bien dispo chez free
tu a bien mis l'extention .php5 a ton fichier
azhdar a écrit :
Et bien.. merci bcp !!!! et je vais acheter le livre que tu me recommandes Smiley cligne pout quand j'aurais plus de temps Smiley biggrin

Merci encore pour toutes ces explications !

Voici l'erreur qui m'est retourné :


Parse error: parse error, unexpected T_OBJECT_OPERATOR, expecting ',' or ';' in /var/www/sdc/8/0/lulusurf/ptbum5/xml.php on line 57


Ligne 57 :
echo $photos->getElementsByTagName('IMAGE')->item($numeroPhoto)->textContent;


Mais j'ai pas compris pourquoi ... décidément ... ce script remet enquestion mes connaissances... Smiley rolleyes

[Edit]

Et je pensais... comment faire pour permettre de voir les photos suivantes ?



Re,

essaye avec firstChild, firstChild() et textContent() à la place de textContent.

Pour le livre, bon il est quand même gros (1200 pages) et un peu cher je crois... Smiley langue

Sinon, pour les photos suivantes, système de pagination comme pour un système de news par exemple :
variable dans l'url qu'on récupère ($_GET['nmpage'])
si elle n'existe pas on affiche les 25 premières photos
sinon si on a la page 2 par exemple, on affiche de 26 à 50, page 3 : 51 à 75 etc etc
et on écirt les liens :
echo '<a href="xml.php?nmpage='.$pagenm.'">Aller à la page '.$pagenm.'</a>';
bien sûr en bouclant pour avoir toutes les pages.

Sinon, la solution simplexml peut aussi être sympa, mais la je ne connais pas et en fin de compte, vu que je connais DOM, je trouve ça plus compliqué (puisqu'on doit apprendre une nouvelle API) mais ça n'est pas ton cas. Bref comme tu le vois les solutions pour lire un document XML sont multiples, bien qu'un peu difficiles à appréhender au début Smiley lol

a+
jeff>> tout à fait, j'avais oublié ... mais finalement j'ai laissé en .php, mais en utilisant un .htaccess avec dedans
php 1


Voila erreur que ca me donne :

Warning: simplexml_load_file() [function.simplexml-load-file]: Unable to access /etc/xml/catalog in /var/www/sdc/8/0/lulusurf/ptbum5/xml2.php on line 3

Warning: I/O warning : failed to load external entity "imageDataxml" in /var/www/sdc/8/0/lulusurf/ptbum5/xml2.php on line 3

Warning: Invalid argument supplied for foreach() in /var/www/sdc/8/0/lulusurf/ptbum5/xml2.php on line 7


et voici le code :
<?php 

$xml = simplexml_load_file(imageData.xml);

echo '<table>';

foreach ( $xml->SIMPLEVIEWER_DATA as $val){

	echo '<tr><td><img src="'.$val->IMAGE->NAME.'" /></td></tr>';

}

echo '</table>';

?>



SirWam>>désolé... je n'ai pas trop bien compris ou mettre le firstChild()

mais j'ai bien rajouté les () à textContent, mais maintenant, il me retourne :
Fatal error: Call to undefined method DOMXPath::evaluate() in /var/www/sdc/8/0/lulusurf/ptbum5/xml1.php on line 23


ligne 23:
$nombreDePhotos = $XPath->evaluate('count(/SIMPLEVIEWER_DATA/IMAGE)');


Smiley biggrin Merci encore pour votre aide à tous les deux !
Modifié par azhdar (01 May 2006 - 14:37)
Ok donc là ça signifie que le support de XPath n'est pas activé, mais pas de problème tu as DOM, même si c'est un peu plus long.

Donc pour compter le nombre d'éléments tu fais plutôt :
$nombreDePhotos = $photos->getElementsByTagName('IMAGE')->length();


ce qui donne au final :
<?php



/* début du code de la page */



/* on crée un objet DOMDocument puis on récupère le fichier XML */

$photos = new DOMDocument;

$photos->load('http://adresse.de/mon/fichier.xml');



/* on compte le nombre de photos grâce à une requête XPath 

  http://fr3.php.net/manual/fr/function.dom-domxpath-evaluate.php   */
$nombreDePhotos = $photos->getElementsByTagName('IMAGE')->length();





echo '<table id="photos">';



/* et après on boucle */

for($i=0;$i<=ceil($nombreDePhotos/5);$i++)

{

echo '<tr>';



for($j=1;$j<=5;$j++)

{

$numeroPhoto = $i*5+$j;

// on vérifie qu'on ne dépasse pas le nombre de photos présentes dans le fichier

if($numeroPhoto <= $nombreDePhotos)

{

echo '<td><img src="';

echo $photos->getElementsByTagName('IMAGE')->item($numeroPhoto)->textContent();

echo '" alt="';

echo $photos->getElementsByTagName('CAPTION')->item($numeroPhoto)->textContent();

echo '"/></td>';

}

}

echo '</tr>';

}



echo '</table>';



/* fin du code */

?>


En gros, la méthode getElementsByTagName renvoie un objet DOMNodeList qui a une propriété, length qui renvoit la taille de cette liste de noeuds, et une méthode, item(indice n) qui renvoie le noeud de l'indice n.

Voilà a+
Modifié par SirWam (01 May 2006 - 16:09)
C'est vraiment gentil de prendre tout ce temps pour moi.

Voila ce que ça renvoit :
Fatal error: Call to undefined method DOMNodeList::length() in /var/www/sdc/8/0/lulusurf/ptbum5/xml5.php on line 24



Mais j'ai également continué à chercher .... et à trouver ... :
<?php
$xmlstr = <<<XML
<?xml version="1.0" encoding="UTF-8" ?>
	<SIMPLEVIEWER_DATA>
		<IMAGE><NAME>0002.jpg</NAME><CAPTION></CAPTION></IMAGE>
		<IMAGE><NAME>0001.jpg</NAME><CAPTION></CAPTION></IMAGE>
	</SIMPLEVIEWER_DATA>
XML;

$xml = simplexml_load_string($xmlstr);

echo '<table id="photos"><tr>';

foreach ($xml->IMAGE as $movie) {
   echo '<td><img src="thumbs/';
   echo $movie->NAME, '"/></td>';
}
echo '</tr></table>';

?> 


le seul problème, c'est que j'ai pas encore réussit à faire un tableau comme je le voulais au début, et également à appeler le fichier imageData.xml, au lieu de l'inclure ... ni à faire pour n'avoir que les photos 25 par 25, avec les liens pour continuer ... mais je crois que leplus gros est fait ... !!
Et voila avec le lien externe
if (file_exists('imageData.xml')) {
   $xml = simplexml_load_file('imageData.xml');
echo '<table id="photos"><tr>';

foreach ($xml->IMAGE as $image) {
   echo '<td><img src="thumbs/';
   echo $image->NAME, '"/></td>';
}
echo '</tr></table>';

} else {
   exit('Echec lors de l\'ouverture du fichier.');
}

Modifié par azhdar (01 May 2006 - 16:39)
Bon ben tu as l'air de vouloir faire ça avec simpleXML alors bonne chance Smiley smile

a+

EDIT : heu sinon essaye ça :
<?php







/* début du code de la page */







/* on crée un objet DOMDocument puis on récupère le fichier XML */



$photos = new DOMDocument;



$photos->load('http://adresse.de/mon/fichier.xml');







/* on compte le nombre de photos grâce à une requête XPath 



   http://fr3.php.net/manual/fr/function.dom-domxpath-evaluate.php    */

$nombreDePhotos = $photos->getElementsByTagName('IMAGE')->length;











echo '<table id="photos">';







/* et après on boucle */



for($i=0;$i<=ceil($nombreDePhotos/5);$i++)



{



echo '<tr>';







for($j=1;$j<=5;$j++)



{



$numeroPhoto = $i*5+$j;



// on vérifie qu'on ne dépasse pas le nombre de photos présentes dans le fichier



if($numeroPhoto <= $nombreDePhotos)



{



echo '<td><img src="';



echo $photos->getElementsByTagName('IMAGE')->item($numeroPhoto)->textContent();



echo '" alt="';



echo $photos->getElementsByTagName('CAPTION')->item($numeroPhoto)->textContent();



echo '"/></td>';



}



}



echo '</tr>';



}







echo '</table>';







/* fin du code */



?>

Modifié par SirWam (01 May 2006 - 16:53)
Pages :