ФорумПрограммированиеPHP для идиотов → Организация многоуровневого меню

Организация многоуровневого меню

  • kolobok

    Сообщения: 48 Репутация: N Группа: Кто попало

    Spritz 9 декабря 2011 г. 12:48, спустя 2 дня 17 часов 45 минут

    В который раз пытаюсь правильно понять и нашел как раз то, что мне надо воспроизвести: http://www.rutector.ru/price/index.shtml
    Буду рад, если кто прочтет и попытается помочь.
    Расскажу как я это вижу, а вы меня поправьте где я ошибся.
    1. Таблица, например catalog_menu: id, имя, описание, url
    Например запись вида: 1,Сварочное оборудование, описание, url=welding
    2. Таблица основная, большущая category: category_id, url, parent_id, name, описание
    Например запись вида: 135, welding, 0, Сварочные агрегаты, описание
    Например запись вида: 1344, welding, 135, Сварочные агрегаты 150-200А, описание
    3. Таблица, тоже огромная например: product: product_id, category_id, другие характеристики продукта
    Как я вижу цепочку запросов из базы:
    1. уровень (http://www.rutector.ru/price/index.shtml):
    SELECT FROM catalog_menu
    Пошел цикл. При выводе списка формируются ссылки вида <a href=..?welding></a>
    В подцикле делаем построение подменю (потомков):
    SELECT FROM category WHERE url='welding' AND parent_id = 0;
    Вроде основное меню построено.
    2. При клике на заголовок меню (http://www.rutector.ru/price/welding/index.shtml)
    Делаем проверку на потомков, если есть выводим подсписок, если родитель то оформляем его как заголовок.
    SELECT FROM category WHERE url='welding' AND parent_id=0
    получаем массив row[category_id], далее подцикл проверки потомков:
    SELECT FROM category WHERE parent_id = row[category_id]
    2.1. Вот тут совсем мне понятно. При клике на родителя (например: http://www.rutector.ru/price/welding/index.shtml?category_id=136)
    вываливается список продукции в виде таблиц разбитых по категориям. Во первых, я так понимаю все таки в таблице category получается 2 поля parent_id? Т.е вот еще один потомок http://www.rutector.ru/price/welding/index.shtml?category_id=1205. Как то его тоже надо учитывать, и во вторых мне не понятно как строятся таблицы, ведь у каждой категории свои поля, характеристики.
    Точно также не понятна структура таблицы product. Там у многих изделий совсем разные характеристики, т.е у кого то есть характеристика Сила тока, а у кого то есть Макс. поднимаемый вес. У меня одна только догадка что сделано куча полей и только нужные из них заполняются, но это как то совсем не эффективно, или для последних потомков там свои таблицы? Вобщем помогите понять, как же все таки такие каталоги делаются!
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 9 декабря 2011 г. 14:29, спустя 1 час 40 минут 13 секунд

    kolobok, по деревьям, читай это на официалке.
    А по структуре таблиц, то тут многие-ко-многим. То есть несколько таблиц (таблица с самой продукцией, таблица с характеристиками, связывающая таблица), а не одна сплошная, ибо это реально не правильно. Вообще правильная структура - это меньше проблем в будущем при расширении. А так как у большинства эти проблемы есть, то можно смело сказать что идеальное решение найти сложно, потому каждый делает как ему удобней.
    В общем, можно взять любой простой интернет-магазин и разобрать его на предмет изучения структуры и алгоритмов работы. Главное брать что-то простенькое, но качественное. Тот же ШопСкрипт вполне подойдет для такой задачи.
  • kolobok

    Сообщения: 48 Репутация: N Группа: Кто попало

    Spritz 19 декабря 2011 г. 16:18, спустя 10 дней 1 час 49 минут

    Givi, спасибо за советы, с каталогом разобрался, запнулся на хранении данных продукции, то о чем ты советовал со связывающей таблицей. Я наверное не то делаю, но я выбрал следующее хранение данных:
    таблица product в которой хранится product_id и table_id ну и category_id
    таблица p_table в которой хранится table_id и соответствующее table_name, т.е связывающая таблица
    и дальше пошли таблицы с данными продукции, например:
    welding31 (table_name = welding31) в которой product_id, category_id, name и характеристики относящиеся к конкретной категории.
    Получается, что в моем случае будет наверное где то штук 200 таблиц, не знаю, правильно ли это, или я явно не туда пошел, но запнулся я на выводе информации
    о продукции, т.е если кликнули на конкретный продукт - т.е передали product_id то я выдергиваю соответствующие данные из соответствующей таблицы, НО, как организовать вывод? Поясню, допустим через связывающую таблицу я узнал что продукт находится в таблице welding31, я выбрал все данные относящиеся к моему product_id, и вот как мне написать теперь что-то типа: Вес - 30кг, Ток 10А, Напряжение 12В…? Т.е я не могу сделать шаблон, ведь у каждой таблицы свои характеристики. В голове родился только жуткий вариант делать проверку, вроде если таблица welding31 то данные выводим такие то, но 200 штук переключателей конечно бред. Как тут быть, или я вобще все не так сделал?
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 19 декабря 2011 г. 17:17, спустя 58 минут 36 секунд

    kolobok, products, parameters, parameters_in_products. Примерно так.
    products = product_id, product_name, product_price (по сути все данные, свойственные ТОЛЬКО ЭТОМУ товару)
    parameters = parameter_id, parameter_name (то есть тут просто список характеристик, без всяких значений).
    parameters_in_products = product_id, parameter_id, value. Это я есть та связывающая таблица, которая кроме связки несет в себе ещё и показатели характеристик товара.

    По сути я тебе показываю один из вариантов + его ещё можно "обустроить" разными нужными тебе вещами, как-то привязка определенных характеристик определенным категориям, привязка к одному товару нескольких цен и т.д. Но это тебе пока не нужно. Сначала разберись с этим, чтоб понять как можно добавить товар с любым кол-вом характеристик, которое можно уменьшить/увеличить в любой момент для любого товара + научись грамотно делать выборку всего этого из базы. А потом уже и более сложное можно делать.
  • kolobok

    Сообщения: 48 Репутация: N Группа: Кто попало

    Spritz 20 декабря 2011 г. 9:19, спустя 16 часов 2 минуты 19 секунд

    Givi, понял, спасибо! Только перенос данных для меня немного не комфортный будет, ну да главное правильный фундамент)
    На счет привязки характеристик к категориям, я думаю тут просто нужна еще одна таблица.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!