За последние 24 часа нас посетили 22077 программистов и 1118 роботов. Сейчас ищут 730 программистов ...

Многоуровневое дерево категорий с выводом товаров

Тема в разделе "PHP для новичков", создана пользователем genych, 23 дек 2019.

  1. genych

    genych Новичок

    С нами с:
    2 сен 2018
    Сообщения:
    42
    Симпатии:
    3
    Всем привет. Понадобилась реализация вывода на страницу многоуровневого дерева категорий с вложенными в него товарами. Помогите пожалуйста, не могу разобраться.
    controller.php
    Код (Text):
    1. $categories = get_cat();
    2. $categories_tree = map_tree($categories);
    model.php
    Код (Text):
    1. function get_cat() {
    2.     global $connection;
    3.     $query = "SELECT * FROM categories ORDER BY position";
    4.     $res = mysqli_query($connection, $query);
    5.  
    6.     $arr_cat = array();
    7.     while($row = mysqli_fetch_assoc($res)) {
    8.         $arr_cat[$row['category_id']] = $row;
    9.     }
    10.     return $arr_cat;
    11. }
    12.  
    13. function map_tree($dataset) {
    14.     $tree = array();
    15.     foreach ($dataset as $id=>&$node) {
    16.         if (!$node['parent']){
    17.             $tree[$id] = &$node;
    18.         } else {
    19.             $dataset[$node['parent']]['childs'][$id] = &$node;
    20.         }
    21.     }
    22.     return $tree;
    23. }
     
  2. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
  4. genych

    genych Новичок

    С нами с:
    2 сен 2018
    Сообщения:
    42
    Симпатии:
    3
    Я уже взял категории из БД
    Код (Text):
    1. $query = "SELECT * FROM categories ORDER BY position";
    и без проблем с помощью функции map_tree в примере выстроил такое дерево.
    Вопрос в другом, как туда добавить товары
    все ссылки, что кидаете, это все про деревья категорий. Тема категории с ТОВАРАМИ
     
  5. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    чет я не туда посмотрел)) да)) у Вас один запрос))

    такое тяжелое для понимания)) через PID намного проще))

    если надо что бы товары был прямо в этом массиве (хотя обычно не так) тогда брать массив всех товаров - обходить каждый элемент массива категорий - брать из массива товаров все товары которые относятся к этой категории и добавлять еще один вложенный массив..
     
  6. genych

    genych Новичок

    С нами с:
    2 сен 2018
    Сообщения:
    42
    Симпатии:
    3
    Я так и хотел, есть какая-то функция рекурсивного добавления в массив категорий массива товаров? Или может вообще это не нужно? Какой тогда другой способ?
    --- Добавлено ---
    Для полноты понимания опишу задачу. На страницу заказа сайта предоставления услуг я хотел вывести все категории, в которых находились бы таблицы с самими услугами для удобства пользователям. Чтобы они не ходили по всем категориям и услугам а могли бы спокойно это все посмотреть на одной странице. Видел я решение данной задачи выводом табов (сначала главные категории а при нажатии на них и подкатегории), в которых находились бы таблицы с услугами.
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    o_O это троллинг такой ?
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    @genych тебе нужны товары принадлежащие... чему? Всем категориям? -- тогда это просто все товары. Если только выбранному под-дереву категорий, то обойди эту ветку и собери id в массив. Потом запроси товары как
    Код (Text):
    1. ... WHERE cat_id IN($list)
    Где $list это список через запятую
     
  9. genych

    genych Новичок

    С нами с:
    2 сен 2018
    Сообщения:
    42
    Симпатии:
    3
    у услуг, находящимся в таблице БД 'posts' есть строка 'parent'
    В принципе нет проблем с выборкой услуг. Есть проблема добавления массива товаров в массив категорий по 'parent'
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Что такое parent в таблице услуг?
     
  11. genych

    genych Новичок

    С нами с:
    2 сен 2018
    Сообщения:
    42
    Симпатии:
    3
    Название столбца таблицы услуг
    --- Добавлено ---
    а так parent это принадлежность к категории. То есть он равен id категории
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Прекрасно. Услуги - posts, категория - parent. Я ничего не перепутал? Видимо переименовать при копировании рука не поднялась :)

    for each $posts as $post
    .. $postsByCat[post[parent]] = $post

    array_walk_recursive $catTree, f(&$item)
    .. $id = $item[id]
    .. if isset $postsByCat[$id]
    .. .. $item[posts] = $postsByCat[$id]
     
    genych нравится это.
  13. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    я когда то ради интереса дерево через нестеды делал)) потом дальше делал всегда через PID))
    чет как то они мне не зашли))

    ПС я никогда не троллю)) всегда говорю то что думаю и как есть))
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Оффтопик: работаю с сайтом где услуги в таблице store, а пользователи в company. При том, что есть таблица user, но она не используется. Ещё есть postcategory и post_category. Они обе используются для разных целей, ни одна из которых не ясна из названия. Матерюсь на трёх языках. Кто-то сэкономил время на нейминг.
     
  15. genych

    genych Новичок

    С нами с:
    2 сен 2018
    Сообщения:
    42
    Симпатии:
    3
    Перепутал
    таблица категорий, о которой писал выше
    Код (Text):
    1. $query = "SELECT * FROM categories ORDER BY position";
    таблица услуг называется posts (в ней есть связь с категориями по parent)
    --- Добавлено ---
    Здесь есть платные темы?
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Как-то даже жаль удалять такую красоту :)