[RESOLU] liste dossier + sous-dossier par date du dernier fichier ajouté.

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] liste dossier + sous-dossier par date du dernier fichier ajouté.

Re: [RESOLU] liste dossier + sous-dossier par date du dernier fichier ajouté.

par westernz » 27 juil. 2015, 18:23

Petite correction :
// INCLURE LE SOUS-DOSSIER DANS LA LISTE DANS LE DOSSIER
$doc_list[$rep][$last_up_time] = $sub_rep;
krsort($doc_list[$rep]); // J'AVAIS OUBLIE LE TRI DES SOUS DOSSIERS

Re: liste dossier + sous-dossier par date du dernier fichier ajouté.

par westernz » 24 juil. 2015, 13:38

Pour le moment ca marche sur 2 niveaux.
Je vous donne mes deux fonctions et un exemple d'utilisation.
Je pense n'avoir rien oublié.

// TRI DES DOSSIER ET SOUS DOSSIERS POURS LES MENUS

Code : Tout sélectionner

function list_dossier($loc) { $doc_list = array(); $doc_list_chrono = array(); $dir = opendir($loc); // LECTURE DOSSIERS while ($rep = readdir($dir)) { if($rep != '..' && $rep !='.' && $rep !='' && is_dir($loc.'/'.$rep) && $rep !='infos.php' && $rep != '#template' && $rep != 'filigrane' ) { $sub_dir = opendir('./'.$loc.'/'.$rep); // CREATION DE L'ARRAY POUR CE DOSSIER $doc_list[$rep] = array(); // LISTE DES DOSSIER $docs_names[$i] = $rep; $i++; // LECTURE SOUS-DOSSIERS while ($sub_rep = readdir($sub_dir)) { if ($sub_rep != '..' && $sub_rep !='.' && $sub_rep !='' && is_dir($loc.'/'.$rep) && $sub_rep !='infos.php' && $sub_rep != '#template' && $sub_rep != 'filigrane' ) { $sub_doc_list = array(); $last_up_time = ''; $sub_loc = './'.$loc.'/'.$rep.'/'.$sub_rep; $file_dir = opendir($sub_loc); // LECTURE FICHIERS while ($file = readdir($file_dir)) { if($file != '..' && $file !='.' && $file !='' && $file !='infos.php' && $file != '#template' && $file != 'filigrane') { // TROUVER LE FICHIER LE PLUS RECENT $file_up_time = filemtime('./'.$loc.'/'.$rep.'/'.$sub_rep.'/'.$file); if ($last_up_time == '' || $last_up_time < $file_up_time) {$last_up_time = $file_up_time;} } } // INCLURE LE SOUS-DOSSIER DANS LA LISTE DANS LE DOSSIER $doc_list[$rep][$last_up_time] = $sub_rep; } } } } closedir($dir); closedir($sub_dir); closedir($file_dir); return $doc_list; } function tri_dossier($doc_list) { // TRI DES DOSSIER ET SOUS-DOSSIERS PAR ORDRE CHRONOLOGIQUE $doc_list_chrono = array(); foreach($doc_list as $doc => $sub_doc_list) { // SOUS-DOSSIERS krsort($sub_doc_list); foreach($sub_doc_list as $date => $sub_doc) { if ($doc_list_chrono[$doc] == false || $doc_list_chrono[$doc] == '' || $doc_list_chrono[$doc] < $date) {$doc_list_chrono[$doc] = $date;} } } $doc_list_chrono = array_flip($doc_list_chrono); krsort($doc_list_chrono); return $doc_list_chrono; }
Avec un menu (ce n'est pas moi qui l'est fait) qui se construit tout seul sur 2 niveaux.
Attention, je met les titres dans un fichier infos.php dans chaque dossier et sous dossier, ceci afin d'avoir des noms de dossier sans accent et des titre avec accent.

Code : Tout sélectionner

<!--[if lt IE 9]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> <META content="CSS, cascading style sheets, mise en page, design, site, web, techniques, sites, webmaster, page" name=keywords> <STYLE type=text/css>#monmenu { FONT-WEIGHT: bold; FONT-SIZE: 100%; FONT-FAMILY: trebuchet ms,arial,tahoma,verdana,sans-serif } #monmenu UL UL { BORDER-RIGHT: #b0b0b0 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #b0b0b0 1px solid; DISPLAY: none; PADDING-LEFT: 0px; LEFT: 264px; PADDING-BOTTOM: 0px; MARGIN: 0px; BORDER-LEFT: #b0b0b0 1px solid; PADDING-TOP: 0px; BORDER-BOTTOM: #b0b0b0 1px solid; POSITION: absolute; TOP: -1px } #monmenu LI { PADDING-RIGHT: 2px; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; MARGIN: 0px; WIDTH: 260px; HEIGHT:24px; PADDING-TOP: 2px; LIST-STYLE-TYPE: none; POSITION: relative; BACKGROUND-COLOR: #000000 } #monmenu LI:hover { BACKGROUND-COLOR: #555555 } #monmenu LI.sfhover { BACKGROUND-COLOR: #555555 } #monmenu LI A { TEXT-DECORATION: none } #monmenu LI:hover UL.niveau2 { DISPLAY: block } #monmenu LI LI:hover UL.niveau3 { DISPLAY: block } #monmenu LI.sfhover UL.niveau2 { DISPLAY: block } #monmenu LI LI.sfhover UL.niveau3 { DISPLAY: block } #monmenu LI.plus { BACKGROUND-POSITION: right 50%; BORDER-BOTTOM: #b0b0b0 0px solid; BACKGROUND-REPEAT: no-repeat } </STYLE> <!--[if lt IE 7]> <SCRIPT type=text/javascript> // Fonction destinée à remplacer le "LI:hover" pour IE 6 sfHover = function() { var sfEls = document.getElementById("monmenu").getElementsByTagName("li"); for (var i=0; i<sfEls.length; i++) { sfEls[i].onmouseover = function() { this.className = this.className.replace(new RegExp(" sfhover"), ""); this.className += " sfhover"; } sfEls[i].onmouseout = function() { this.className = this.className.replace(new RegExp(" sfhover"), ""); } } } if (window.attachEvent) window.attachEvent("onload", sfHover); </SCRIPT> <STYLE type=text/css>#monmenu LI { WIDTH: 264px } </STYLE> <![endif]--> <DIV id="monmenu"> <UL class=niveau1> <LI> <table width="260" border="1" cellpadding="0" cellspacing="0"><tr><td align="center">MES RECHERCHES</td></tr></table> <UL class=niveau2 style="LEFT: 0px; TOP: 22px"> <?php // Menu automatique en fonction du contenu du dossier /photos/ function list_menu($type) { if ($type == 'listing') { $loc = "photos"; // dossier général de stockage photo $dir = opendir($loc); } elseif ($type == 'page') { $loc = "pages"; // dossier général de stockage texte $dir = opendir($loc); } else { $loc = "photos"; // dossier général de stockage photo $dir = opendir($loc); } // TRI DES DOSSIERS $doc_list = list_dossier($loc); $doc_list_chrono = tri_dossier($doc_list); // AFFICHAGE DES DOSSIERS ET SOUS-DOSSIERS PAR DATE : LE DERNIER FICHIER AJOUTE / LE PLUS RECENT EN PREMIER foreach($doc_list_chrono as $date => $doc) { // DOSSIER if (file_exists($loc.'/'.$doc.'/infos.php')) {include $loc.'/'.$doc.'/infos.php';} // récupération des infos du dossier else {$titre = 'untitled';} echo '<LI class=plus>'; echo $titre; echo'&nbsp;>'; echo '<UL class=niveau3>'; // SOUS DOSSIER foreach($doc_list as $main_doc => $sub_doc_list) { if ($main_doc == $doc) { foreach($sub_doc_list as $date => $sub_doc) { if (file_exists($loc.'/'.$doc.'/'.$sub_doc.'/infos.php')) // infos dossier {include $loc.'/'.$doc.'/'.$sub_doc.'/infos.php';} else {$titre = 'untitled';} echo '<A href="?type='.$type.'&pass='.$get_pass.'&code='.$get_code.'&loc='.$loc.'/'.$doc.'/'.$sub_doc.'"><LI>'; echo $titre; echo '</LI></A>'; } } } echo '</UL></LI>'; } } list_menu('listing'); list_menu('page'); ?> </UL> </LI></UL> </DIV> <![endif]-->

Re: liste dossier + sous-dossier par date du dernier fichier ajouté.

par westernz » 20 juil. 2015, 17:06

J'arrive à trier les sous-dossier. C'est assez simple.
Mais pas les dossiers. Et là je sèche.

Code : Tout sélectionner

foreach($doc_list as $KEY => $doc) { krsort($doc); print_r($doc); }

Re: liste dossier + sous-dossier par date du dernier fichier ajouté.

par westernz » 19 juil. 2015, 20:42

Je n'arrive pas a exploiter mon dernier code ci-dessus, pourtant il me semble bon quand je le test.
Je suis nul sur les array :(

$doc = array >> key = nom du dossier
value = array >> key = date du sous dossier
value = nom du sous dossier

Je veux liste les dossiers et sous dossier par date.
Je n'en peux plus de ne pas y arriver :(

Bonne journée

Re: liste dossier + sous-dossier par date du dernier fichier ajouté.

par westernz » 19 juil. 2015, 15:56

voilà ma première partie qui ne bug pas.

Mais je ne sais pas comme faire un krsort sur un array quand il est déjà dans un array :(

Code : Tout sélectionner

// Liste des dossier triés par date de dernier ajout. $doc_list = array(); $loc = "photos"; // dossier général de stockage photo $dir = opendir($loc); // LECTURE DOSSIERS while ($rep = readdir($dir)) { if($rep != '..' && $rep !='.' && $rep !='' && is_dir($loc.'/'.$rep) && $rep !='infos.php' && $rep != '#template' && $rep != 'filigrane' ) { $sub_dir = opendir('./'.$loc.'/'.$rep); // CREATION DE L'ARRAY POUR CE DOSSIER $doc_list[$rep] = array(); // LECTURE SOUS-DOSSIERS while ($sub_rep = readdir($sub_dir)) { if ($sub_rep != '..' && $sub_rep !='.' && $sub_rep !='' && is_dir($loc.'/'.$rep) && $sub_rep !='infos.php' && $sub_rep != '#template' && $sub_rep != 'filigrane' ) { $sub_doc_list = array(); $last_up_time = ''; $sub_loc = './'.$loc.'/'.$rep.'/'.$sub_rep; $file_dir = opendir($sub_loc); // LECTURE FICHIERS while ($file = readdir($file_dir)) { if($file != '..' && $file !='.' && $file !='' && $file !='infos.php' && $file != '#template' && $file != 'filigrane') { // TROUVER LE FICHIER LE PLUS RECENT $file_up_time = filemtime('./'.$loc.'/'.$rep.'/'.$sub_rep.'/'.$file); if ($last_up_time == '' || $last_up_time < $file_up_time) {$last_up_time = $file_up_time;} } } // INCLURE LE SOUS-DOSSIER DANS LA LISTE DANS LE DOSSIER $doc_list[$rep][$last_up_time] = $sub_rep; } } } } closedir($dir); closedir($sub_dir); closedir($file_dir); var_dump($doc_list); ?>

Re: liste dossier + sous-dossier par date du dernier fichier ajouté.

par westernz » 19 juil. 2015, 11:37

Effectivement. Merci
Plus on connais son code et moins on en voit les détails erronés :(

N’empêche que ça n'est toujours pas bon.
Je continu à chercher.

Re: liste dossier + sous-dossier par date du dernier fichier ajouté.

par tof73 » 19 juil. 2015, 01:36

le second
if($rep != '..' && $rep !='.' && $rep !='' && is_dir($loc.'/'.$rep) )
ne devrait pas tester $rep mais $sub_rep

liste dossier + sous-dossier par date du dernier fichier ajouté.

par westernz » 19 juil. 2015, 00:35

Bonjour.

Je tente de construire un code ... Sans succès

Je veux une liste exploitable pour un foreach qui listerai mes dossiers et sous-dossier, le tout trié par ordre du dernier fichier ajouté.

Vous pensez quoi de ça ?
Y-a-t-il plus simple ?

Sachant que c'est pas encore au point.
Le var_dump me renvoi pas grand chose :(

Code : Tout sélectionner

while ($rep = readdir($dir)) { if($rep != '..' && $rep !='.' && $rep !='' && is_dir($loc.'/'.$rep) ) { $sub_dir = opendir('./'.$loc.'/'.$rep); while ($sub_rep = readdir($sub_dir)) { if($sub_rep != '..' && $sub_rep !='.' && $sub_rep !='' && is_dir($loc.'/'.$rep) ) { $sub_doc_list = array(); $last_up_time = ''; $sub_loc = './'.$loc.'/'.$rep.'/'.$sub_rep; $sub_dir = opendir($sub_loc); while ($file = readdir($sub_dir)) { if($file != '..' && $file !='.' && $file !='') { $file_up_time = filemtime('./'.$loc.'/'.$rep.'/'.$sub_rep.'/'.$file); if ($last_up_time == '' || $last_up_time < $file_up_time) {$last_up_time = $file_up_time;} // La clé de l'array est la date du dernier fichier uploadé $sub_doc_list[$last_up_time] = $sub_rep; } } } } krsort($sub_doc_list); // On invers l'array pour récup la date du sous-dossier. $flip= array_flip($sub_doc_list); // On construit la liste des dossiers et des sous dossier dans un array pour le foreach $doc_list[$flip[0]] = array($rep => $sub_doc_list); } } krsort($doc_list); closedir($dir);
Bonne journée