Can't figure out how-to generate this menu using a while-loop.
This is an example of my code:
<ul id="nav">
<li><a href="#">Hoofdmenu 1</a>
<ul class="sub">
<li><a href="#">Submenu 1.1</a></li>
<li><a href="#">Submenu 1.2</a></li>
<li><a href="#">Submenu 1.3</a></li>
<li><a href="#">Submenu 1.4</a></li>
</ul>
</li>
<li><a href="#">Hoofdmenu 2</a>
<ul class="sub">
<li><a href="#">Submenu 2.1</a></li>
<li><a href="#">Submenu 2.2</a></li>
<li><a href="#">Submenu 2.3</a></li>
<li><a href="#">Submenu 2.4</a></li>
</ul>
</li>
</ul>
My dbtable looks like:
paginas:
id
title
content
type
When type == id from the parent it should be the submenu.
In my example this works, now I've got to make it dynamic.
Brains ain't working atm.
Thanks for your help!
Used code to get data from db:
<ul id="nav">
<?php
include_once("ond/inc/php/connect.php");
$query = "SELECT * FROM paginas WHERE type = '0'";
$result = mysql_query($query);
while($row = mysql_fetch_object($result)){
echo '<li><a href="?ond='.$row->titel.'">'.$row->titel.'</a>';}
echo '<ul class="sub">';
$query2 = "SELECT * FROM paginas WHERE type = '".$row->id."'";
$result2 = mysql_query($query2);
while($row2 = mysql_fetch_object($result2))
{
echo '<li><a href="?ond='.$row2->titel.'">'.$row2->titel.'</a></li>';
}
echo '</ul>';
echo '</li>';
?>
</ul>
I would do something like this:
First, grab your data out as an array and loop through it for each entry. Then run something like this:
$menuArray = array();
if (empty($type)) // If the entry has no "type", then it's a parent
{
$menuArray[$type]['title'] = $title;
}
else // else, it's a child, so append it to the parent
{
$menuArray[$type]['subitems'][] = $title;
}
Then, having $menuArray
, loop through it to create the menu:
?><ul id="nav"><?php
foreach ($menuArray as $item)
{
?><li><a href="#">$item['title']</a><?php
?><ul class="sub"><?php
foreach ($item['subitems'] as $subItem)
{
<li><a href="#">$subItem</a></li>
}
?></ul><?php
?></li><?php
}
?></ul><?php
Next lines did the solution:
<ul id="nav">
<?php
include_once("ond/inc/php/connect.php");
$query = "SELECT * FROM paginas WHERE type = '0'";
$result = mysql_query($query);
while($row = mysql_fetch_object($result)){
echo '<li><a href="?ond='.$row->titel.'">'.$row->titel.'</a>';
$query2 = "SELECT * FROM paginas WHERE type = '".$row->id."'";
$result2 = mysql_query($query2);
echo '<ul class="sub">';
while($row2 = mysql_fetch_object($result2))
{
echo '<li><a href="?ond='.$row2->titel.'">'.$row2->titel.'</a></li>';
}
echo '</ul>';
echo '</li>';}
?>
</ul>
in this example parent_id column used and ul-li list build with references- it makes only 1 sql query and use recoursion for rendering output, this code can be simply changed for your needs
<?php
/**
* Module for displaying data from items table
*/
class App_Modules_Tree extends App_AbstractModule {
/**
* array for storing data
*
* @var array
*/
private $tree = array();
/**
* html - output of current module
*
* @var string
*/
private $output = '';
/**
* Retreives data from table items.
*
* @return void
*/
private function _getData()
{
$pdo = App_Registry::get('pdo');
$levels = array();
foreach ($pdo->query('SELECT * FROM items ORDER BY parent_id ASC',PDO::FETCH_OBJ) as $k=>$v){
// references
$current = &$levels[ $v->id ] ;
$current['parent_id'] = $v->parent_id;
$current['name'] = $v->name;
if (0 == $v->parent_id){
$this->tree[ $v->id ] = &$current;
} else {
$levels[$v->parent_id ]['children'][$v->id] = &$current;
}
}
}
/*
*App_AbstractModule::preRender overriding
* @return void
*/
protected function preRender()
{
$this->_getData();
}
/**
* recursively build html output.
*
* @return string
*/
private function _render($arr)
{
$this->output.= '<ul>';
foreach ($arr as $k=>$v)
{
$this->output.= '<li>'.$v['name'].'</li>';
if( !empty($v['children'])){
$this->_render($v['children']);
}
}
$this->output.= '</ul>';
return $this->output;
}
/*
*App_AbstractModule::render overriding
* @return string
*/
protected function render()
{
return $this->_render($this->tree);
}
}