PDA

View Full Version : RESOLVED - generating an html list


Peuplarchie
06-23-2008, 01:07 AM
Good day to you all,
The following code read recursively a directory and return the content in a html list.

What I need to do is when the class "fly" is use the </li> tag should be after the the next level, like follow :




MY WAY
<ul class="sub">
<li><a href="http://test.com/test_images.php" class="fly">Gatineau - Ottawa</a></li>
<ul>
<li><a href="http://test.com/test_images.php" class="">Aylmer</a></li>
<li><a href="http://test.com/test_images.php" class="">Gatineau Park - Parc de la Gatineau</a></li>
<li><a href="http://test.com/test_images.php" class="">Misc. - Divers</a></li>
<li><a href="http://test.com//test_images.php" class="">Nat. Capital of Canada - Capital Nat. du Canada</a></li>
</ul>

<li><a href="http://test.com/test_images.php" class="fly">Gatineau - Ottawa</a></li>
<ul>
<li><a href="http://test.com/test_images.php" class="">Aylmer</a></li>
<li><a href="http://test.com/test_images.php" class="">Gatineau Park - Parc de la Gatineau</a></li>
<li><a href="http://test.com/test_images.php" class="">Misc. - Divers</a></li>
<li><a href="http://test.com//test_images.php" class="">Nat. Capital of Canada - Capital Nat. du Canada</a></li>
</ul>


</ul>


THE GOOD WAY
<li><a href="#nogo11" class="fly">Zoom</a>
<ul>
<li><a href="#nogo12">35mm to 125mm</a></li>
<li><a href="#nogo13">50mm to 250mm</a></li>
<li><a href="#nogo14">125mm to 500mm</a></li>
</ul>
</li>





Now here is my code :



echo "<ul class=\"sub\">\r";
function dirlist($dir)
{
$ul = true;
$dh = opendir($dir);
$isLeaf = true;
while (false !== ($file = readdir($dh)))
{
if ($file == '.' || $file == '..')
{
$subs = true;
continue;
}
$filed = $file;
$file = $dir . '/' . $file;
$aHasDirs = array();
$aHasDirs = glob(realpath($file) . '/*', GLOB_ONLYDIR);
if (count($aHasDirs) > 0)
{
$class = 'fly';
$ul = true;
}
else
{
$class = '';
$ul = false;
}

if (is_dir($file))
{
$isLeaf = false;
echo ' <li><a href="http://test.com/test_images.php?folder=' . $file . '" class="' . $class . '">' . $filed . '</a></li>';
echo "\n";

if (!$isLeaf && $ul)
{
echo " <ul>\n";
}
dirlist($file);
if (!$isLeaf && $ul)
{
echo " </ul>\n";
}
}
}
}
dirlist ("Pictures/Pics/Pic-S", false);

echo "</ul>";




Thanks and take care !

Fou-Lu
06-23-2008, 02:55 AM
I thought I gave you the correct code before? Maybe it was old code... thats ok, this is what you want methinks:

function dirlist($dir, $startDepth = 0)
{
static $depth;
$spaceMulti = 4;
$depth = empty($depth) ? $startDepth : $depth;
$dh = opendir($dir);
$isLeaf = false;
$depth++;

while (false !== ($file = @readdir($dh)))
{
if ($file == '.' || $file == '..')
{
continue;
}
$dirPath = $dir . '/' . $file;
$aHasDirs = array();
$aHasDirs = glob(realpath($dir . '/' . $file) . '/*', GLOB_ONLYDIR);
if (count($aHasDirs) > 0)
{
$class = 'fly';
$isLeaf = false;
}
else
{
$class = '';
$isLeaf = true;
}

if (is_dir($dirPath))
{
echo "\n" . str_repeat(' ', $spaceMulti * $depth) .
'<li><a href="http://test.com/test_images.php?folder=' . $dirPath . '" class="' . $class . '">' . $file . '</a>';
if (!$isLeaf)
{
$depth++;
echo "\n" . str_repeat(' ', $spaceMulti * $depth) . "<ul>";
dirlist($dirPath);
echo "\n" . str_repeat(' ', $spaceMulti * $depth) . "</ul>";
$depth--;
echo "\n" . str_repeat(' ', $spaceMulti * $depth) . "</li>";
}
else
{
echo "</li>";
dirlist($dirPath);
}
}
}
fclose($dh);
$depth--;
}

You will of course need to control the list opening and closing with this. I was too lazy to put that one in too >.<
This ones a bit smoother since I've added the indentation for the depth. Is that what you are looking for? I was so sure thats what I gave you before (minus the indents)

Peuplarchie
06-23-2008, 03:39 AM
You had given me a good answer.
It's just that my needs had change.
That is what I'm looking for, thi is what I need.
but it return an error with the str_repeat :

Warning: str_repeat() [function.str-repeat]: Second argument has to be greater than or equal to 0. in test.com on line 420

Fou-Lu
06-23-2008, 03:41 AM
Thats from your implementation call:

dirlist ("Pictures/Pics/Pic-S", false);

Remove the second argument for the function call, and either pass nothing in or a number >= 0. Its funny since false is technically 0, I half expected that it would take it.

Peuplarchie
06-23-2008, 03:55 AM
You got it !
You're the best !