2011-07-11 14 views
1

Je veux créer un menu récursif avec les totaux du produit inclus, mais je suis coincé maintenant parce que j'ai déjà rendu le menu principal mais je ne trouve pas une autre façon de le faire.Menu récursif avec le nombre de produits

Je ne veux pas utiliser beaucoup de requêtes MySQL car cela peut rendre mon site très lent.

Le code que je utilise:

require 'db.php'; 

$result = mysql_query("SELECT COUNT(c.category_id) AS count, c. category_id, c.parent_id, cd.name, p.product_id FROM category c 
    LEFT JOIN category_description AS cd ON (cd.category_id=c.category_id) 
    LEFT JOIN product_to_category AS ptc ON (ptc.category_id=c.category_id) 
    LEFT JOIN product AS P ON (p.product_id=ptc.product_id) 
    GROUP BY c.category_id  
    ORDER BY c.parent_id,cd.name") or die (mysql_error()); 

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

while ($menuItem = mysql_fetch_assoc($result)) { 
    $menuData['items'][$menuItem['category_id']] = $menuItem; 
    $menuData['parents'][$menuItem['parent_id']][] = $menuItem['category_id']; 
} 

function buildMenu($parentId, $menuData) { 
    $html = ''; 
    if (isset($menuData['parents'][$parentId])) 
    { 
     $html = '<ul>'; 

     foreach ($menuData['parents'][$parentId] as $itemId) { 
      $iCount = ($menuData['items'][$itemId]['product_id'] != NULL) ? $menuData['items'][$itemId]['count'] : '0'; 

      $html .= '<li>' . $menuData['items'][$itemId]['name'] . ' (' . $iCount . ') '; 
      $html .= buildMenu($itemId, $menuData); 
      $html .= '</li>'; 
     } 

     $html .= '</ul>'; 
    } 
    return $html; 
} 
echo buildMenu(0, $menuData); 

Le résultat attendu:

Dell (1) 
--Computer(1) 
---DataCable(1) 
----Extra Sub (0) 

Sortie courant:

Dell (0) 
--Computer(0) 
---DataCable(1) 
----Extra Sub (0) 

Répondre

0

Je pense que votre requête renvoie un résultat erroné. Utilisez print '<pre>';print_r($menuData);print '</pre>'; avant d'appeler la fonction buildMenu() et vérifiez si la requête renvoie des données correctes ou non.

+0

Je reçois le compte pour chaque catégorie correcte, mais mon problème est qu'il rend le TopCat First, et descend à partir de là. Donc, quand je descends, je ne peux jamais obtenir le compte de la catégorie supérieure. Aurai-je besoin d'une autre fonction récursive qui compte tout d'abord? Ou quelle est la meilleure pratique pour ce problème? – DirkZz

0

Je pense que cela devrait vous rapprocher de la direction:

foreach ($menuData['parents'][$parentId] as $itemId) { 
    $menu = buildMenu($itemId, $menuData); 
    $item = $menuData['items'][$itemId]; 
    $iCount = ($item['product_id'] != NULL) ? $item['count'] : '0'; 
    $menuData['items'][$parentId]['count'] += $iCount; 
    $html .= '<li>' . $item['name'] . ' (' . $iCount . ') '; 
    $html .= $menu 
    $html .= '</li>'; 
} 

En réordonnancement puis en ajoutant le nombre de l'élément en cours au nombre de l'élément parent, vous pouvez vous assurer que lorsque vous émettez iCount, il inclura également tous les comptes des enfants. J'ai également utilisé une variable temporaire pour $menuData['items'][$itemId]. Parce que vous ne faites que trois recherches de tableau sur ce $ menuData, cela peut ne pas être beaucoup plus efficace, mais il est beaucoup plus facile à lire.

Questions connexes