Скрипт рекурсивного меню, не показывающий никаких элементов при нацеливании на определенный идентификатор - PullRequest
0 голосов
/ 03 мая 2018

У меня есть рекурсивное меню, которое позволяет мне пройти бесконечное количество шагов.

Это работает для всего моего меню, но я хотел бы применить этот скрипт только к одной кнопке меню (магазин), а не ко всем остальным.

Моя кнопка не будет отображаться.

Это мой старый рекурсивный скрипт:

$menu = "
SELECT cat.id as cat_id, cat.level, cat.parent_id, cat.title as cat_title, cat.alias as 
cat_alias, cat.published, cat.rgt, cnt.state, cnt.id as content_id, cnt.catid, cnt.title as content_title, cnt.alias 
as content_alias
FROM snm_categories cat
LEFT JOIN snm_content cnt
ON cnt.catid = cat.id
WHERE cat.id NOT IN (1, 2, 3, 4, 5, 7)
AND cat.published = 1
GROUP BY cat.id
ORDER BY cat.rgt ASC";
$menuconn = $conn->query($menu);
// Maak een nieuwe array om te vullen met onderstaand resultaat
$menuData = array(
    'items' => array(),
    'parents' => array()
);
// Maak een nieuwe array met simpelweg items en parents, welke gekoppeld zitten aan cat_id/parent_id
while($menu = $menuconn->fetch_assoc())
{
    $menuData['items'][$menu['cat_id']] = $menu;
    $menuData['parents'][$menu['parent_id']][] = $menu['cat_id'];
}

// Functie om menu te maken, $parentId is 1 (de categorieen die geen parent hebben)
function buildMenu($parentId, $menuData)
{
    $html = '';
    if (isset($menuData['parents'][$parentId]))
    {
        //Als parent_id gelijk is aan 1 gooi een li eromheen (want het is geen subcat) anders een ul
        if($parentId == '1'){
          $html = '<li>';
        }else{
          $html = '<ul class="sub-menu">';
        }
        foreach ($menuData['parents'][$parentId] as $itemId)
        {
            $html .= '<li class="menu-item"><a href="'.$menuData['items'][$itemId]['cat_alias'].'">' 
                    .$menuData['items'][$itemId]['cat_title'].'</a>';

            // Voer deze functie uit binnen de functie loop (recursief)
            $html .= buildMenu($itemId, $menuData);

            $html .= '</li>';
        }
        //Als parent_id gelijk is aan 1 gooi een li eromheen (want het is geen subcat)
        if($parentId == '1'){
          $html .= '</li>';
        }else{
          $html .= '</ul>';
        }
    }
    return $html;
}
// Echo het resultaat van de functie en geef 1 mee als parent_id
echo buildMenu(1, $menuData);

Но я бы хотел это ТОЛЬКО для кнопки моего магазина (с идентификатором 22).

Так вот, что я и сделал (соединил мою старую рукопись и добавил рекурсивную функцию только тогда, когда cat_id равен 22, что является кнопкой моего магазина):

//Haal alle categorieen en check gelijk of de desbetreffende categorie artikelen onder zich heeft hangen.
$menu = "
SELECT cat.id as cat_id, cat.level, cat.parent_id, cat.title as cat_title,  
cat.alias as cat_alias, cat.published, cat.rgt, cnt.state, cnt.id as content_id, cnt.catid, cnt.title as  
content_title, cnt.alias as content_alias
FROM snm_categories cat
LEFT JOIN snm_content cnt
ON cnt.catid = cat.id
WHERE cat.id NOT IN (1, 2, 3, 4, 5, 7)
AND cat.published = 1
AND cat.level = 1
GROUP BY cat.id
ORDER BY cat.rgt ASC";
$menuconn = $conn->query($menu);
//Loop het resultaat
while($menu = $menuconn->fetch_assoc()){
  $cat_ids = '';
  $subcatmenulijst = '';
  $subcats = '';
  //Code om te checken of de huidige pagina gelijk is aan de alias
  if($menu['alias'] == $alias){
    $class='current';
  } else {
    $class = '';
  }

  //Stop alle ids van de categorieen in een array
  $cat_ids[] = $menu['cat_id'];

  //Implodeer ze met commas ertussen zodat ze bruikbaar zijn in een query
  if(!empty($cat_ids)) {
    $useableids = implode(',', $cat_ids);
  }
  // Query voor de subcats
  $subcatmenu         = 'SELECT * FROM snm_categories WHERE parent_id IN ('.$conn->real_escape_string($useableids).') and published = 1 ORDER BY lft';
  $subcatmenucon      = $conn->query($subcatmenu);
  while($subcatmenu   = $subcatmenucon->fetch_assoc()){
    $subcatmenulijst .= '<li><a href="info/'.$subcatmenu['alias'].'.html">'.$subcatmenu['title'].'</a></li>';
  }
  // Als
  if(!empty($subcatmenulijst)){
    $subcats = 'true';
  }
  // IF BUTTON IS NOT THE SHOP BUTTON
  if($menu['cat_id'] != 22){
  //Loop alle categorieen
  $menuresult .= '<li class="'.$class.'"><a href="info/'.$menu['cat_alias'].'.html">'.$menu['cat_title'].'</a>';
  //Haal alle artikelen op waar het catid gelijk is aan het id van een categorie (binnen bovenstaande loop, zodat het gebeurd voor elke categorie)
  $submenu = "SELECT * FROM snm_content WHERE catid = '".$conn->real_escape_string($menu['cat_id'])."' AND state = 1 ORDER BY ordering";
  $submenuconn = $conn->query($submenu);

    //Als er het id van een artikel niet leeg is (dus als er artikelen onder hangen) OF als er subcategorieeen aanwezig zijn:
    if(!empty($menu['content_id']) OR $subcats == 'true'){
      $menuresult .= '<ul class="sub-menu">';
      //Loop het resultaat
      while($submenu = $submenuconn->fetch_assoc()){
        $menuresult .= '<li><a href="'.$submenu['alias'].'.html">'.$submenu['title'].'</a></li>';
      }
      // Plak de categorieen onder artikelen
      $menuresult .= $subcatmenulijst;
      $menuresult .= '</ul>';
    }
  // BUT IF IT IS:
  }else{
    ////
    //Haal alle categorieen en check gelijk of de desbetreffende categorie artikelen onder zich heeft hangen.
    $menucatalogus = "
    SELECT cat.id as cat_id, cat.level, cat.parent_id, cat.title as cat_title, cat.alias as cat_alias, cat.published, cat.rgt
    FROM snm_categories cat
    WHERE cat.id NOT IN (1, 2, 3, 4, 5, 7)
    AND cat.published = 1
    GROUP BY cat.id
    ORDER BY cat.rgt ASC";
    $menucatalogusconn = $conn->query($menucatalogus);

    $menuData = array(
        'items' => array(),
        'parents' => array()
    );

    // Maak een nieuwe array met simpelweg items en parents, welke gekoppeld zitten aan cat_id/parent_id
    while($menucatalogus = $menucatalogusconn->fetch_assoc())
    {
        $menuData['items'][$menu['cat_id']] = $menu;
        $menuData['parents'][$menu['parent_id']][] = $menu['cat_id'];

        $arr[] = $menucatalogus;
    }

    // Functie om menu te maken, $parentId is 1 (de categorieen die geen parent hebben)
    function buildMenu($parentId, $menuData)
    {
        //$menuresult = '';
        if (isset($menuData['parents'][$parentId]))
        {
            //Als parent_id gelijk is aan 1 gooi een li eromheen (want het is geen subcat) anders een ul
            if($parentId == '1'){
              $menuresult = '<li>';
            }else{
              $menuresult = '<ul class="sub-menu">';
            }
            foreach ($menuData['parents'][$parentId] as $itemId)
            {
                $arrtje[] = $itemId;
                $menuresult .= '<li class="menu-item"><a href="'.$menuData['items'][$itemId]['cat_alias'].  
                    '">'.$menuData['items'][$itemId]['cat_title'].'</a>';
                // Voer deze functie uit binnen de functie loop (recursief)
                $menuresult .= buildMenu($itemId, $menuData);
                $menuresult .= '</li>';
            }
            //Als parent_id gelijk is aan 1 gooi een li eromheen (want het is geen subcat)
            if($parentId == '1'){
              $menuresult .= '</li>';
            }else{
              $menuresult .= '</ul>';
            }
        }
        return $menuresult;
    }
    // Echo het resultaat van de functie en geef 1 mee als parent_id
    echo buildMenu(22, $menuData);
    ////
  }
  $menuresult .= '</li>';
}
echo $menuresult;

Этот запрос:

SELECT cat.id as cat_id, cat.level, cat.parent_id, cat.title as cat_title, cat.alias as cat_alias, cat.published, cat.rgt
FROM snm_categories cat
WHERE cat.id NOT IN (1, 2, 3, 4, 5, 7)
AND cat.published = 1
GROUP BY cat.id
ORDER BY cat.rgt ASC

Выходы:

enter image description here

А вот этот:

SELECT cat.id as cat_id, cat.level, cat.parent_id, cat.title as cat_title, cat.alias as cat_alias, cat.published, cat.rgt, cnt.state, cnt.id as content_id, cnt.catid, cnt.title as content_title, cnt.alias as content_alias
FROM snm_categories cat
LEFT JOIN snm_content cnt
ON cnt.catid = cat.id
WHERE cat.id NOT IN (1, 2, 3, 4, 5, 7)
AND cat.published = 1
AND cat.level = 1
GROUP BY cat.id
ORDER BY cat.rgt ASC

Выходы:

enter image description here

Кнопка моего магазина (Verhuur) с cat_id 22 не отображается в моем меню? Почему?

На данный момент мое меню выглядит так:

HOME
INFORMATIE
 - ANNULATIE VOORWAARDEN
VEEL GESTELDE VRAGEN
CONTACT

Так что мне не хватает VERHUUR со всеми его подкатегориями.

Мне нужно это как вывод:

HOME
VERHUUR
 - SPRINGKUSSENS
 - WATER ATTRACTIES
 - TRAKTATIES
 - FEESAPPARATUUR
 - STORMBANEN
 - SPECIALE KUSSENS
 - SPORT & SPEL
 - ACTIE PAKKETTEN
INFORMATIE
 - ANNULATIE VOORWAARDEN
VEEL GESTELDE VRAGEN
CONTACT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...