| 
<?php
/*
 Name: SB Menu - A PHP Class for Building Menus
 - Simple Test Usage For Showing a Directory and its Subdirectories and their contents
 
 File: class.sb_menu.test.directory.php
 License: BSD 3-Clause License <https://opensource.org/licenses/BSD-3-Clause>
 Description: An example usage of class to show a directory listing and its subdirectories and their contents
 
 Info:
 I left js and css in this file to keep it more contained. Pretty much duplicated from class.sb_menu.test.simple.php
 Look in <body></body> section for the part that matters for this example.
 
 Version: 1.0
 
 PHP Version: 8+
 
 REQUIRED PHP CLASSES: class.sb_menu.php
 
 Author: https://www.phpclasses.org/browse/author/144301.html
 */
 
 include_once("class.sb_menu_1.0.php");
 
 
 // extend the main Tree class to add a custom render() method
 
 class SimpleTree_Extended extends Tree {
 
 public function render($addClass='') {
 $pre = "\r\n\r\n<div class='sbmenu ".$addClass."'><div class='container'>\r\n\r\n";
 $post = "\r\n</div></div><!-- sbmenu //-->\r\n";
 
 $output = $this->renderNode($this->root, 0);
 
 return $pre.$output.$post;
 }
 
 private function renderNode(TreeNode $node, $depth)
 {
 $output = '';
 
 if($depth > 0) # skip first node as it is the main node. Just show sublevels
 {
 $id     = $node->data['id'];
 $label  = $node->data['label'];
 
 $has_children = true;
 if(empty($node->children))
 $has_children = false;
 
 $root = '';
 if($depth == 1)
 $root = "root";
 
 # cheap padding
 $pad = "\t";
 $pad_left = str_repeat($pad, $depth);
 
 $html_pad = "   ";
 $html_pad_left = str_repeat($html_pad, $depth);
 
 
 $output .= "$pad_left<div class='node $root' depth=".$depth.">\r\n";
 
 $extra_html = '';
 // if we have child nodes
 if($has_children)
 $extra_html .= "<div class='arrow'></div>\r\n";
 
 $add_class = '';
 if($has_children)
 $add_class = 'has-submenu';
 
 
 $output .= "$pad_left$pad_left<div class='label $add_class' d=$depth>$html_pad_left".$label."</div>$extra_html\r\n";
 if($has_children)
 foreach ($node->children as $child)
 $output .= $this->renderNode($child, $depth+1);
 
 $output .= "$pad_left</div><!-- depth=$depth //-->\r\n\r\n";
 
 return $output;
 }
 else {
 foreach ($node->children as $child)
 $output .= $this->renderNode($child, $depth+1);
 }
 
 return $output;
 }
 
 } // end class MyTree extends Tree
 
 
 
 
 ?>
 <!DOCTYPE html>
 <html>
 <head>
 <title>SB Menu - A PHP Class for Building Menus - Simple Test Usage</title>
 
 <!-- jquery -->
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
 
 
 <!-- BEGIN JS //-->
 <script>
 // page uses jQuery
 // docready
 $(document).ready(function () {
 // Toggle nodes when a label with 'has-submenu' class is clicked
 $('.label.has-submenu')
 .off('click')
 .on('click', function () {
 
 // // make slide effect
 $(this).siblings('.node').slideToggle(60);
 
 // $(this).parent().find('.arrow').first().toggleClass('active');
 $(this).toggleClass('active');
 });
 });
 </script>
 <!-- END JS //-->
 
 <!-- BEGIN CSS //-->
 
 
 
 <style>
 .sbmenu {
 position:relative;
 display:block;
 /* make click through */
 pointer-events:none;
 
 /* make it look like a menu */
 font-family:Arial, Helvetica, sans-serif;
 text-align:center;
 
 /* disable text selection */
 -webkit-user-select:none;
 -moz-user-select:none;
 -ms-user-select:none;
 -o-user-select:none;
 user-select:none;
 
 font-size:0.9em;
 width:100%;
 
 vertical-align:top;
 
 }
 .sbmenu .container {
 display:block;
 position:relative;
 
 text-align:center;
 vertical-align:top;
 
 
 }
 .sbmenu div {
 position:relative;
 vertical-align:top;
 margin:0px;padding:0px;
 min-width:10em;
 }
 .node {
 display:none;
 pointer-events:auto;
 }
 .root {
 display:inline-block;
 position:relative;
 top:0px;
 }
 
 .unhide {
 display:block;
 }
 
 .label {
 position:relative;
 
 display:block;
 padding:0.6em;
 
 padding-left:3em;
 padding-right:3em;
 
 cursor:pointer;
 text-align:left;
 }
 
 .label[d="1"]{
 font-size:1.2em;
 text-align:center;
 font-weight:bold;
 border-bottom:1px solid #ccc;
 padding-bottom:0.3em;
 margin-bottom:0.1em;
 padding-top:0.5em;
 }
 
 .label:hover {
 background-color:orange;
 color:white;
 cursor: pointer;
 }
 
 /* add an arrow text decoration to has-submenu */
 .label.has-submenu::after {
 color:#ccc;
 text-align:right;
 /* right arrow */
 content: " ?";
 font-size:1em;
 position:absolute;
 right:0px;
 } /* when clicked rotate */
 .label.has-submenu.active::after {
 color:orange;
 content: " ?";
 font-size:1em;
 }
 
 
 /* if mobile... */
 @media (max-width: 780px) {
 .sbmenu .container {
 text-align:left;
 width:100%;
 }
 .sbmenu .node {
 text-align:left;
 width:100%;
 }
 .sbmenu .label {
 text-align:left;
 width:100%;
 font-size:1.2em;
 }
 
 }
 
 
 </style>
 
 
 
 <!-- END CSS //-->
 
 </head>
 
 <body>
 
 
 
 
 <?php
 //
 // BEGIN DIRECTORY LISTING EXAMPLE
 
 echo "<hr>";
 echo "<pre>";
 
 // SET THE DIRECTORY TO READ DIRS/SUBDIRS/FILES FROM
 $dir = "./";
 
 // a function to use our SimpleTree to build a menu from a directory structure
 function bmenu($dir, $node = NULL) {
 if($node == NULL)
 $node = new TreeNode($dir);
 
 $cdir = scandir($dir);
 foreach ($cdir as $key => $value) {
 if (!in_array($value, array(".", ".."))) {
 if (is_dir($dir . DIRECTORY_SEPARATOR . $value)) {
 $new_node = $node->addChild(new TreeNode($value));
 bmenu($dir . DIRECTORY_SEPARATOR . $value, $new_node);
 } else {
 $node->addChild(new TreeNode($value));
 }
 }
 }
 }
 
 // create a new menu // .. using the extended class to seperate the render() method
 $menu = new SimpleTree_Extended(new TreeNode('Main Menu'));
 
 // our main node title that is visible
 $node = new TreeNode('ROMS');
 
 // build the menu from the directory structure
 bmenu($dir, $node);
 
 // add the node to the menu
 $menu->root->addChild($node);
 
 
 echo "</pre>   ";
 
 echo $menu->render();
 
 
 
 // END DIRECTORY LISTING EXAMPLE
 //
 ?>
 
 
 
 </body>
 </html>
 |