Ik wil een aantal menu items uitladen uit het joomla cms zodat ze vanuit het cms te editen zijn.

Het gaat om deze list met menu items.

<?
<!-- <li class="<? if($pagina == 'home'){echo 'current'; } ?> relative f_xs_none m_xs_bottom_5"><a href="http://www.website.nl/"; class="tr_delay_hover color_light tt_uppercase"><b>Home</b></a></li> -->
<li class="relative f_xs_none m_xs_bottom_5"><a href="javascript:void()" onclick="javascript:goToURL('http://www.website.nl')"; class="tr_delay_hover color_light tt_uppercase"><b>Het bedrijf</b></a>
<!--sub menu-->
<div class="sub_menu_wrap top_arrow d_xs_none type_2 tr_all_hover clearfix r_corners">
<ul class="sub_menu">
<li><a class="color_dark tr_delay_hover" href="home/menu-item1">menu-item1</a></li>
<li><a class="color_dark tr_delay_hover" href="home/menu-item2">menu-item2</a></li>
<li><a class="color_dark tr_delay_hover" href="home/menu-item3">menu-item3</a></li>
<li><a class="color_dark tr_delay_hover" href="home/diensten/menu-item4">menu-item4</a></li>
<li><a class="color_dark tr_delay_hover" href="home/diensten/menu-item5">menu-item5</a></li>
<li><a class="color_dark tr_delay_hover" href="home/diensten/menu-item6">menu-item6</a></li>
en-route">Contact</a></li>
</ul>
</div>
</li>
?>

Dit is de query waarmee ik de menu items ophaal.

<?
// Het bedrijf
$bedrijf = "SELECT * FROM `lb_content` WHERE catid = 26 and state = 1";
$bedrijfcon = $conn->query($bedrijf);
$bedrijfcr = array();
while ($bedrijfcr[] = $bedrijfcon->fetch_array());
?>

Hoe kan ik dit uitlezen en netjes laten zien in een loop?


Ik heb zelf nog wat geprobeerd maar kom er niet echt uit.

<?
$arraylist = array();
foreach($bedrijfcr as $menu1){
if(!in_array($menu1['id'],$arraylist) && $menu1['id'] != ''){
$arraylist[] = $menu1['id'];

$menuitem1 =
'<li class="relative f_xs_none m_xs_bottom_5"><a href="http://www.website.nl"; class="tr_delay_hover color_light tt_uppercase"><b>'.$menu1['title'].'</b></a>
<div class="sub_menu_wrap top_arrow d_xs_none type_2 tr_all_hover clearfix r_corners">
<ul class="sub_menu">';

$sub1 = "SELECT * FROM `lb_content` WHERE catid = ".$menu1['id']." order by created DESC";
$subcon1 = $conn->query($sub1);
$subcr1 = array();
while ($subcr1[] = $subcon1->fetch_array());

}

$i = 1;

foreach($subcr1 as $submenu1){
$menuitem1 = '<li><a class="color_dark tr_delay_hover" href="'.GetSubNaam($submenu1['catid']).'/'.$submenu1['alias'].'">'.$submenu1['title'].'</a></li>';
}

$i++;

$menuitem1 = '</ul>
</div>
</li>';
}
return = $menuitem1;

?>
Maar... had Joomla hier zelf geen functionaliteit voor? In een onderdeel "menus" in de backend?

Daarnaast had Joomla volgens mij ook functies voor het afdrukken/uitdraaien van menu's.

Wat probeer je precies te bereiken?
Thomas van den Heuvel op 03/11/2015 13:17:23

Maar... had Joomla hier zelf geen functionaliteit voor? In een onderdeel "menus" in de backend?

Daarnaast had Joomla volgens mij ook functies voor het afdrukken/uitdraaien van menu's.

Wat probeer je precies te bereiken?


Het is alleen het joomla cms met een custom template. Oftewel de menu items (artikelen) moeten uit de database komen en worden weergeven in de juiste opmaak. Als een artikel onder een bepaalde categorie valt (in dit geval categorie met catid 26) moeten alle artikelen in een list worden geshowed in dat menu (als dropdown onder 'het bedrijf').

Puur php zeg maar, dus niets met joomla variabelen of iets.
Ik zou eerst iets maken dat werkt zonder opmaak, daarna kun je dit menu weer aan gaan kleden. Waarschijnlijk werken de stijlen die je hier aan toe wilt kennen toch niet, omdat de element-structuur (de CSS paden) afwijken. Maar je zou het kunnen proberen, al zou ik eerst simpel beginnen.

Betreft het een lijst (eendimensionaal) of een boom (meerdimensionaal) van gerelateerde artikelen?

Wat je nog steeds zou kunnen bekijken is, als je de data al hebt, of je deze kunt voeren aan een functie die een menu uitdraait, dat lijkt mij nog steeds het makkelijkste. Ook al betreft het maatwerk, dit zou nog steeds moeten kunnen.

Wellicht is het ook handig als je een versienummer vermeldt :).

Thomas van den Heuvel op 03/11/2015 13:34:18

Ik zou eerst iets maken dat werkt zonder opmaak, daarna kun je dit menu weer aan gaan kleden. Waarschijnlijk werken de stijlen die je hier aan toe wilt kennen toch niet, omdat de element-structuur (de CSS paden) afwijken. Maar je zou het kunnen proberen, al zou ik eerst simpel beginnen.

Betreft het een lijst (eendimensionaal) of een boom (meerdimensionaal) van gerelateerde artikelen?

Wat je nog steeds zou kunnen bekijken is, als je de data al hebt, of je deze kunt voeren aan een functie die een menu uitdraait, dat lijkt mij nog steeds het makkelijkste. Ook al betreft het maatwerk, dit zou nog steeds moeten kunnen.

Wellicht is het ook handig als je een versienummer vermeldt :).




Een functie om een menu ervan te maken is er al. Dus dat werkt. Alleen is dat voor een categorien overzicht. Ik wil alleen artikelen laten uitlezen in een menu.

Versienummer is niet van toepassing aangezien het me alleen om de code gaat. Eigenlijk had ik er niet eens bij hoeven vermelden dat het met joomla aangepast kan worden. De tabel lb_content heeft een aantal artikelen die vallen onder een categorie (tabel: lb_categories). Een artikel is met catid gekoppeld aan een categorie. Wat ik graag heb is dat alle artikelen onder de categorie het bedrijf (catid 26) worden uitgelezen in het menu.

Hoe zet ik zoiets op? Ik heb zelf zoals je ziet wat zitten proberen met een for each maar kom er niet uit.

De query die ik heb geplaatst haalt al alle juiste artikelen op. Ik moet alleen de data van die array in het menu plaatsen.

Dit is een menu list item bijvoorbeeld zoals ik hem nu heb:

<?
$menuitem1 = '<li><a class="color_dark tr_delay_hover" href="'.GetSubNaam($submenu1['catid']).'/'.$submenu1['alias'].'">'.$submenu1['title'].'</a></li>';
?>

Dat moet dan zoiets worden:
<?
<li><a class="color_dark tr_delay_hover" href="home/wie-zijn-wij">Wie zijn wij?</a></li>
?>

Een dynamisch menu in principe.
Ik denk dat je meteen alles af kunt drukken, je hoeft dit niet op te sparen in een string.

In die while had je meteen alles al af kunnen drukken wellicht, je gaat hier later met een tweede loop nogmaals doorheen. Het zal zoiets worden:
<?php
// controleer eerst of we resultaten hebben, anders hoef je niet eens een menu te maken
if (count($bedrijfcr) > 0) {
    ?><ul><?php
        // doorloop de resultaten
        foreach ($bedrijfcr as $row) {
            // @todo mogelijk wil je URL-slugs en titels nog escapen op een of andere manier
            ?><li><a class="color_dark tr_delay_hover" href="<?php echo GetSubNaam($row['catid']) ?>/<?php echo $row['alias'] ?>"><?php echo $row['title'] ?></a></li><?php
        }
    ?></ul><?php
}
?>
Thomas van den Heuvel op 03/11/2015 13:50:30

Ik denk dat je meteen alles af kunt drukken, je hoeft dit niet op te sparen in een string.

In die while had je meteen alles al af kunnen drukken wellicht, je gaat hier later met een tweede loop nogmaals doorheen. Het zal zoiets worden:
<?php
// controleer eerst of we resultaten hebben, anders hoef je niet eens een menu te maken
if (count($bedrijfcr) > 0) {
    ?><ul><?php
        // doorloop de resultaten
        foreach ($bedrijfcr as $row) {
            // @todo mogelijk wil je URL-slugs en titels nog escapen op een of andere manier
            ?><li><a class="color_dark tr_delay_hover" href="<?php echo GetSubNaam($row['catid']) ?>/<?php echo $row['alias'] ?>"><?php echo $row['title'] ?></a></li><?php
        }
    ?></ul><?php
}
?>




Op deze manier telt die toch niet hoeveel er in de array zit? Zonder $i/$i++?

Dit is het stuk code voor een productoverzicht wat als menu item word weergeven, alleen gaat het hier om categorien en niet om artikelen. Maar misschien dat je een idee krijgt wat ik bedoel:

<?
$arrayitems = array();
foreach($productcr as $menu){

if(!in_array($menu['id'],$arrayitems) && $menu['id'] != ''){
$arrayitems[] = $menu['id'];

$menuitem = '<div class="f_left f_xs_none">
<b class="color_dark m_left_20 m_bottom_5 m_top_5 d_inline_b">'.$menu['title'].'</b>
<ul class="sub_menu first">';

// Producten
$sub = "SELECT * FROM `lb_categories` WHERE parent_id = ".$menu['id']." order by rgt";
$subcon = $conn->query($sub);
$subcr = array();
while ($subcr[] = $subcon->fetch_array());

foreach($subcr as $id){
if($id['id']){
$id_haarden[] = $id['id'];
}
}

$id_haard = join(',', $id_haarden);

$a = 1;


foreach($subcr as $submenu){

$aantal = count($subcr);

if($submenu['id'] == ''){

}
else
{

if($aantal > 10){
if($a <= 8)
{
$menuitem.= '<li><a class="color_dark tr_delay_hover" href="'.GetSubNaam($submenu['parent_id']).'/'.$submenu['alias'].'">'.$submenu['title'].'</a></li>';
}
}else
{
$menuitem.= '<li><a class="color_dark tr_delay_hover" href="'.GetSubNaam($submenu['parent_id']).'/'.$submenu['alias'].'">'.$submenu['title'].'</a></li>';
}

$a++;

}

}

if($aantal >= 11){

$menuitem.= '<li><a class="color_dark tr_delay_hover" href="merken">Meer</a></li>';

}


$menuitem.=' </ul>
</div>';
echo $menuitem;
}



}

?>


Hier zie je ook dat hij zijn data haalt uit lb_categories, dat moet dus lb_content zijn in het andere menu item. En ipv parent_id(vanuit lb_categories zelf) is het catid(vanuit lb_content)
Als ik het goed begrijp heb je dus nu een menu met enkel categorieën, en deze wil je uitbreiden met (een niveau lager) de artikelen behorende bij deze categorieën?

Je zou dit kunnen programmeren, maar je zou er ook voor kunnen kiezen om dit eenmalig in te richten (het menu uit te breiden met bijbehorende artikelen). Na deze eenmalige inrichting is het een kwestie van het toevoegen van een artikel aan het goede (sub)menu op het moment dat er een nieuw artikel wordt gepubliceerd (of misschien kun je dit proces weer automatiseren met een hook ofzo).

De vraag is: hoeveel werk is het eenmalig inrichten, en hoe vaak worden er nieuwe artikelen geproduceerd. Een voordeel van het handmatig inrichten van zo'n menu is dat je van de standaard menu-functionaliteit gebruik kunt maken?
Thomas van den Heuvel op 03/11/2015 14:09:49

Als ik het goed begrijp heb je dus nu een menu met enkel categorieën, en deze wil je uitbreiden met (een niveau lager) de artikelen behorende bij deze categorieën?

Je zou dit kunnen programmeren, maar je zou er ook voor kunnen kiezen om dit eenmalig in te richten (het menu uit te breiden met bijbehorende artikelen). Na deze eenmalige inrichting is het een kwestie van het toevoegen van een artikel aan het goede (sub)menu op het moment dat er een nieuw artikel wordt gepubliceerd (of misschien kun je dit proces weer automatiseren met een hook ofzo).

De vraag is: hoeveel werk is het eenmalig inrichten, en hoe vaak worden er nieuwe artikelen geproduceerd. Een voordeel van het handmatig inrichten van zo'n menu is dat je van de standaard menu-functionaliteit gebruik kunt maken?


Nee ik heb een menu met verschillende menu knoppen. Onder een van de menu knoppen zit een productenoverzicht, dit overzicht bestaat uit categorien. Dit menuitem heet producten, met een dropdown met alle productcategorien. Nu heb ik een ander menu item dat heet het bedrijf. Daaronder moeten gewoon links van paginas komen (artikelen). Deze informatie komt uit lb_content via de query die ik in de oorspronkelijke post heb neergezet. Het laatste script dat ik heb geplaatst is voor het producten overzicht om een beetje een idee te geven wat ik wil.

Dus menu item 'het bedrijf', met daaronder de artikelen, bijvoorbeeld: wie zijn wij, diensten, contact etc etc. Deze artikelen (wie zijn wij is bijvoorbeeld een artikel) valt onder de categorie 'het bedrijf', vandaar dat hij zoekt op catid 26. 26 is het id van 'het bedrijf'.
Ok, maar wat is er op tegen om deze artikelen in het menu op te nemen? Waarom moet dit dynamisch via code? Nog een bijkomend voordeel van de artikelen in het menu plaatsen is dat je deze daarin vrij kunt sorteren.
Thomas van den Heuvel op 03/11/2015 14:26:20

Ok, maar wat is er op tegen om deze artikelen in het menu op te nemen? Waarom moet dit dynamisch via code? Nog een bijkomend voordeel van de artikelen in het menu plaatsen is dat je deze daarin vrij kunt sorteren.


Omdat er later ook nieuwe artikelen toegevoegd of verwijdert moeten kunnen worden die in het menu te zien zijn. Als ik dus in joomla een artikel toevoeg onder categorie 'het bedrijf' dan moet die dat laten zien in het menu in de dropdown van menuitem 'het bedrijf'

Reageren