Accueil > > > GALLERIE D'IMAGE CONSTRUITE PAR APPELS RÉCURSIFS DANS UN RÉPERTOIRE
GALLERIE D'IMAGE CONSTRUITE PAR APPELS RÉCURSIFS DANS UN RÉPERTOIRE
Information sur la source
Description
Mise en place d'une méthode de parcours de répertoire par appels récursif permettant la mise en ligne d'une gallerie d'images situées dans un répertoire et ses sous-répertoires. Pour le moment, il n'est implémenté que pour les photos et images. Il est destiné à s'enrichir avec la gestion de différents types de fichiers. La seule chose à faire est la définition de la constante ROOT en début de code pour donner le répertoire de base de parcours et la limite au dessus de laquelle les visiteurs ne pourront pas aller. Update du 01/04/2006 : - Ajout d'une méthode de tri simple sur les sous-répertoires et les fichiers - Ajout d'un méthode de définition de la constante ROOT en fonction de l'utilisateur connecté (id : Apache / Mandriva par htaccess) - Intégration dans une archive ZIP contenant les 2 fichiers PHP et le fichier CSS - Ajout d'un test pour eviter le cross scripting sur le nom du fichier
Source
- //////////////////////////////////////////
- // DEFINITION DU FICHIER PRINCIPAL DEFINEROOTS.INC.PHP
- //////////////////////////////////////////
- <?PHP
-
- //Définition des ROOT par usr
-
- $tbRoots = array('MICHEL' => 'Photos',
- 'VISITEUR' => 'Photos/Divers',
- '' => '');
- ?>
-
- //////////////////////////////////////////
- // DEFINITION DU FICHIER PRINCIPAL INDEX.PHP
- //////////////////////////////////////////
- <?PHP
- /*
- Date : 30/03/2006
- Auteur : The_Legacy
- Description :
- Mise en place d'une méthode de parcours de répertoire par appels récursif
- permettant la mise en ligne d'une gallerie d'images situées dans un répertoire et ses sous-répertoires.
- Pour le moment, il n'est implémenté que pour les photos et images. Il est destiné à s'enrichir
- avec la gestion de différents types de fichiers.
- */
- include_once "defineRoots.inc.php";
- define('ROOT', $tbRoots[strtoupper($_SERVER['PHP_AUTH_USER'])]); //Définition du répertoire à partir duquel on désire travail et corrspond également à la limite haute de l'arborescence
-
- function TableauTrie($tab)
- {
- //Méthode simple du tri par permutation
- $nbElements = count($tab);
- do
- {
- $objTemp = null;
- $idx = 0;
- $permutation = false;
- while ($idx < $nbElements - 1)
- {
- if (strtoupper($tab[$idx]->nom) > strtoupper($tab[$idx + 1]->nom))
- {
- if (!$permutation)
- {
- $permutation = true;
- }
- $objTemp = $tab[$idx];
- $tab[$idx] = $tab[$idx + 1];
- $tab[$idx + 1] = $objTemp;
- }
- $idx++;
- }
- }while ($permutation);
- return $tab;
- }
-
- class Fichier
- {
- //Définition d'un objet fichier contenant simplement son nom et son chemin
- public $nom = '';
- public $chemin = '';
-
- function Fichier($chemin)
- {
- $this->chemin = $chemin;
-
- $tbChemin = explode("/", $chemin);
- $this->nom = $tbChemin[count($tbChemin) - 1];
- }
- }
-
- class repertoire
- {
-
- /*
- L'objet réperoire contient un tableau d'objets REPERTOIRE correspondants aux sous-répertoire de celui désiré
- et un autre tableau d'objets FICHIER correspondants aux fichiers contenus dans le répertoire désiré
- */
-
- public $nom = '';
- public $chemin = '';
-
- public $tbSRep = array();
- public $tbFiles = array();
-
- function repertoire($chemin, $descendre = true)
- {
- /*
- Le deuxième paramètre du constructeur donne la limite de l'appel récursif
- s'il est mis à true, cela signifie que l'appel récursif déscendra d'un niveau dans l'arborescence et listera
- les sous-répertoires de l'élément analysé
- */
-
- if (is_dir($chemin)) //Vérifier si le chemin existe et est bien un répertoire
- {
- //Remplissage des propriétés de l'objet
- $this->chemin = $chemin;
-
- $tbChemin = explode("/", $chemin);
- $this->nom = $tbChemin[count($tbChemin) - 1];
-
- //Récupération des sous-répertoires
- $lptRep = opendir($this->chemin); //Ouverture du répertoire désiré
- $tbRepANePasLister = array('.', '..'); //Liste des sous-répertoires à ne pas lister
- $tbExtANePasLister = array('db'); //Liste des extensions de fichiers à ne pas lister
- while (false !== ($obj = readdir($lptRep))) //Parcours des objets contenus dans le répertoire désiré
- {
- if (!in_array($obj, $tbRepANePasLister)) //Vérification de la non présence de l'élément dans les éléments à ne pas lister
- {
- $cheminObj = $this->chemin.'/'.$obj;
- if (is_dir($cheminObj)) //Si l'élément est un répertoire, le mettre dans le tableau des sous répertoires
- {
- if ($descendre)
- {
- //Appel récursif sur le sous-répertoire en cours
- //Ici, je ne désire pas rentrer dans les sous-répertoires
- $this->tbSRep[] = new repertoire($cheminObj, false);
- }
- }
-
- if (is_file($cheminObj)) //Si l'élément est un fichier, je le mets dans le tableau des fichiers
- {
- /*
- Je construit un tableau contenant les éléments consituant le nom de l'objet en cours
- en général, 2 case : le nom sans l'extension puis l'extension.
- */
- $tbInfosFichiers = explode('.', $obj);
- if (!in_array($tbInfosFichiers[count($tbInfosFichiers) - 1], $tbExtANePasLister))
- {
- //Ajout de l'objet fichier correspondant
- $this->tbFiles[] = new Fichier($cheminObj);
- }
- }
- }
- }
- closedir($lptRep); //Fermeture du répertoire désiré
- }
- else
- {
- die("Le chemin spécifié n'est pas un répertoire !");
- }
- }
-
- function AfficheArborescence($niveau = 1)
- {
- //Parcours tous les sous-répertoires du répertoire en cours
- //Le paramètre donné peut permettre d'effectuer un affichage décalé des sous-répertoire en fonction du niveau
- //Par exemple en ajoutant (niveau) fois un espace devant le lien
- //Le premier test permet de ne pas afficher le nom du répertoire en cours
- if ($niveau > 1)
- {
- //Construction du lien pour le répertoire concerné par l'appel récursif
- print '<A href="?REP='.$this->chemin.'">'.$this->nom.'</A><BR>';
- }
-
- //Affichage des sous-répertoires
- for ($i = 0; $i < count($this->tbSRep); $i++)
- {
- //Appel récursif pour l'affichage
- $srep = $this->tbSRep[$i];
- $srep->AfficheArborescence($niveau + 1);
- }
- }
-
- function ListeFichiers()
- {
- //Construction du lien pour les fichiers
- if (count($this->tbFiles) > 0)
- {
- foreach ($this->tbFiles as $fichier)
- {
- print '<A href="?'.$_SERVER['QUERY_STRING'].'&file='.$fichier->chemin.'">'.$fichier->nom.'</A><BR>';
- }
- }
- }
-
- function LienParent()
- {
- //permet d'afficher le lien pour remonter au répertoire parent de celui consulté
- //Le premier test permet de ne pas donner la possibilité de remonter au dessus d'un certain répertoire
- //Dans mon cas le répertoire parent de ROOT est ma racine du serveur Web, je ne désire pas que mes
- //visiteurs puissent y accéder
- //Je suis en train de travailler sur la création dynamique du ROOT en fonction du visiteur
- //Pour éviter par exemple que mes amis n'accèdent à mes photos de famille et inversement
- if ($this->chemin != ROOT)
- {
- //Les 3 lignes qui suivent enlèvent le répertoire en cours du chemin de retour, pour remonter d'un seul niveau
- $tbPath = explode('/', $this->chemin);
- array_splice($tbPath, count($tbPath) - 1);
- $pathOrigine = implode('/', $tbPath);
-
- print '<A href="?REP='.$pathOrigine.'">Retour</A><BR>';
- }
- else
- {
- //Blanc pour remplir la case du tableau affiché en cas d'inexistence (ou d'inaccessibilité) du répertoire parent
- print " ";
- }
- }
- }
-
- //Récupération des paramètres
- if (isset($_GET['REP']))
- {
- $path = $_GET['REP'];
- }
- else
- {
- $path = ROOT;
- }
-
- $rep = new repertoire($path);
-
- //Tri des tableaux
- $rep->tbSRep = TableauTrie($rep->tbSRep);
- $rep->tbFiles = TableauTrie($rep->tbFiles);
-
- $dimensionOrigine = '';
- if (isset($_GET['file']) AND is_file($_GET['file']))
- {
- //Pour redimensionner l'image pour un affichage plus "visible"
- //De manière à en garder le rapport hauteur * largeur
- //J'utilise cette méthode pour ne pas déformer les photos prises en hauteur en attendant de savoir retourner dynamiquement une photo
- $image = $_GET['file'];
- $tbInfos = getimagesize($image);
- $largeurDesiree = 640;
- $hauteurDesiree = ($largeurDesiree * $tbInfos[1]) / $tbInfos[0];
- $hauteur = $tbInfos[1] * ((($hauteurDesiree * 100) / $tbInfos[1]) / 100);
- $largeur = $tbInfos[0] * ((($largeurDesiree * 100) / $tbInfos[0]) / 100);
-
- //Pour afficher les dimensions originales de l'image
- $dimensionOrigine = 'Hauteur réelle : '.$tbInfos[1].' pixels Largeur réelle : '.$tbInfos[0].' pixels';
- }
- ?>
-
- <HTML>
- <HEAD>
- <TITLE>Les photos</TITLE>
- <LINK href="styles.css" type="text/css" rel="stylesheet">
- </HEAD>
- <BODY style="text-align:center">
- <TABLE width="100%">
- <TR valign="top">
- <TD colspan="2" align="left">
- <SPAN class="tabmenus"><?=$path;?></SPAN>
- </TD>
- </TR>
- <TR>
- <TD width="200px" nowrap>
- <TABLE height="100%" width="100%" border="1">
- <TR>
- <TD height="20"><?=$rep->LienParent();?></TD>
- </TR>
- <TR>
- <TD><I>Répertoires :</I><BR><BR><?=$rep->AfficheArborescence();?></TD>
- </TR>
- <TR>
- <TD><I>Images : </I><BR><BR><?=$rep->ListeFichiers();?></TD>
- </TR>
- </TABLE>
- </TD>
- <TD valign="top">
- <?PHP
- if (isset($_GET['file']) AND is_file($_GET['file']))
- {
- print $dimensionOrigine.'<BR>';
- ?>
- <IMG id="img" src="<?=$image?>" border="0" width="<?=$largeur?>" height="<?=$hauteur?>">
- <?PHP
- }
- ?>
- </TD>
- </TR>
- </TABLE>
- </BODY>
- </HTML>
//////////////////////////////////////////
// DEFINITION DU FICHIER PRINCIPAL DEFINEROOTS.INC.PHP
//////////////////////////////////////////
<?PHP
//Définition des ROOT par usr
$tbRoots = array('MICHEL' => 'Photos',
'VISITEUR' => 'Photos/Divers',
'' => '');
?>
//////////////////////////////////////////
// DEFINITION DU FICHIER PRINCIPAL INDEX.PHP
//////////////////////////////////////////
<?PHP
/*
Date : 30/03/2006
Auteur : The_Legacy
Description :
Mise en place d'une méthode de parcours de répertoire par appels récursif
permettant la mise en ligne d'une gallerie d'images situées dans un répertoire et ses sous-répertoires.
Pour le moment, il n'est implémenté que pour les photos et images. Il est destiné à s'enrichir
avec la gestion de différents types de fichiers.
*/
include_once "defineRoots.inc.php";
define('ROOT', $tbRoots[strtoupper($_SERVER['PHP_AUTH_USER'])]); //Définition du répertoire à partir duquel on désire travail et corrspond également à la limite haute de l'arborescence
function TableauTrie($tab)
{
//Méthode simple du tri par permutation
$nbElements = count($tab);
do
{
$objTemp = null;
$idx = 0;
$permutation = false;
while ($idx < $nbElements - 1)
{
if (strtoupper($tab[$idx]->nom) > strtoupper($tab[$idx + 1]->nom))
{
if (!$permutation)
{
$permutation = true;
}
$objTemp = $tab[$idx];
$tab[$idx] = $tab[$idx + 1];
$tab[$idx + 1] = $objTemp;
}
$idx++;
}
}while ($permutation);
return $tab;
}
class Fichier
{
//Définition d'un objet fichier contenant simplement son nom et son chemin
public $nom = '';
public $chemin = '';
function Fichier($chemin)
{
$this->chemin = $chemin;
$tbChemin = explode("/", $chemin);
$this->nom = $tbChemin[count($tbChemin) - 1];
}
}
class repertoire
{
/*
L'objet réperoire contient un tableau d'objets REPERTOIRE correspondants aux sous-répertoire de celui désiré
et un autre tableau d'objets FICHIER correspondants aux fichiers contenus dans le répertoire désiré
*/
public $nom = '';
public $chemin = '';
public $tbSRep = array();
public $tbFiles = array();
function repertoire($chemin, $descendre = true)
{
/*
Le deuxième paramètre du constructeur donne la limite de l'appel récursif
s'il est mis à true, cela signifie que l'appel récursif déscendra d'un niveau dans l'arborescence et listera
les sous-répertoires de l'élément analysé
*/
if (is_dir($chemin)) //Vérifier si le chemin existe et est bien un répertoire
{
//Remplissage des propriétés de l'objet
$this->chemin = $chemin;
$tbChemin = explode("/", $chemin);
$this->nom = $tbChemin[count($tbChemin) - 1];
//Récupération des sous-répertoires
$lptRep = opendir($this->chemin); //Ouverture du répertoire désiré
$tbRepANePasLister = array('.', '..'); //Liste des sous-répertoires à ne pas lister
$tbExtANePasLister = array('db'); //Liste des extensions de fichiers à ne pas lister
while (false !== ($obj = readdir($lptRep))) //Parcours des objets contenus dans le répertoire désiré
{
if (!in_array($obj, $tbRepANePasLister)) //Vérification de la non présence de l'élément dans les éléments à ne pas lister
{
$cheminObj = $this->chemin.'/'.$obj;
if (is_dir($cheminObj)) //Si l'élément est un répertoire, le mettre dans le tableau des sous répertoires
{
if ($descendre)
{
//Appel récursif sur le sous-répertoire en cours
//Ici, je ne désire pas rentrer dans les sous-répertoires
$this->tbSRep[] = new repertoire($cheminObj, false);
}
}
if (is_file($cheminObj)) //Si l'élément est un fichier, je le mets dans le tableau des fichiers
{
/*
Je construit un tableau contenant les éléments consituant le nom de l'objet en cours
en général, 2 case : le nom sans l'extension puis l'extension.
*/
$tbInfosFichiers = explode('.', $obj);
if (!in_array($tbInfosFichiers[count($tbInfosFichiers) - 1], $tbExtANePasLister))
{
//Ajout de l'objet fichier correspondant
$this->tbFiles[] = new Fichier($cheminObj);
}
}
}
}
closedir($lptRep); //Fermeture du répertoire désiré
}
else
{
die("Le chemin spécifié n'est pas un répertoire !");
}
}
function AfficheArborescence($niveau = 1)
{
//Parcours tous les sous-répertoires du répertoire en cours
//Le paramètre donné peut permettre d'effectuer un affichage décalé des sous-répertoire en fonction du niveau
//Par exemple en ajoutant (niveau) fois un espace devant le lien
//Le premier test permet de ne pas afficher le nom du répertoire en cours
if ($niveau > 1)
{
//Construction du lien pour le répertoire concerné par l'appel récursif
print '<A href="?REP='.$this->chemin.'">'.$this->nom.'</A><BR>';
}
//Affichage des sous-répertoires
for ($i = 0; $i < count($this->tbSRep); $i++)
{
//Appel récursif pour l'affichage
$srep = $this->tbSRep[$i];
$srep->AfficheArborescence($niveau + 1);
}
}
function ListeFichiers()
{
//Construction du lien pour les fichiers
if (count($this->tbFiles) > 0)
{
foreach ($this->tbFiles as $fichier)
{
print '<A href="?'.$_SERVER['QUERY_STRING'].'&file='.$fichier->chemin.'">'.$fichier->nom.'</A><BR>';
}
}
}
function LienParent()
{
//permet d'afficher le lien pour remonter au répertoire parent de celui consulté
//Le premier test permet de ne pas donner la possibilité de remonter au dessus d'un certain répertoire
//Dans mon cas le répertoire parent de ROOT est ma racine du serveur Web, je ne désire pas que mes
//visiteurs puissent y accéder
//Je suis en train de travailler sur la création dynamique du ROOT en fonction du visiteur
//Pour éviter par exemple que mes amis n'accèdent à mes photos de famille et inversement
if ($this->chemin != ROOT)
{
//Les 3 lignes qui suivent enlèvent le répertoire en cours du chemin de retour, pour remonter d'un seul niveau
$tbPath = explode('/', $this->chemin);
array_splice($tbPath, count($tbPath) - 1);
$pathOrigine = implode('/', $tbPath);
print '<A href="?REP='.$pathOrigine.'">Retour</A><BR>';
}
else
{
//Blanc pour remplir la case du tableau affiché en cas d'inexistence (ou d'inaccessibilité) du répertoire parent
print " ";
}
}
}
//Récupération des paramètres
if (isset($_GET['REP']))
{
$path = $_GET['REP'];
}
else
{
$path = ROOT;
}
$rep = new repertoire($path);
//Tri des tableaux
$rep->tbSRep = TableauTrie($rep->tbSRep);
$rep->tbFiles = TableauTrie($rep->tbFiles);
$dimensionOrigine = '';
if (isset($_GET['file']) AND is_file($_GET['file']))
{
//Pour redimensionner l'image pour un affichage plus "visible"
//De manière à en garder le rapport hauteur * largeur
//J'utilise cette méthode pour ne pas déformer les photos prises en hauteur en attendant de savoir retourner dynamiquement une photo
$image = $_GET['file'];
$tbInfos = getimagesize($image);
$largeurDesiree = 640;
$hauteurDesiree = ($largeurDesiree * $tbInfos[1]) / $tbInfos[0];
$hauteur = $tbInfos[1] * ((($hauteurDesiree * 100) / $tbInfos[1]) / 100);
$largeur = $tbInfos[0] * ((($largeurDesiree * 100) / $tbInfos[0]) / 100);
//Pour afficher les dimensions originales de l'image
$dimensionOrigine = 'Hauteur réelle : '.$tbInfos[1].' pixels Largeur réelle : '.$tbInfos[0].' pixels';
}
?>
<HTML>
<HEAD>
<TITLE>Les photos</TITLE>
<LINK href="styles.css" type="text/css" rel="stylesheet">
</HEAD>
<BODY style="text-align:center">
<TABLE width="100%">
<TR valign="top">
<TD colspan="2" align="left">
<SPAN class="tabmenus"><?=$path;?></SPAN>
</TD>
</TR>
<TR>
<TD width="200px" nowrap>
<TABLE height="100%" width="100%" border="1">
<TR>
<TD height="20"><?=$rep->LienParent();?></TD>
</TR>
<TR>
<TD><I>Répertoires :</I><BR><BR><?=$rep->AfficheArborescence();?></TD>
</TR>
<TR>
<TD><I>Images : </I><BR><BR><?=$rep->ListeFichiers();?></TD>
</TR>
</TABLE>
</TD>
<TD valign="top">
<?PHP
if (isset($_GET['file']) AND is_file($_GET['file']))
{
print $dimensionOrigine.'<BR>';
?>
<IMG id="img" src="<?=$image?>" border="0" width="<?=$largeur?>" height="<?=$hauteur?>">
<?PHP
}
?>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
Conclusion
Pour le moment, je pense qu'il n'y a pas de bug, mais je ne l'ai pas exploitée à fond. Merci pour vos commentaires.
Historique
- 01 avril 2006 10:27:30 :
- - Ajout d'une méthode de tri simple sur les sous-répertoires et les fichiers
- Ajout d'un méthode de définition de la constante ROOT en fonction de l'utilisateur connecté (id : Apache / Mandriva par htaccess)
- Intégration dans une archive ZIP contenant les 2 fichiers PHP et le fichier CSS
- 01 avril 2006 11:47:35 :
- - Ajout d'un test pour eviter le cross scripting sur le nom du fichier
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
arborescence de repertoire et sous répertoire avec galerie d'image [ par bladehelsing ]
Bonjours à tous,après avoir essayer tous les codes arborescence avec galerie d'image.j'en ai trouvé aucun qui:affiche d'abord les répertoires qui seul
creer un répertoire dans un répertoire [ par mouloudikhaled ]
Bonjour a tous, S'il vous plait. j'essaye de crée un dossier dans un dossier mais je n'y arrive pas. Pouvez vous me dire comment dois-je procédé ? Mer
Positionner ma galerie flash sur ma page [ par mel06 ]
Bonjour,Je possède une galerie flash sur mon site internet mais le problème c'est qu'elle se trouve en bas de la page : http://www.tristane-banon-offi
ouvrir une autre fenetre [ par hou1919 ]
SalutEst ce que vous pouvez m'aider à avoir une idée sur ce truc qui se trouve dans le lien <a href="http://www.wks.fr/Nouvel-article,158.html#"
Création site de vente [galerie Objet] [ par Brydjy ]
Bonjour à tous,Vraiment besoin d'aide...Je suis à l'école et j'ai pour projet de créer un site web.J'ai pas choisis le plus simple ! Site de vente...J
galerie photo mysql [ par nissweb ]
Bonjour j'ai besoin un code qui pemet d' ajouter et suprimer des photo à partir d'un formulaire qui contiens discription; style de photo et parcurir
Diaporama depuis une structure avec répêrtoire et sous-repertoire [ par patrick672 ]
Hello,A ce jour aucune connaissance php, je suis autodidacte et je me lance .J'ai créé pour un ami qui démarre son affaire, un site Web classique en h
Lister dans un tableau à 2 colonnes des dossiers et leurs contenus [ par jibtothenight ]
Bonjour,Avec mon php j'arrive à aficher le nom de mes dossiers et leurs contenus qui sont sur le serveur, voici mon code : <?phpfunction parcours_
Ouvrir un dossier répertoire du disque dur [ par sebalex ]
Bonjour à tous,Voilà. J'ai un form "fichier" sur une page relative à un client (id_client). Ce form sert à uploader un document PDF dans ma base. Ce
Comment lister le contenu d'un répertoire? [ par stankov ]
j'ai monté le site d'une église, site dans lequel se trouve un repertoire ARCHIVES. Pour lister le contenu de ce repertoire j'ai écris le script ci-de
|
Derniers Blogs
L'INTERFACE NATURELLE DE WINDOWS PHONE 7 SERIESL'INTERFACE NATURELLE DE WINDOWS PHONE 7 SERIES par odewit
La tendance est aux interfaces naturelles (NUI), et le keynote de Bill Buxton au MIX l'a bien souligné.
La charte graphique et ergonomique de Windows Phone 7 a donc été entièrement repensée en vue d'obtenir un maximum d'efficacité sur ce point. En re...
Cliquez pour lire la suite de l'article par odewit COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE?COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE? par Matthieu MEZIL
Avec EF, les vues doivent être mappées sur des entity types. Le problème c'est que les entity types doivent avoir une clé. Avec EF, nous avons les complex type qui n'ont pas de clé mais les vues ne peuvent pas être mappées dessus. Avec EF4, il est possibl...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL?[WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL? par JeremyJeanson
Certain d'entre vous on peut être vécu cette situation embarrassante après quelques temps passer avec WF4 : Au début avec mon " ActivityDesigner" , tout allait bien. Et puis un jour j'ai au des problèmes de " Binding" . Alors nous sommes allé sur le site ...
Cliquez pour lire la suite de l'article par JeremyJeanson
Forum
MYSQL PROBLEMEMYSQL PROBLEME par remitete
Cliquez pour lire la suite par remitete
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|