lister des dossiers et sous dossiers N°2

Eléphant du PHP | 55 Messages

25 oct. 2005, 19:04

Hello
J'ai déjà crée un autre sujet la dessus mais je me permet d'en faire un autre, la méthode et le but étant différent.

Voici le sujet précedent: http://www.phpfrance.com/forums/voir_sujet-9890.php
Tout marche, pas de problèmes, maintenant, je veux passer à une méthode plus "complexe" et plus "détaillée" pour que le script soit plus complet

Le problème est que devant l'ampleur de la tache, je ne sais pas trop comment démarrer.

Le principe du script et basé sur la meme chose que l'autre fois mais en plus "automatisé"(listage des dossiers et images d'un dossier et synchronisation de la bdd).

Voici tout ce qui est prévu:
La partie lecture du dossier
  • - Le script liste ce qui est dans le dossier racine
  • - Si l'element est un dossier, on liste son contenu et ainsi de suite
  • - Si l'element est un fichier, on le liste dans un array
Donc je pense que chaque dossier ou sous-dossier doit etre un array
si c'est un sous-dossier, on a un array dans un array et ainsi de suite( le dossier racine serait donc un array multi-dimensionnel contenant tout le reste) eventuellement dautre tableau multi-dimensionnel

La partie comparaison bdd/array
  • - On Liste tout les dossiers de l'array qui correspondront chacun à une catégorie de la galerie
  • - On liste les catégories présente dans la bdd
  • - On va sur la page de 'synchronisation" des catégorie:
    • - On affiche une liste des dossiers dans l'array et pas enregistrés dans la bdd avec une case à cocher par ligne, les dossiers dont la case sera coché seront ajouté à la bdd
    • - On affiche une liste des dossiers dans la bdd et qui ne sont pas dans l'array avec une case à cocher par ligne, les enregistrement dont la case sera coché seront supprimés de la bdd
Pour les images, meme chose, on compare bdd et array av ec 2 possibilité:
- image présente dans la bdd et pas dans l'array,on supprime ce qui est en trop dans la bdd
- image présente dans l'array et pas dans la bdd, on ajoute ce qui manque dans la bdd


Voilà les grandes lignes du projet final :D

Donc je m'attaque au commencement, le listage récursif de tous les dossiers, le array généré reprenant l'arborescence du dossier racine.

La ou je coince, c'est pour ce tableau multimulti...multidimensionnel
:oops:

Je suis capable de lister tout les fichiers, tout les dossiers mais je ne sais trop comment gerer l'array général et ses sous-tableaux

Voici les codes actuelles:
fonction.php
<?

function liste_recursive($dossier_a_parcourir,$liste,$nivo)
{
    $dir  =  opendir($dossier_a_parcourir) ;
	$nivo++;
    while( $file  =  readdir($dir) )
		{
			if((is_dir($dossier_a_parcourir.'/'.$file)) && $file !=  '.' && $file !=  '..')
			{
				$path = $dossier_a_parcourir.'/'.$file;
				$liste['listechemin'][] = $path;
				$liste['listedossier'][] = $file;
				$liste['listenivo'][] = $nivo;
				$liste=liste_recursive($path,$liste,$nivo);
			}
			
			if((is_file($dossier_a_parcourir.'/'.$file)) )
			{
				if( (substr($file,-3)=="gif") || (substr($file,-3)=="jpg")  || (substr($file,-3)=="JPG") || (substr($file,-3)=="png"))
					{
						$liste['listeimages'][] = $file;
					}
				else
					{
						$liste['listeautresfichiers'][] = $file;
					}	
				
			}
			
		}
    return $liste;
}
?>
liste.php
<?php 
include("config.php");
include("fonction.php");
$racine='Photos';


$nb_images_dossiers_total=0;
$nb_images_bdd_cumul=0;
$nivo = 0;

$liste = array("listechemin" => array(), "listedossier" => array(), "listenivo" => array(), "listeimages" => array());
$liste = liste_recursive($racine,$liste,$nivo);
	
?>

PS: bravo à ceux qui ont survécu à la lecture de tout cà, condoléances aux familles des autres :mrgreen:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

26 oct. 2005, 00:16

PS: bravo à ceux qui ont survécu à la lecture de tout cà, condoléances aux familles des autres :mrgreen:
Apparemment je suis le seul à avoir survécu :lol:
Tu aimes t'amuser avec le php toi

Tout d'abord dans ce déroulement je vois plus trop l'interet de garder les chemins et le niveau des dossiers :-k

le plus simple est de rajouter encore 2 tableau comme tu l'a fait pour les fichiers images et autres fichiers.
$liste = array("listechemin" => array(), "listedossier" => array(), "listenivo" => array(), "listeimages" => array(), "listeautresfichiers" => array());


Pour la 1ere partie listage des dossiers:
//requete pour lister les dossier de la BD
$sql="SELECT dossier .....";
$req = mysql_query($sql);

$liste_bd=array();// tableau pour les dossier de la bd
//Récupération des dossiers de la table dans un tableau
while($data = mysql_fetch_array($req)) 
{  
	$liste_bd[]=$data['dossier'];
}
Tous les dossier de la BD sont donc dans un tableau il suffit de faire appel a array_diff() pour récupèrer les dossier qui sont respectivement ni dans l'un ni dans l'autre.
$dossier_not_in_bd = array_diff ($liste_bd, $liste['listedossier']);
$dossier_not_in_array = array_diff ($liste['listedossier'],$liste_bd);
Pour finir cette partie afficher les cases a cocher avec le dossier:
foreach ($dossier_not_in_bd as $val)
{
 echo 'Ajouter: '.$val.' <input type="checkbox" name="case_not_in_bd[]" value="'.$val.'"></td></tr>';	
}
de la meme manière pour l'autre tableau ($dossier_not_in_array).

Voila je pense que le principe y est :D
Bon courage pour la suite. :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 55 Messages

26 oct. 2005, 19:14

OK, je voit le fonctionnement général :)

Je vais cogiter la dessus.
Apparemment je suis le seul à avoir survécu Laughing
Je savais qu'il y aurait peu d'élus :D
Tu aimes t'amuser avec le php toi

Ouai j'aime bien :mrgreen:
Disons que chaque essai améne une découverte et vice-versa :wink:

Eléphant du PHP | 55 Messages

26 oct. 2005, 21:02

bon, ca avance doucement :)

Je bloque sur un truc bete (comme souvent :oops: ):
function trop_dossiers()
	{
		//fonction qui liste les dossiers en trop dans l'array $dossier_not_in_array comme expliqué au dessus
		//il y a une checkbox associé à chaque element
	}

function delete_dossier_bdd()
	{
		//fonction qui efface les dossiers listé dans la fonction au dessus
	}
Sachant que dans la 1ere fonction, j'ai ma liste et le checkbox pour chaque element, comment faire passer mes element de l'array qui sont coché afin de les effacer?
Il n'y a pas que l'array mais il faut aussi et surtout n'effacer que les elements coché

Je cale la dessus ](*,)

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

27 oct. 2005, 02:36

Voila un petit tuto pour récupèrer les valeurs des cases a cocher.

En gros la 1 fonction inclus les "checkbox" et donc un formulaire. qui renvoi sur la meme page tu testera si $_POST['cases'] existe avec isset(). Si la variable existe alors tu exécute la 2nd fonction.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 55 Messages

27 oct. 2005, 18:56

erf désolé pour le tuto, je les avais lu à mon arrivé sur le forum mais ils me sont sorti de la tete :oops:

Donc ca a l'air de marcher, je vient de finir la gestion de la supprssion des dossiers qui sont en trop dans la bdd, me reste la suite :wink: