Eléphanteau du PHP |
42 Messages
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' >';
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]-->