Рекурсивное меню с подсчетом товаров - PullRequest
1 голос
/ 11 июля 2011

Я хочу создать рекурсивное меню с включенными итогами продукта, однако я застрял сейчас, потому что я уже сделал Topmenu, однако я не могу найти другой способ сделать это.

Я не хочу использовать много MySQL Queries, потому что это может сделать мой сайт очень медленным.

Код, который я использую:

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);

Ожидаемый результат:

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

Токовый выход:

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

Ответы [ 2 ]

0 голосов
/ 11 июля 2011

Я думаю, это должно приблизить вас к правильному направлению:

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>';
}

Переупорядочив и добавив счетчик текущего элемента к счетчику родительского элемента, вы можете быть уверены, что при выводе iCount, он также будет включать все подсчеты детей.

Я также использовал временную переменную для $menuData['items'][$itemId].Поскольку вы выполняете только три поиска в массиве для этого $ menuData, он может быть не намного эффективнее, но его гораздо проще читать.

0 голосов
/ 11 июля 2011

Я думаю, что ваш запрос возвращает неверный результат.Используйте print '<pre>';print_r($menuData);print '</pre>'; перед вызовом функции buildMenu () и посмотрите, возвращает ли запрос правильные данные или нет.

...