fr   gb


Arbor
Le script Arbor > En savoir plus > Code du script

Le Code du Script

Voici le code complet du script Arbor (simple visualisation du fichier 'arbor.php' avec ajout de numéros de lignes) c'est-à-dire la définition de la classe PHP Arbor.

Il n'y a aucune technique de programmation sophistiquée là-dedans (j'en serais d'ailleurs bien incapable...), des boucles et encore des boucles, des tableaux et des boucles sur des tableaux... et si on l'allège de ses nombreux commentaires et lignes vides, il est beaucoup moins long qu'il n'y paraît.

C'est une classe mais ce n'est pas de la réelle POO, juste l'encapsulation d'un code procédural dans une classe.

Nb : ce code est compatible avec la génération automatique de documentation (utilisation de commentaires suivant la syntaxe des "DocBlocks" PhpDoc)

Tout conseil argumenté d'optimisation est le bienvenu.

1 <?php
2 /**
3 * ARBOR : Gestionnaire d'arborescences.
4 *
5
6 * - Menu arborescent dynamique
7 * - Ligne ou arbre de navigation (fil d'Ariane)
8 * - Sous-menu de sommaire de page
9 * - Plan de site
10 * - Explorateur des fichiers locaux du serveur
11 * - Ouverture de lien dynamique vers une page
12
13
14 *
15 * Code PHP compatible PHP 4.1+
16 *
17
18
19 * Javascript/Ajax ou autre technologie "client-side".
20 *
21 * CE FICHIER EST UNE BIBLIOTHEQUE PHP DANS LAQUELLE AUCUN PARAMETRAGE
22
23 * DONNEES DES ARBORESCENCES SONT EDITABLES PAR L'UTILISATEUR.
24 *
25 * === MODE D'EMPLOI SIMPLIFIE
26 * (pour plus d'info voir {@link http://arbor.stalikez.info}) ===============
27 *
28
29 *
30
31 * fichier exemple m1_fr.php).
32 *
33
34 *
35 * include('mnu/arbor.php');
36 *
37 * // 3) --- Initialiser un objet Arbor ---
38 *
39
40
41 *
42 * $monArbor = new Arbor('mnu/monMenu.php');
43 *
44
45 *
46 * $monArbor = new Arbor (
47 * 'mnu/monMenu.php',
48 * $mini = False,
49 * $relpath = '',
50 * $dtd = 'xhtml'
51 * );
52 *
53 * // $mini : repliement automatique des branches ne contenant pas le focus.
54
55 *
56
57
58
59
60 *
61
62
63 * 'html' : DTD HTML 4.01 strict.
64 *
65
66 *
67
68 * l'affichage du menu arborescent :
69 *
70 * $monArbor->write();
71 *
72
73
74 *
75
76 *
77 * $monArbor->write('nav1'); // Ligne de navigation (fil d'Ariane)
78 *
79 * $monArbor->write('nav2'); // Arbre de navigation (fil d'Ariane)
80 *
81 * $monArbor->write('path'); // Chemin du clic
82 *
83
84 *
85 * $monArbor->write('plan'); // Plan de site
86 *
87 * $monArbor->write('lnk:p') // Ouverture de lien vers la page "p" (<a ...>)
88 *
89
90 *
91 * $monArbor->write('next') // Lien vers la page suivante du menu
92 *
93
94 *
95 * // Tous ces modes d'affichage sont compatibles entre eux et se synchronisent
96
97 *
98 * =============================================================================
99 *
100 * @version 2.8
101 * @since 09/06/2010
102 * @author Billig
103 * @link http://arbor.stalikez.info
104 * @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt CeCILL (GNU-GPL compatible)
105 * @package Script_Arbor
106 */
107
108
109
110
111 /***************************************************************************//**
112
113 *
114
115
116 *
117 * @package Script_Arbor
118 */
119 class Arbor
120 {
121
122 // ---------------------------
123 // --- Attributs publics
124 // ---------------------------
125
126 /** Version du script (pour inscrire en commentaire html).
127 * @access public
128 * @var string */
129 var $version = '2.8 (09/06/2010)';
130
131
132 * @access public
133 * @var string */
134 var $zdv = '1';
135
136
137 * @access public
138 * @var string */
139 var $zc ='1';
140
141
142
143 // le fichier de menu
144
145
146 * @access public
147 * @var boolean */
148 var $urlcompact;
149
150
151 * @access public
152 * @var string */
153 var $icpath;
154
155
156 * @access public
157 * @var boolean */
158 var $retic;
159
160
161 * @access public
162 * @var string */
163 var $tree;
164
165
166 * @access public
167 * @var string */
168 var $symb;
169
170
171 * @access public
172 * @var int */
173 var $decal;
174
175
176 * @access public
177 * @var string */
178 var $hilight;
179
180 /** Type de gestion des styles ('auto'|'manuel'|[classe]|[aucun])
181 * @access public
182 * @var string */
183 var $typstyl;
184
185 // ---------------------------
186
187 // ---------------------------
188
189
190 * @access private
191 * @var string */
192 var $datamode = 'menufile';
193
194
195 * @access private
196 * @var array */
197 var $mn = array();
198
199
200 * @access private
201 * @var int */
202 var $i_clic = -1;
203
204
205 * @access private
206 * @var string */
207 var $zretour = '';
208
209
210 * @access private
211 * @var string */
212 var $ch_rel = '';
213
214 /** Tableau des index (int) du chemin du clic
215 * @access private
216 * @var array */
217 var $idx_path = array();
218
219
220 * @access private
221 * @var array */
222 var $mainitems = array();
223
224
225 * @access private
226 * @var string */
227 var $log = '';
228
229
230 * @access private
231 * @var float */
232 var $exec_time = 0;
233
234 // --- Adaptateurs xhtml/html
235
236 /** Adaptateur du saut de ligne
237 * @access private
238 * @var string */
239 var $br = '<br />';
240
241 /** Adaptateur de balise autofermante
242 * @access private
243 * @var string */
244 var $ferm = ' />';
245
246
247
248
249
250 /***************************************************************************//**
251 * Constructeur de l'instance.
252 *
253
254
255 *
256
257 * @param boolean $mini Option de minimalisation du menu
258
259
260 */
261 function Arbor (
262
263 $mini = False, // Option de minimalisation du menu
264
265
266 )
267 {
268
269
270
271 if (isset($_GET['arborinfo']))
272 {
273 $this->log = '<b>[Arbor] : JOURNAL D\'EXECUTION</b>' . $this->br . $this->br;
274
275 // microtime() retourne "timestamp.' '.microsecondes"
276
277 $exec_starttime = (float)$t[0] + (float)$t[1];
278 }
279
280
281 if ($datasource == 'chk')
282 {
283 return ;
284 }
285
286
287
288
289 $this->ch_rel = $relpath;
290 $this->mini = $mini;
291
292
293 if ($dtd == 'html')
294 {
295 $this->br = '<br>';
296 $this->ferm = '>';
297 }
298
299 // Instanciation en mode de source "fichier de menu" en passant directement
300 // un tableau de menu
301 if (is_array($datasource))
302 {
303 $this->datamode = 'menufile';
304 if (isset($datasource['datamenu'])) // tableau complet
305 {
306 $user_data = $datasource;
307 }
308 else // seulement un tableau de lignes
309 {
310 $user_data['datamenu'] = $datasource;
311 }
312 }
313
314
315 // du menu saisies dans un fichier par l'utilisateur
316 elseif (file_exists($datasource))
317 {
318 $this->datamode = 'menufile';
319 // SECURITE ! : On utilise un eval("$x=array(...)") et non un 'eval(...)'
320
321
322 // code malicieux ou l'affichage de contenu).
323 $t = '$user_data = array(' . file_get_contents($datasource) . ');';
324 eval($t);
325 }
326
327 // Instanciation en mode de source "explorateur de fichiers" -> On construit
328
329 elseif ($datasource[0] == '%')
330 {
331 $this->datamode = 'explorer';
332 $p = strpos($datasource, '*');
333
334 {
335 $user_data = $this->build_data_from_dir
336 (
337 $rootdir = substr($datasource, 1, $p - 1),
338 $ext = strToLower('.' . substr($datasource, $p + 1))
339 );
340 }
341 else
342 {
343 $user_data = $this->build_data_from_dir
344 (
345 $rootdir = substr($datasource, 1),
346 $ext = ''
347 );
348 }
349 }
350
351
352 else
353 {
354 die('<div class="arbor"><p class="warn"><b>[Arbor] : </b>Le fichier de menu "' . $datasource
355
356 }
357
358 // --- Affecter les valeurs des attributs, en leur attribuant des valeurs par
359
360
361 isset($user_data['urlcompact']) ? $this->urlcompact = $user_data['urlcompact'] : $this->urlcompact = True;
362 isset($user_data['icpath']) ? $this->icpath = $user_data['icpath'] : $this->icpath = 'mnu/';
363 isset($user_data['retic']) ? $this->retic = $user_data['retic'] : $this->retic = False;
364 isset($user_data['tree']) ? $this->tree = $user_data['tree'] : $this->tree = 'p';
365 isset($user_data['symb']) ? $this->symb = $user_data['symb'] : $this->symb = 'd';
366 isset($user_data['decal']) ? $this->decal = $user_data['decal'] : $this->decal = 12;
367 isset($user_data['hilight']) ? $this->hilight = $user_data['hilight'] : $this->hilight = '#C3CDFD';
368 isset($user_data['typstyl']) ? $this->typstyl = $user_data['typstyl'] : $this->typstyl = 'auto';
369
370 $this->mainitems = array();
371
372
373 // =========================================================
374
375
376 // et l'index du clic dans le menu
377
378
379 if ($this->datamode == 'menufile')
380 {
381 // index du clic dans le menu appelant
382 isset($_GET['clc']) ? $this->i_clic = $_GET['clc'] : $this->i_clic = '-1';
383
384
385 isset($_GET['zc']) ? $this->zc = $_GET['zc'] : $this->zc = '1';
386
387
388
389 $this->urlcompact ? $this->zdv = $this->decompacter($this->zc) : $this->zdv = $this->zc;
390
391
392
393
394
395 // disponibles)
396
397 $name_cook = str_replace ('.', '_', ('zretour' . $datasource)); // constuire nom du cookie
398
399 if ($this->i_clic[0] == '.')
400 {
401 $this->zretour = 'clc=' . substr($this->i_clic, 1) .'&amp;zc=' . $this->zc;
402 setcookie($name_cook, $this->zretour );
403 $this->i_clic = '-1';
404 $this->zc = '1';
405 }
406 else
407 {
408
409
410
411
412
413 isset($_COOKIE[$name_cook]) ? $this->zretour = $_COOKIE[$name_cook] : $this->zretour = '';
414
415
416
417
418 }
419
420 }
421
422
423
424 else
425 {
426 isset($_COOKIE['zexpl']) ? $this->zdv = $_COOKIE['zexpl']: $this->zdv = '1';
427 isset($_GET['ix']) ? $this->i_clic = $_GET['ix'] : $this->i_clic = '-1';
428 }
429
430
431
432
433 // ============================================================================
434
435
436
437
438
439 $this->mn = $this->convdata($user_data['datamenu'], $this->zdv, $this->typstyl);
440 unset($user_data); // On supprime le tableau-source devenu inutile
441
442 // ==============================================================
443
444
445
446 // la fonction retourne un tableau des index du chemin du clic
447
448 $this->idx_path = $this->devred($this->mn, $this->i_clic, $mini);
449
450 // =================================================================================
451
452
453
454
455 $this->zdv = '';
456
457 $imax = count($this->mn) - 1; // index maxi du tableau de menu
458
459 for ($i = 0; $i <= $imax; $i++)
460 {
461 $this->zdv .= $this->mn[$i]['vis'];
462 }
463
464
465 if ($this->datamode == 'explorer')
466 {
467 setcookie('zexpl', $this->zdv );
468 }
469
470
471 // ===================================================================
472
473
474
475
476 $this->urlcompact ? $this->zc = $this->compacter($this->zdv) : $this->zc = $this->zdv;
477
478
479 // =================================================================
480 // Comptabiliser le temps de l'initialisation dans le log optionnel
481
482 if ($this->log)
483 {
484 $t = explode(' ', microtime()); // clore la mesure du temps
485 $exec_addtime = ((float)$t[0] + (float)$t[1]) - $exec_starttime; // en secondes
486
487 $this->exec_time += $exec_addtime; // cumuler le temps global
488
489
490 if ($datasource[0] == '%')
491 {
492 $this->log .= ' - Type d\'objet : Explorateur de fichiers.' . $this->br;
493 }
494 else
495 {
496 $this->log .= ' - Type d\'objet : Arborescence (bas&eacute;e sur un fichier de menu)' . $this->br;
497 }
498
499 $this->log .= ' - Nombre total d\'&eacute;l&eacute;ments de l\'arborescence : ' . count($this->mn) . $this->br.
500
501 ' - Chemin du clic : ' . $this->getpath($this->mn, $this->i_clic) . $this->br . $this->br .
502 '<b>Temps d\'ex&eacute;cution; sur le serveur</b> :' . $this->br .
503 ' - Dur&eacute;e de l\'initialisation de l\'objet arborescence : ' . str_replace('.', ',', round (($exec_addtime * 1000), 2)) . ' millisecondes' . $this->br;
504 }
505
506 } // --- fin du constructeur
507
508
509
510
511
512 /***************************************************************************//**
513
514 *
515
516
517
518 *
519 * @access public
520 * @param string $typ_arb Type d'arborescence ('a|nav1|nav2|path|infra|plan|lnk:p|prev|next')
521 * @return none
522 */
523 function write (
524 $typ_arb = 'a' // Type d'arborescence ('a|nav1|nav2|path|infra|plan|lnk:p|prev|next')
525 )
526 {
527
528 if ($this->log)
529 {
530 // microtime() retourne "timestamp.' '.microsecondes"
531
532 $exec_starttime = (float)$t[0] + (float)$t[1];
533 }
534
535 // -------------
536
537
538 if ($typ_arb == '')
539 {
540 $typ_arb = 'a';
541 }
542
543 // On aiguille en fonction du type d'affichage : menu, fil d'Ariane, etc.
544
545 //==========================================================================
546 if ($typ_arb == 'a') // === Afficher comme un arbre de menu sur la page
547 //==========================================================================
548 {
549 $this->write_arbre (
550 $mn = $this->mn,
551 $typ_arb = $typ_arb,
552 $iclic = $this->i_clic,
553 $decal = $this->decal,
554 $hilight = $this->hilight,
555 $icpath = $this->icpath,
556 $retic = $this->retic,
557 $tree = $this->tree,
558 $symb = $this->symb,
559 $zc = $this->zc,
560 $ch_rel = $this->ch_rel,
561 $zretour = $this->zretour
562 );
563 }
564 // =========================================================================
565 elseif ($typ_arb == 'nav1') // === Afficher comme un fil d'Ariane en ligne
566 // =========================================================================
567 {
568 $this->write_nav1 (
569 $mn = $this->mn,
570 $typ_arb = $typ_arb,
571 $iclic = $this->i_clic,
572 $zc = $this->zc,
573 $ch_rel = $this->ch_rel,
574 $zretour = $this->zretour
575 );
576 }
577 // =========================================================================
578 elseif ($typ_arb == 'nav2') // === Afficher comme un fil d'Ariane en arbre
579 // =========================================================================
580 {
581 $this->write_nav2 (
582 $mn = $this->mn,
583 $typ_arb = $typ_arb,
584 $iclic = $this->i_clic,
585 $icpath = $this->icpath,
586 $zc = $this->zc,
587 $ch_rel = $this->ch_rel,
588 $zretour = $this->zretour
589 );
590 }
591 // =========================================================================
592 elseif ($typ_arb == 'path') // === Afficher comme un chemin du clic
593 // =========================================================================
594 {
595 echo $this->getpath (
596 $mn = $this->mn,
597 $iclic = $this->i_clic
598 );
599 }
600 // =========================================================================
601 elseif ($typ_arb == 'infra') // === Afficher comme un sommaire d'infra
602 // =========================================================================
603 {
604 $this->write_infra (
605 $mn = $this->mn,
606 $typ_arb = $typ_arb,
607 $iclic = $this->i_clic,
608 $zc = $this->zc,
609 $ch_rel = $this->ch_rel,
610 $zretour = $this->zretour
611 );
612 }
613 //==========================================================================
614 elseif ($typ_arb == 'plan') // === Afficher comme un plan de site <ul>
615 //==========================================================================
616 {
617 $this->write_plan (
618 $mn = $this->mn,
619 $typ_arb = $typ_arb,
620 $zc = $this->zc,
621 $ch_rel = $this->ch_rel,
622 $zretour = $this->zretour
623 );
624 }
625 //==========================================================================
626
627 //==========================================================================
628 {
629 $this->write_plan2 (
630 $mn = $this->mn,
631 $typ_arb = $typ_arb,
632 $icpath = $this->icpath,
633 $ch_rel = $this->ch_rel,
634 $zretour = $this->zretour
635 );
636
637
638 }
639 // ====================================================================================
640 elseif (substr($typ_arb, 0, 3) == 'lnk') // === Afficher en ouverture de lien dynamique
641 // ====================================================================================
642 {
643 $this->write_link (
644 $mn = $this->mn,
645 $typ_arb = $typ_arb,
646 $zc = $this->zc,
647 $ch_rel = $this->ch_rel
648 );
649 }
650 // =========================================================================
651
652 // =========================================================================
653 {
654 $this->write_prev (
655 $mn = $this->mn,
656 $typ_arb = $typ_arb,
657 $iclic = $this->i_clic,
658 $icpath = $this->icpath,
659 $zc = $this->zc,
660 $ch_rel = $this->ch_rel
661 );
662 }
663 // =========================================================================
664 elseif ($typ_arb == 'next') // === Afficher comme lien vers page suivante
665 // =========================================================================
666 {
667 $this->write_next (
668 $mn = $this->mn,
669 $typ_arb = $typ_arb,
670 $iclic = $this->i_clic,
671 $icpath = $this->icpath,
672 $zc = $this->zc,
673 $ch_rel = $this->ch_rel
674 );
675 }
676 // =================================================================================
677 elseif ($typ_arb == 'main') // === Afficher comme barre de liens vers les essentiels
678 // =================================================================================
679 {
680 $this->write_mainitems (
681 $mn = $this->mn,
682 $typ_arb = $typ_arb,
683 $zc = $this->zc,
684 $ch_rel = $this->ch_rel
685 );
686 }
687 // =========================================
688
689 // =========================================
690 {
691 echo $this->br,
692 '<div class="arbor"><p class="warn"><b>[Arbor] :</b>', $this->br,
693 ' ->write() est utilis&eacute; avec un argument incorrect ! : ', $typ_arb, '</p></div>',
694 $this->br;
695 }
696
697
698 // ===============================================
699
700 // ===============================================
701
702 if ($this->log)
703 {
704 $t = explode(' ', microtime()); // clore la mesure du temps (en secondes)
705 $exec_addtime = ((float)$t[0] + (float)$t[1]) - $exec_starttime;
706
707 $this->exec_time += $exec_addtime; // cumuler le temps
708
709
710
711 }
712
713
714
715 } // --- fin de la fonction write()
716
717
718
719
720 /***************************************************************************//**
721
722
723 *
724 * @access private
725 * @return none
726 */
727 function write_arbre (
728 $mn, // tableau du menu
729 $typ_arb, // type d'affichage
730 $i_clic, // index du clic dans le menu
731
732 $hilight, // couleur de surlignage du clic
733
734
735
736
737
738
739
740 )
741 {
742
743 $imax = count($mn) - 1; // index maxi du tableau de menu
744
745 // --- Initialiser le code Html du menu
746
747 $menu = '<!-- Menu arborescent Arbor.php ' . $this->version . ", http://arbor.stalikez.info -->\n<div class=\"arbor\">\n";
748
749 // --- Message d'avertissement de refus des cookies (mode explorateur uniquement)
750
751 if ($this->datamode == 'explorer')
752 {
753
754 // le message au premier affichage de l'arborescence donc avant que le
755
756
757 if (!isset($_COOKIE['zexpl']) && $i_clic > -1)
758 {
759 echo '<div class="arbor"><p class="warn"><b>[Arbor] : </b>Votre navigateur doit accepter les cookies pour pouvoir d&eacute;ployer correctement cette arborescence !', $this->br,
760 'Modifiez le param&eacute;trage de votre navigateur...</b></p></div>';
761 }
762 }
763
764
765
766 if ($retic)
767 {
768 $decal = 16;
769 }
770
771 // ----------------------------------------------------------------------------
772
773 // ----------------------------------------------------------------------------
774
775 for($i = 0; $i <= $imax; $i++)
776 {
777
778
779
780 if ($mn[$i]['vis'])
781 {
782
783 $ligne = ''; // initialisation du code HTML de la ligne courante
784
785
786 // --- Balise ouvrante du DIV d'indentation de la ligne
787
788
789 {
790 if ($i< $imax)
791 {
792
793 $flagbrother = False;
794 $ib = $i;
795 while ($ib++ < $imax)
796 {
797 if ($mn[$ib]['niv'] == $mn[$i]['niv'])
798 {
799 $flagbrother = True;
800 break;
801 }
802 elseif ($mn[$ib]['niv'] < $mn[$i]['niv'])
803 {
804 break;
805 }
806 }
807
808
809
810 // chaque niveau d'indentation, avec deux variantes : standard
811
812 if ($flagbrother)
813 {
814 $ligne .= ' <div class="zr' . $mn[$i]['niv'] . '" style="padding-left:' . ($mn[$i]['niv'] * $decal) . 'px">';
815 }
816 else
817 {
818 $ligne .= ' <div class="zr' . $mn[$i]['niv'] . 'e" style="padding-left:' . ($mn[$i]['niv'] * $decal) . 'px">';
819 }
820 }
821
822 {
823 $ligne .= ' <div class="zr' . $mn[$i]['niv'] . 'e" style="padding-left:' . ($mn[$i]['niv'] * $decal) . 'px">';
824 }
825
826 }
827
828 {
829 $ligne .= ' <div style="padding-left:' . ($mn[$i]['niv'] * $decal) . 'px">';
830 }
831
832
833
834
835 $ligne .= $this->gettaglink($mn, $i, $zc, $ch_rel, $typ_arb, $zretour);
836
837 // --- Balise de l'icone de "treillis" (plus|moins)
838
839 if ($tree)
840 {
841 $ligne .= $this->gettagicone($mn, $i, $icpath, $tree, $ch_rel, $forced_ic = False);
842 }
843
844
845
846
847
848
849 if ($symb)
850 {
851 $ligne .= $this->gettagicone($mn, $i, $icpath, $symb, $ch_rel, $forced_ic = True);
852 }
853
854
855
856
857 // par l'utilisateur dans le fichier de menu
858
859 if (($i != $i_clic) || ($hilight == ''))
860 {
861 $ligne .= ' ' . $mn[$i]['txt'] . '</a>';
862 }
863 else
864 {
865 $ligne .= '<span style="background-color:'. $hilight . ';padding:2px"> ' . $mn[$i]['txt'] . '</span></a>';
866 }
867
868 // --- fin de la ligne : fermeture du DIV d'indentation de la ligne
869
870 $ligne .= "</div>\n";
871
872 // --- ajouter la ligne Html au menu
873
874 $menu .= $ligne;
875
876
877 }// --- fin du saut conditionnel si ligne visible ou non
878
879 // -----------------------------------------------------------
880
881 // -----------------------------------------------------------
882
883
884 // Ecrire le menu dans le document
885
886 echo $menu, "</div>\n<!-- fin menu arborescent Arbor.php -->\n";
887
888 } // --- fin de la fonction write_retic()
889
890
891
892
893
894
895
896 /***************************************************************************//**
897
898 *
899 * @access private
900 * @return none
901 */
902 function write_nav1 (
903 $mn, // tableau du menu
904 $typ_arb, // type d'affichage
905 $i_clic, // index du clic dans le menu
906
907
908
909 )
910 {
911 $fil = '';
912
913 $flagbold = True; // pour mettre en gras la position courante
914
915
916 foreach($this->idx_path as $i)
917 {
918
919
920 {
921 $htm = $mn[$i]['txt'];
922 }
923
924 {
925 $htm = $this->gettaglink($mn, $i, $zc, $ch_rel, $typ_arb, $zretour) . $mn[$i]['txt'] . '</a>';
926 }
927
928
929 if ($flagbold)
930 {
931 $htm = '<b>' . $htm . '</b>';
932 $flagbold = False;
933 }
934
935
936 $i != $i_clic ? $fil = $htm . ' &gt; ' . $fil : $fil = $htm;
937 }
938
939
940 // Ecrire le fil d'Ariane dans le document
941 echo '<!-- Fil d\'Ariane (ligne) Arbor.php ', $this->version, " -->\n<div class=\"arbor\">\n<div class=\"za1\">" , $fil , "</div>\n</div>\n<!-- fin fil d'Ariane Arbor.php -->\n";
942
943
944 } // --- fin de la fonction write_nav1()
945
946
947
948 /***************************************************************************//**
949
950 *
951 * @access private
952 * @return none
953 */
954 function write_nav2 (
955 $mn, // tableau du menu
956 $typ_arb, // type d'affichage
957 $i_clic, // index du clic dans le menu
958
959
960
961
962 )
963 {
964
965 // Initialiser le code Html du fil d'Ariane
966
967 $fil = '';
968
969 $flagbold = True; // pour mettre en gras la position courante
970
971
972 foreach($this->idx_path as $i)
973 {
974
975
976
977 {
978 $htm = ' ' . $mn[$i]['txt'] ;
979 }
980
981 {
982 $htm = ' ' . $this->gettaglink($mn, $i, $zc, $ch_rel, $typ_arb, $zretour) . $mn[$i]['txt'] . '</a>';
983 }
984
985
986 if ($flagbold)
987 {
988 $htm = '<b>' . $htm . '</b>';
989 $flagbold = False;
990 }
991
992 if ($mn[$i]['niv'] != 0)
993 {
994 //$htm = ' &gt; ' . $htm ;
995 $htm = '<img style="border:none" src="' . $ch_rel . $icpath . 'nv.gif" alt="&gt;"' . $this->ferm . $htm;
996 }
997
998
999
1000 $fil = ' <div style="margin-left:' . (($mn[$i]['niv'] * 30) + 50) . 'px">' . $htm . "</div>\n" . $fil;
1001 }
1002
1003
1004 // Ecrire l'arbre de navigation dans le document
1005
1006 echo '<!-- Fil d\'Ariane (arbre) Arbor.php ', $this->version, " -->\n<div class=\"arbor\"><div class=\"za1\">\n" ,
1007 $fil ,
1008 "</div></div>\n<!-- fin fil d'Ariane Arbor.php -->\n";
1009
1010 } // --- fin de la fonction write_nav2()
1011
1012
1013
1014 /***************************************************************************//**
1015
1016 *
1017 * @access private
1018 * @return none
1019 */
1020 function write_infra (
1021 $mn, // tableau du menu
1022 $typ_arb, // type d'affichage
1023 $i_clic, // index du clic dans le menu
1024
1025
1026
1027 )
1028 {
1029
1030 $imax = count($mn) - 1; // index maxi du tableau de menu
1031
1032 echo '<!-- Menu infra Arbor.php ', $this->version, " -->\n";
1033
1034 $htm = "<ul>\n";
1035
1036
1037
1038
1039 {
1040 $nv = -1;
1041 }
1042 else
1043 {
1044
1045 }
1046
1047
1048
1049
1050
1051
1052 $flagligne = False;
1053
1054 for($i = $i_clic + 1; $i <= $imax; $i++)
1055 {
1056 if ($mn[$i]['niv'] == $nv + 1)
1057 {
1058
1059 $htm .= '<li>' . $this->gettaglink($mn, $i, $zc, $ch_rel, $typ_arb, $zretour) . $mn[$i]['txt'] . "</a></li>\n";
1060 $flagligne = True;
1061 }
1062 elseif ($mn[$i]['niv'] <= $nv)
1063 {
1064 break;
1065 }
1066 }
1067
1068 $htm .= "</ul>\n";
1069
1070
1071 // une balise "<ul></ul>"" vide, ce qui serait invalide en XHTML.
1072 if ($flagligne)
1073 {
1074
1075 }
1076
1077 echo "<!-- fin menu infra Arbor.php -->\n";
1078
1079 } // --- fin de la fonction write_infra()
1080
1081
1082
1083
1084 /***************************************************************************//**
1085
1086
1087 *
1088 * @access private
1089 * @return none
1090 */
1091 function write_plan (
1092 $mn, // tableau du menu
1093 $typ_arb, // type d'affichage
1094
1095
1096
1097 )
1098 {
1099
1100 $imax = count($mn) - 1; // index maxi du tableau de menu
1101
1102 //--- Initialiser le plan de site
1103
1104 $plan = '<!-- Plan de site Arbor.php ' . $this->version . " -->\n<div class=\"arbor\">\n";
1105
1106
1107 // Ouverture du conteneur global <ul> du plan de site (liste des racines)
1108 $plan .= "<ul>\n";
1109
1110
1111
1112
1113
1114
1115 for($i = 0; $i <= $imax; $i++)
1116 {
1117
1118
1119 $ligne = $this->gettaglink($mn, $i, $zc, $ch_rel, $typ_arb, $zretour) . $mn[$i]['txt'] . '</a>';
1120
1121
1122
1123 if ($mn[$i]['niv'] == 0)
1124 {
1125 $ligne = '<li><b>' . $ligne . "</b></li>\n";
1126 }
1127 else
1128 {
1129 $ligne = '<li>' . $ligne . "</li>\n";
1130 }
1131
1132 // Ajouter la ligne au bloc du plan
1133 if ($mn[$i]['niv'] == $nv)
1134 {
1135 // Niveaux idem -> ajout simple
1136 $plan .= $ligne;
1137 }
1138 elseif ($mn[$i]['niv'] > $nv)
1139 {
1140
1141
1142 // On ajoute la ligne en supprimant la vilaine double puce
1143
1144 $plan .= "<li style='list-style-type:none'><ul>\n" . $ligne;
1145 }
1146 elseif ($mn[$i]['niv'] < $nv)
1147 {
1148
1149
1150 // avant d'ajouter la ligne
1151 for($n = $nv; $n > $mn[$i]['niv']; $n--)
1152 {
1153 $plan .= "</ul></li>\n";
1154 }
1155
1156 $plan .= $ligne;
1157 }
1158
1159
1160
1161
1162
1163
1164
1165
1166 for($i = $nv; $i >= 1; $i--)
1167 { $plan .= "</ul></li>\n"; }
1168
1169 $plan .= "</ul>\n</div>\n"; // fermer le conteneur global du plan (liste des racines)
1170
1171
1172 // --- Ecrire le bloc du plan sur le document
1173
1174 echo $plan , "<!-- fin plan de site Arbor.php -->\n";
1175
1176 } // --- fin de la fonction write_plan()
1177
1178
1179
1180
1181 /***************************************************************************//**
1182
1183
1184 *
1185 * @access private
1186 * @return none
1187 */
1188 function write_plan2 (
1189 $mn, // tableau du menu
1190 $typ_arb, // type d'affichage
1191
1192
1193
1194 )
1195 {
1196
1197
1198
1199 $memo_mini = $this->mini;
1200 $this->mini=False;
1201
1202
1203 $imax = count($mn) - 1;
1204 for($i = 0; $i <= $imax; $i++)
1205 {
1206 $mn[$i]['vis'] = 1;
1207 }
1208
1209
1210 $this->write_arbre (
1211 $mn = $mn,
1212 $typ_arb = 'a',
1213 $iclic = -1,
1214 $decal = 16,
1215 $hilight = '',
1216 $icpath = $icpath,
1217 $retic = True,
1218 $tree = '',
1219 $symb = '',
1220 $zc = '1',
1221 $ch_rel = $ch_rel,
1222 $zretour = $zretour
1223 );
1224
1225
1226
1227 $this_mini = $memo_mini;
1228
1229 }
1230
1231
1232
1233
1234 /***************************************************************************//**
1235 * Construit une balise <a ...> d'ouverture d'un lien dynamique
1236
1237 *
1238 * Si la cible du lien est absente du fichier de menu, un message
1239
1240 *
1241 * @access private
1242 * @return none
1243 */
1244 function write_link (
1245 $mn, // tableau du menu
1246 $typ_arb, // type d'affichage
1247
1248
1249 )
1250 {
1251
1252 // Extraire la cible du lien "lnk:cible"
1253 $pg = substr($typ_arb, 4);
1254
1255
1256
1257 $i = 0;
1258 $flagtrouve = False;
1259 foreach($mn as $ligne)
1260 {
1261
1262 {
1263 // Ecrire la balise de lien et quitter
1264 echo $this->gettaglink($mn, $i, $zc, $ch_rel, $typ_arb);
1265 $flagtrouve = True;
1266 break;
1267 }
1268 $i++;
1269 }
1270
1271 if(! $flagtrouve)
1272 {
1273 echo $this->br,
1274 '<div class="arbor"><p class=warn><b>[Arbor] : </b>La cible du lien est introuvable dans le fichier de menu actuel !', $this->br,
1275 '1) V&eacute;rifiez la correction du libell&eacute; du lien : "<b>', ltrim($typ_arb, 'lnk:') , '</b>"', $this->br,
1276 '2) V&eacute;rifiez que ce lien est bien pr&eacute;sent dans le fichier de menu de l\'arborescence...</p><div>';
1277 }
1278
1279 } // --- fin de la fonction write_link()
1280
1281
1282
1283
1284 /***************************************************************************//**
1285
1286 * du menu qui contienne un lien.
1287 *
1288
1289 *
1290 * @access private
1291 * @return none
1292 */
1293 function write_prev (
1294 $mn, // tableau du menu
1295 $typ_arb, // type d'affichage
1296 $i_clic, // index du clic dans le menu
1297
1298
1299
1300 )
1301 {
1302
1303 if($i_clic > 0)
1304 {
1305 $i = $i_clic - 1;
1306 while ($i >= 0)
1307 {
1308 if ($mn[$i]['fich'] != '')
1309 {
1310 echo '<span class="arbor">',
1311 $this->gettaglink($mn, $i, $zc, $ch_rel, $typ_arb), $mn[$i]['txt'],
1312 '&nbsp;<img style="border:none;vertical-align:middle" src="',
1313 $ch_rel, $icpath, 'prev.gif" alt="&lt;"',
1314 $this->ferm, '</a></span>';
1315 break;
1316 }
1317 $i--;
1318 }
1319 }
1320 }
1321
1322
1323
1324
1325 /***************************************************************************//**
1326
1327 * du menu qui contienne un lien.
1328 *
1329
1330 *
1331 * @access private
1332 * @return none
1333 */
1334 function write_next (
1335 $mn, // tableau du menu
1336 $typ_arb, // type d'affichage
1337 $i_clic, // index du clic dans le menu
1338
1339
1340
1341 )
1342 {
1343
1344 $imax = count($mn) - 1; // index maxi du tableau de menu
1345
1346 if($i_clic < $imax)
1347 {
1348 $i = $i_clic + 1;
1349 while ($i <= $imax)
1350 {
1351 if ($mn[$i]['fich'] != '')
1352 {
1353 echo '<span class="arbor">',
1354 $this->gettaglink($mn, $i, $zc, $ch_rel, $typ_arb),
1355 '<img style="border:none;vertical-align:middle" src="',
1356 $ch_rel, $icpath, 'next.gif" alt="&gt;"',
1357 $this->ferm, '&nbsp;', $mn[$i]['txt'], '</a></span>';
1358 break;
1359 }
1360 $i++;
1361 }
1362 }
1363 }
1364
1365
1366
1367 /***************************************************************************//**
1368
1369
1370
1371 *
1372 * @since Version 2.8
1373 * @access private
1374 * @return none
1375 */
1376 function write_mainitems (
1377 $mn, // tableau du menu
1378 $typ_arb, // type d'affichage
1379
1380
1381 )
1382
1383 {
1384
1385
1386
1387 foreach ($this->mainitems as $i)
1388 {
1389 $htm .= $this->gettaglink($mn, $i, $zc, $ch_rel, $typ_arb) . $mn[$i]['txt'] . '</a> | ';
1390 }
1391
1392 $htm = rtrim($htm, ' | ');
1393
1394
1395 echo '<div class="arbor">', "\n", $htm, "</div>\n" ;
1396
1397 }
1398
1399
1400
1401 /***************************************************************************//**
1402
1403
1404
1405 * essentiels).
1406
1407 *
1408 * @access private
1409 * @return array Tableau converti au format interne
1410 */
1411 function convdata (
1412 $data_menu, // tableau-source issu du fichier de menu
1413
1414
1415 )
1416 {
1417
1418
1419
1420
1421
1422 {
1423 $i = 0; // index dans $mn, le tableau-cible
1424
1425
1426
1427
1428 if ($data_menu[0][0] == '+')
1429 {
1430 echo '<div class="arbor"><p class = "warn"><b>[Arbor] : </b>La premi&egrave;re ligne de l\'arborescence n\'est pas une ligne racine !', $this->br,
1431 'Supprimez tous les "+" en t&ecirc;te de cette ligne...</p></div>' ;
1432 }
1433
1434
1435
1436
1437
1438
1439 if ((count($data_menu) != strlen($zdv)) && (strlen($zdv) != 1))
1440 {
1441 $zdv = '1';
1442 }
1443
1444 // ====================================================================
1445
1446 // ====================================================================
1447
1448 foreach($data_menu as $ligne)
1449 {
1450
1451
1452 $nv = strrpos ($ligne,'+');
1453 $nv === False ? $nv = 0 : $nv++;
1454
1455
1456
1457
1458 if ($nv > $nv_mem + 1)
1459 {
1460 echo '<div class="arbor"><p class="warn"><b>[Arbor] : </b>Indentation incoh&eacute;rente &agrave; la ligne <b>', ($i + 1), '</b> de l\'arborescence !</p></div>' ;
1461 }
1462
1463
1464
1465
1466
1467
1468
1469
1470 // de la ligne
1471
1472 $t = substr($ligne, $nv);
1473
1474
1475 $t = $tmp[0];
1476 array_key_exists(1, $tmp) ? $ic = $tmp[1] : $ic = '';
1477
1478
1479 $t = $tmp[0];
1480 array_key_exists(1, $tmp) ? $stl = $tmp[1] : $stl = '';
1481
1482
1483 $t = $tmp[0];
1484 array_key_exists(1, $tmp) ? $lnk = $tmp[1] : $lnk = '';
1485
1486
1487 if ($t[0] == '!')
1488 {
1489 $this->mainitems[] = $i;
1490 $t = substr($t, 1); // supprimer le "!"
1491 }
1492
1493
1494
1495 // par l'utilisateur dans le fichier de menu pour l'application
1496 // des styles(valeur de $typ_styl)
1497
1498 switch ($typ_styl)
1499 {
1500 case 'auto' : {$stl = '"z' . $nv . '"'; break;}
1501 case 'manuel' : {$stl = '"' . $stl . '"'; break;}
1502 case '' : {$stl = '"z"'; break;}
1503 default : {$stl = '"' . $typ_styl . '"';}
1504 }
1505
1506
1507 $dv = substr($zdv, $i, 1);
1508 switch ($dv)
1509 {
1510 case '1' : {$v = 1; break;}
1511 default : {$v = 0;}
1512 }
1513
1514
1515 if ($nv == 0)
1516 {
1517 $v = 1;
1518 }
1519
1520
1521 $mn[$i]['niv'] = $nv ; // niveau d'indentation
1522
1523 $mn[$i]['fich'] = $lnk ; // lien
1524
1525 $mn[$i]['stl'] = $stl ; // style
1526 $mn[$i++]['ic'] = $ic ; // style
1527
1528
1529
1530 } // fin du balayage 'foreach' du tableau-source
1531
1532
1533
1534
1535
1536 // ======================================================================================
1537
1538 // ======================================================================================
1539
1540
1541
1542
1543
1544
1545 for($i = 0; $i < $imax; $i++)
1546 {
1547
1548
1549 {
1550 $mn[$i]['typ'] = 'F';
1551 $mn[$i]['dev'] = 0;
1552 }
1553 else // c'est une ligne de choix ou racine
1554 {
1555 $mn[$i]['typ'] = 'N';
1556
1557 (($mn[$i+1]['niv'] > $mn[$i]['niv']) && ($mn[$i+1]['vis'] == 1)) ? $mn[$i]['dev'] = 1 : $mn[$i]['dev'] = 0;
1558 }
1559 }
1560
1561
1562 $mn[$imax]['typ'] = 'F';
1563 $mn[$imax]['dev'] = 0;
1564
1565
1566
1567 }
1568
1569 {
1570 die('<div class="arbor"><p class="warn"><b>[Arbor] : </b>Les donn&eacute;es de l\'arborescence sont soit absentes du fichier de menu, soit incorrectes ou corrompuees !' . $this->br .
1571 'V&eacute;rifiez la syntaxe des donn&eacute;es du fichier de menu (guillemets, virgules, etc.) ...</p><div>');
1572 }
1573
1574 return($mn); // retourner le tableau converti
1575
1576 } // --- fin fonction convdata()
1577
1578
1579
1580
1581 /***************************************************************************//**
1582
1583 * de menu.
1584 *
1585
1586
1587 *
1588 * @access private
1589 * @return array Tableau des index du chemin du clic
1590 */
1591 function devred (
1592
1593 $i_clic, // index du clic dans le menu
1594
1595 )
1596 {
1597
1598
1599
1600 $imax = count($mn) - 1; // index maxi du tableau de menu
1601
1602 if ($i_clic > -1) // index du clic, lu dans l'url ("-1" si rien dans url)
1603 {
1604
1605 $niv_clic = $mn[$i_clic]['niv']; // niv de ref (niv de la ligne du clic)
1606
1607
1608
1609 // ---
1610
1611 $i = $i_clic;
1612
1613 // ===================================================
1614
1615 //====================================================
1616 {
1617 $mn[$i++]['dev'] = 0 ;
1618
1619 // masquer les niveaux sup.
1620 while (($i <= $imax) && ($mn[$i]['niv'] > $niv_clic))
1621 {
1622 $mn[$i]['dev'] = 0;
1623 $mn[$i++]['vis'] = 0;
1624 }
1625 }
1626
1627 // ==================================================
1628
1629 // ==================================================
1630 {
1631
1632
1633
1634 while (($i <= $imax) && ($mn[$i]['niv'] >= $niv_clic + 1))
1635 {
1636 $mn[$i]['niv'] == $niv_clic + 1 ? $mn[$i++]['vis'] = 1 : $i++;
1637 }
1638
1639
1640 if ($mini === False)
1641 {
1642
1643
1644
1645
1646 $mn[$i_clic]['vis'] = 1;
1647
1648 // balayage des lignes soeurs suivantes
1649 $i = $i_clic;
1650 while (($i <= $imax) && ($mn[$i]['niv'] >= $niv_clic))
1651 {
1652 if ($mn[$i]['niv'] == $niv_clic)
1653 {
1654 $mn[$i]['vis'] = 1;
1655 }
1656 $i++;
1657 }
1658
1659 $i = $i_clic;
1660 while (($i > 0) && ($mn[$i]['niv'] >= $niv_clic))
1661 {
1662 if ($mn[$i]['niv'] == $niv_clic)
1663 {
1664 $mn[$i]['vis'] = 1;
1665 }
1666 $i--;
1667 }
1668 }
1669
1670
1671
1672
1673
1674 else
1675 {
1676
1677
1678
1679 $mn[$i_clic]['vis'] = 1;
1680
1681
1682 $niv_vis = $mn[$i_clic]['niv'];
1683
1684 for($i = $i_clic - 1; $i > 0; $i--)
1685 {
1686 if($mn[$i]['niv'] < $niv_vis)
1687 {
1688 $niv_vis = $mn[$i]['niv'];
1689 }
1690 elseif($mn[$i]['niv'] == $niv_vis)
1691 {
1692 $mn[$i]['vis'] = 1;
1693 $mn[$i]['dev'] = 0;
1694 }
1695 elseif($mn[$i]['niv'] > $niv_vis)
1696 {
1697 $mn[$i]['vis'] = 0;
1698 $mn[$i]['dev'] = 0;
1699 }
1700 }
1701
1702
1703 // scanner en avant en diminuant progressivement le palier du niveau d'affichage
1704 $niv_palier = $mn[$i_clic]['niv'] + 1;
1705
1706 for($i = $i_clic + 1; $i <= $imax; $i++)
1707 {
1708 if($mn[$i]['niv'] < $niv_palier)
1709 {
1710 $mn[$i]['vis'] = 1;
1711 $mn[$i]['dev'] = 0;
1712 $niv_palier = $mn[$i]['niv'];
1713 }
1714 elseif($mn[$i]['niv'] == $niv_palier)
1715 {
1716 $mn[$i]['vis'] = 1;
1717 $mn[$i]['dev'] = 0;
1718 }
1719 elseif($mn[$i]['niv'] > $niv_palier)
1720 {
1721 $mn[$i]['vis'] = 0;
1722 $mn[$i]['dev'] = 0;
1723 }
1724 }
1725 } // --- fin option de minimalisation
1726
1727
1728
1729 // -------------------------------------------------------------
1730
1731
1732
1733
1734
1735
1736
1737 // --- Boucle de balayage en remontant dans le menu
1738 for ($i = $i_clic ; $i >= 0 ; $i--)
1739 {
1740 if (($i == $i_clic) or ($mn[$i]['niv'] < $nv))
1741 {
1742 $idx_path[] = $i;
1743
1744 }
1745 }
1746
1747 } // --- fin if ($i_clic > -1)
1748
1749 return $idx_path;
1750
1751 } // --- fin fonction devred()
1752
1753
1754
1755
1756
1757 /***************************************************************************//**
1758
1759 *
1760
1761
1762
1763 * Ascii strict (a-z, A-Z) et reste donc utilisable dans une url.
1764 *
1765 * @access private
1766
1767 */
1768 function compacter (
1769
1770 )
1771 {
1772
1773
1774
1775
1776
1777
1778 {
1779 $car = $txt[$p];
1780
1781
1782 if (substr($txt, $p + 1, 1) === $car)
1783 {
1784
1785
1786
1787
1788
1789 $lenseg = 0; // longueur du segment
1790
1791 do
1792 {
1793 $lenseg ++;
1794
1795 {
1796 break 1;
1797 }
1798 }
1799 while($lenseg < 27);
1800
1801
1802 // a-z(97-122)('0') ou A-Z (65-90)('1')
1803
1804 $car == '0' ? $dcl = 95 : $dcl = 63;
1805 $res = $res . Chr($lenseg + $dcl);
1806
1807 }
1808
1809 {
1810
1811 $p++;
1812 }
1813 }
1814
1815
1816 return($res);
1817
1818 } // --- fin fonction compacter()
1819
1820
1821
1822
1823
1824 /***************************************************************************//**
1825
1826 *
1827
1828 * la fonction 'compacter'.
1829 *
1830 * @access private
1831
1832 */
1833 function decompacter (
1834
1835 )
1836 {
1837
1838 // Nb : ne pas placer strlen($txt) dans une variable avant la boucle
1839
1840
1841 for($p = 0 ; $p < strlen($txt) ; $p++)
1842 {
1843 $as = ord($txt[$p]);
1844
1845 {
1846 $txt = substr($txt, 0, $p) . str_repeat('0', $as - 95) . substr($txt, $p + 1);
1847 }
1848
1849 {
1850 $txt = substr($txt, 0, $p) . str_repeat('1', $as - 63) . substr($txt, $p + 1);
1851 }
1852 }
1853
1854 return($txt);
1855
1856 } // --- fin fonction decompacter()
1857
1858
1859
1860
1861 /***************************************************************************//**
1862
1863
1864 *
1865
1866
1867 *
1868 * @access private
1869 * @return string Code html de la balise <img ... >
1870 */
1871 function gettagicone (
1872 $mn, // le tableau de menu
1873 $i, // index dans le menu
1874
1875
1876
1877
1878 )
1879 {
1880
1881 if ($forced_ic && $mn[$i]['ic'] != '')
1882 {
1883 $ic = $mn[$i]['ic'];
1884 }
1885 else
1886 {
1887
1888
1889 {
1890 if ($this->datamode == 'menufile')
1891 {
1892 $ic .= '3';
1893 }
1894 else // datamode 'explorer'
1895 {
1896
1897 {
1898
1899 }
1900 else
1901 {
1902 $ic .= '3';
1903 }
1904 }
1905 }
1906
1907 {
1908 $ic .= '2';
1909 }
1910
1911 {
1912 $ic .= '1';
1913 }
1914 }
1915
1916
1917
1918 // Retourner la balise <img ...>
1919
1920 return '<img style="border:none" src="' . $ch_rel . $path_ic . $ic . '.gif" alt=""' . $this->ferm;
1921
1922
1923 } // --- fin fonction gettagicone()
1924
1925
1926
1927
1928 /***************************************************************************//**
1929
1930
1931 *
1932 * @access private
1933 * @return string Code html de la balise <a ... >
1934 */
1935 function gettaglink (
1936 $mn, // le tableau de menu
1937 $i, // index courant dans le tableau de menu
1938
1939
1940 $typ_arb, // type d'arborescence
1941
1942 )
1943 {
1944
1945
1946
1947
1948
1949
1950 if($lk == '') // lien vide (en mode fichier de menu) ou mode explorateur
1951 {
1952 // Un lien vide devrait entrainer le rappel de la page courante par le navigateur
1953 // mais ce comportement est variable suivant les versions des navigateurs
1954 // donc on construit un lien de rappel explicite :
1955 $lk = substr(strrchr($_SERVER['SCRIPT_NAME'], '/'), 1);
1956
1957 if ($this->datamode == 'menufile')
1958 {
1959 $para = '?clc=' . $i . '&amp;zc=' . $zc;
1960
1961
1962
1963 foreach($_GET as $k => $v)
1964 {
1965 if ($k != 'clc' && $k != 'zc')
1966 {
1967 $para .= '&amp;' . $k . '=' . $v;
1968 }
1969 }
1970 }
1971 else // ($this->datamode == 'explorer')
1972 {
1973 $para = '?' . str_replace('&', '&amp;', $_SERVER['QUERY_STRING']);
1974
1975 // ajouter l'index du clic pour l'explorateur de fichiers
1976 if ($para != '?')
1977 {
1978 $para .= '&amp;' . 'ix=' . $i;
1979 }
1980 else
1981 {
1982 $para .= 'ix=' . $i;
1983 }
1984 }
1985
1986 }
1987
1988 {
1989
1990
1991
1992
1993
1994 strpos($lk,'?') ? $para = '&amp;' : $para = '?';
1995
1996
1997
1998
1999 {
2000
2001
2002
2003
2004
2005
2006 }
2007
2008 {
2009
2010 $para .= $zretour;
2011 }
2012 else // lien standard
2013 {
2014
2015 }
2016 }
2017
2018
2019 $lk = $ch_rel . $lk;
2020
2021
2022 if ($this->log)
2023 {
2024 $chk = explode('?', $lk);
2025 if (! @fopen($chk[0], 'r') )
2026 {
2027 // on se sert d'un pseudo-type d'arborescence comme flag de lien mort
2028
2029 $typ_arb = 'deadlnk' ;
2030 }
2031 }
2032
2033
2034 // style du lien (classe de la balise <a>)
2035
2036 if($typ_arb == 'a')
2037 {
2038 $clstyl = ' class=' . $mn[$i]['stl'];
2039 }
2040 elseif(($typ_arb == 'nav1') || ($typ_arb == 'nav2'))
2041 {
2042 $clstyl = ' class="za2"' ;
2043 }
2044 elseif(($typ_arb == 'prev') || ($typ_arb == 'next'))
2045 {
2046 $clstyl = ' class="zpn"' ;
2047 }
2048 elseif($typ_arb == 'infra')
2049 {
2050 $clstyl = ' class="z"' ;
2051 }
2052 elseif($typ_arb == 'plan')
2053 {
2054 $clstyl = ' class="zpl"' ;
2055 }
2056 elseif($typ_arb == 'main')
2057 {
2058 $clstyl = ' class="zm"' ;
2059 }
2060 elseif($typ_arb == 'deadlnk')
2061 {
2062 $clstyl = ' class="zdead"' ;
2063 }
2064 else
2065 {
2066 $clstyl = '';
2067 }
2068
2069
2070 return('<a' . $clstyl . ' href="' . $lk . $para . '">');
2071
2072
2073 } // --- fin fonction gettaglink()
2074
2075
2076
2077
2078
2079 /***************************************************************************//**
2080 * Construit dynapiquement et retourne un tableau $user-data contenant des
2081
2082 *
2083
2084
2085
2086 *
2087 * @access private
2088
2089 */
2090 function build_data_from_dir (
2091
2092
2093 )
2094 {
2095
2096
2097 $rootdir = trim($rootdir, '/');
2098 if ($rootdir == '')
2099 {
2100 $rootdir = '.';
2101 }
2102
2103 if (!is_dir($rootdir))
2104 {
2105
2106 . '", car ce dossier est introuvable sur le serveur !' . $this->br .
2107 'V&eacute;rifiez le nom du dossier et son chemin (qui doit &ecirc;tre relatif au document) ...</p></div>');
2108 }
2109
2110
2111
2112 $u_data = array(
2113 'urlcompact' => False,
2114 'icpath' => 'mnu/',
2115 'tree' => 'p',
2116 'symb' => 'd',
2117 'decal' => 16,
2118 'hilight' => '#FFC76F',
2119 'typstyl' => 'zex',
2120 'datamenu' => array()
2121 );
2122
2123
2124 $fichs = $this->getdircontent($rootdir, $ext);
2125
2126
2127 include 'file_types.php';
2128
2129
2130 foreach($fichs as $fich)
2131 {
2132 // indentation : compter les '/'
2133
2134 $ligne = str_repeat('+', substr_count($fich, '/') - 1) . basename($fich);
2135
2136
2137 $typ = strToLower(strrchr($fich, '.'));
2138
2139 foreach ($file_types as $k => $exts)
2140 {
2141 if (in_array($typ, $exts ))
2142 {
2143 $ligne .= '#' . $k;
2144 break;
2145 }
2146 }
2147
2148 $u_data['datamenu'][] = $ligne;
2149
2150 }
2151
2152
2153 return($u_data);
2154
2155 } // --- fin de la fonction build_data_from_dir()
2156
2157
2158
2159
2160 /***************************************************************************//**
2161
2162 *
2163
2164
2165 * @access private
2166 * @return array Tableau des chemins
2167 */
2168 function getdircontent (
2169
2170
2171 )
2172 {
2173
2174
2175
2176 $rep = openDir($rootdir);
2177
2178 // -------------------------------------------------------
2179
2180 // -------------------------------------------------------
2181
2182
2183
2184
2185 while($fich = readDir($rep))
2186 {
2187 if (($fich != '.') && ($fich != '..'))
2188 {
2189
2190 {
2191 $dirs[] = $rootdir . '/' . $fich ;
2192 }
2193 else // c'est un fichier, on le saute
2194 {
2195 }
2196 }
2197 }
2198
2199
2200 natcasesort($dirs);
2201
2202
2203 foreach($dirs as $dir)
2204 {
2205 $contents[] = $dir ;
2206 $nbitems = count($contents);
2207 $contents = array_merge($contents, $this->getdircontent($dir, $ext));
2208
2209
2210 {
2211 // on ajoute un faux contenu
2212 $contents[] = $rootdir . '/' . $fich . '/(vide)';
2213 }
2214 }
2215
2216
2217 // ---------------------------------------------------------
2218
2219 // ---------------------------------------------------------
2220
2221 rewindDir($rep);
2222
2223
2224
2225 while($fich = readDir($rep))
2226 {
2227 if (($fich != '.') && ($fich != '..'))
2228 {
2229
2230 {
2231 }
2232 else // c'est un fichier, on l'ajoute
2233 {
2234 if ($ext) // filtrage suivant l'extension du fichier
2235 {
2236 if (strrchr(strToLower($fich), '.') == $ext)
2237 $fichs[] = $rootdir . '/' . $fich;
2238 }
2239 else
2240 $fichs[] = $rootdir . '/' . $fich;
2241 }
2242 }
2243 }
2244
2245 // on trie le tableau des fichiers avant de l'ajouter au contenu
2246 natcasesort($fichs);
2247 $contents = array_merge($contents, $fichs);
2248
2249
2250 // ---
2251
2252 closeDir($rep);
2253
2254 return $contents;
2255
2256 } // --- fin de la fonction getdircontent()
2257
2258
2259
2260
2261 /***************************************************************************//**
2262
2263 *
2264 * @access public
2265 * @since Version 2.1
2266 * @param string $mn Tableau du menu en cours
2267 * @param int $i_clic Index du clic dans le menu
2268
2269 */
2270 function getpath (
2271 $mn, // Tableau du menu en cours
2272 $i_clic // Index du clic dans le menu
2273 )
2274 {
2275 $fil = '';
2276
2277
2278 foreach($this->idx_path as $i)
2279 {
2280 // ajouter au chemin
2281 $i != $i_clic ? $fil = $mn[$i]['txt'] . '/' . $fil : $fil = $mn[$i]['txt'];
2282 }
2283
2284 return './' . $fil;
2285 }
2286
2287
2288
2289
2290 /***************************************************************************//**
2291
2292 * des liens conservant le pilotage des arborescences.
2293 *
2294 * @access public
2295 * @since Version 2.1
2296
2297 */
2298 function geturlpara()
2299 {
2300 return 'clc=' . $this->i_clic . '&amp;zc=' . $this->zc ;
2301 }
2302
2303
2304
2305
2306 /***************************************************************************//**
2307
2308
2309 *
2310 * @access public
2311 * @since Version 2.6
2312 * @return none
2313 */
2314 function showinfo()
2315 {
2316
2317 if ($this->log)
2318 {
2319
2320
2321
2322
2323 // --- Version du script
2324
2325 $this->log .= '<b>Version d\'Arbor</b> :' . $this->br .
2326 ' - Version d\'Arbor utilis&eacute;e : ' . $this->version . $this->br ;
2327
2328
2329
2330 // une instanciation en mode minimaliste ($datasource = 'chk') et
2331
2332 $newver = @file_get_contents('http://arbor.stalikez.info/_chkver.php');
2333
2334 if ($newver)
2335 {
2336 $this->log .= ' - Version disponible en ligne (http://arbor.stalikez.info) : ' . $newver . $this->br;
2337 }
2338 else
2339 {
2340 $this->log .= ' - Version disponible en ligne (<a href="http://arbor.stalikez.info">http://arbor.stalikez.info</a>) : Echec de la connexion...' . $this->br;
2341 }
2342 $this->log .= $this->br;
2343
2344
2345
2346
2347 if ($this->datamode == 'menufile')
2348 {
2349
2350 $flagOK = True;
2351 $mn = $this->mn;
2352 $imax = count($mn) -1;
2353
2354 // Boucle de balayage du menu
2355 for($i = 0; $i <= $imax; $i++)
2356 {
2357
2358 $lk = $mn[$i]['fich'];
2359
2360 if ($lk != '')
2361 {
2362 if (($lk[0] == '*') || ($lk[0] == ':'))
2363 {
2364
2365 }
2366
2367
2368 $lk = $this->ch_rel . $lk;
2369
2370 $chk = explode('?', $lk);
2371 if (! @fopen($chk[0], 'r') )
2372 {
2373 $this->log .= $this->br . ' - Lien mort, ligne ' . ($i + 1) . ' : "' . $lk . '"';
2374 $flagOK = False;
2375 }
2376 }
2377 }
2378
2379 if ($flagOK)
2380 {
2381 $this->log .= 'OK' . $this->br . $this->br;
2382 }
2383 else
2384 {
2385 $this->log .= $this->br . $this->br;
2386 }
2387
2388 }
2389
2390
2391
2392 // --- Afficher le log dans le document
2393
2394 echo '<div class="arbor"><p class="warn">', $this->log, '</p></div>';
2395 }
2396
2397 }
2398
2399
2400
2401 } // --- fin de la Classe Arbor
2402
2403 ?>

 

Interface de la classe Arbor <> Explorer le site

 

 

Arbor Home

 

Home Accueil

Contact Chercher

Contact Contact

Site Plan Plan du site

Page top Haut de page

Valid XHTML 1.0 Strict