Покинул форум
Сообщений всего: 15
Дата рег-ции: Нояб. 2006
Помог: 0 раз(а)
Если это возможно, покажите мне пожалуста, как сделать отображение информации в виде дерева.
Точнее сказать, мне это почти удалось. Вот вся трудность теперь в подмене изображений замыкающей линией "L" (или по-русски "Г")
Есть похожий скрипт с этой функцией "PHP TreeMenu" (http://www.woweb.ru/catalog/47/arch/001.zip), но он полностью на PHP (там чтение из строк - используются несколько другие методы) Мне не понятно, как это делается из MySQL
Это рабочий код. Здесь три таблицы cl. (v_catalog) cg. (v_categoris) t. (v_trade) В общем-то это и видно из запроса SELECT после команды FROM
Всё работает. Но подмены изображения в конце цикла не могу себе представить.
Wange
Отправлено: 08 Ноября, 2006 - 16:52:48
Гость
Покинул форум
Сообщений всего: 87
Дата рег-ции: Июль 2006 Откуда: Екатеринбург
Помог: 0 раз(а)
изначально в мускульных таблицах создается такое отноошение чтобы понять что есть родительская структура и какая по отношению к предыдущей и последующей. так в цикле вывода мы проверяем отношение одного элемента к другому. в аналах используют рекурсию. обычно все определяет два поля id и pid. из базы по порядку принадлежности выбираются значения. в общем все просто. наверное. такие дела.
Покинул форум
Сообщений всего: 15
Дата рег-ции: Нояб. 2006
Помог: 0 раз(а)
Спасибо за ответ!
Я новечок в этих делах и для меня увы не всё так просто.
Значит, нужно как-то паказать в строке запроса, что нужно делать с последним id ?
В MySQL действительно всё сделано именно таким образом, что бы было удобно работать с базой. Особенно, когда база одна (одна и та же таблица), а категорий имеется несколько.
Мне это необходимо на работе. Недавно устроился на новую работу и почти без опыта. И базу начал ставить вполне серьёзно, ореинтируясь на MySQL, а там такой прибомбас... База работает, но её нужно ещё и показать на странице красиво... (чудаки, эти заказчики...)
Wange
Отправлено: 09 Ноября, 2006 - 11:12:30
Гость
Покинул форум
Сообщений всего: 87
Дата рег-ции: Июль 2006 Откуда: Екатеринбург
Покинул форум
Сообщений всего: 15
Дата рег-ции: Нояб. 2006
Помог: 0 раз(а)
Cпасибо! =)
Эту статью видел. Сейчас заново пытаюсь в ней разобраться. Читаю. Но, некоторые вопросы возникают исходя уже из исходных примеров таблицы. Например, в столбце sortorder добавили нули. Там целых два примера и все цифры разные почему-то... Второе, смотрю на строку с запросом, откуда-то идёт сортировка по колонке title. О ней вообще не говорится ни слова в статье... Но, допустим, условно, она существует в этой самой таблице.
Третье, $unprocessed_rows_exist вообще не понятно откуда взялась такая функция, которая больше всего напоминает переменную...
Исходя из представленного примера, следует коментарий -- "Отмечу, что данный алгоритм не зацикливается при наличии строк с битым полем parent" -- исходя из этого, следует вывод, который наводит на мысль, что данный скрипт содран с какого-то скрипта... - Строка SELECT , образно описывает строку запроса по заданной в самой статье таблице. (кстати, авторам, - для наглядного примера, можно было бы и сократить данные в таблице, их слишком много.. трудно разобраться)
Вывод очевиден, - такую статью и я, могу написать. (вот только погодите, найду ответ!)
Не обижайтесь пожалуста. Но, разобраться в изложеном примере, особенно для новечка, - ну очень сложно.
Если найду ответ, выложу в этом топике.
На мой взгляд, это поможет дургим пользователям больше, чем эта статья.
Исходя из моего примера, наглядно видно, что за таблицы в БД, и сколько таблиц вообще (исходя из строки SELECT это видно). Скрипт работает на 100%. Осталось только придумать вывод данных в древевидной форме.
Кстати, к приведённому мною скрипту, не хватает ещё кусочка. Забыл добавить оконцовку.
Вывод данных по категориям товаров (специфика товара в самом каталоге). Поскольку, все товары сортируются по категориям (спецификации). Сами категории содержатся в каждом каталоге (заголовке, названии товара). Ну, а самих таваров, или каталогов, может быть немеренное количество.
$result = mysql_query("SELECT id, title FROM v_catalog ORDER BY id ASC") or die (mysql_error());
$links = array();
while($f=mysql_fetch_array($result)) {
$id=HtmlSpecialChars($f['id']);
$title=HtmlSpecialChars($f['title']);
$links[] = "<a href=?cat=$id>$title</a>";
}
echo implode(", ", $links);
print "</td></tr></tbody></table><br><br>";
/////////// Конец заголовков каталогов
Ну что ещё нужно, что бы исходя из этого примера, наглядно увидеть структуру ?
Могу выложить структуру таблицы для создания базы, что бы данный скрипт заработал.
Но, это уже в следующий раз. Если кому-то это покажется интересным.
evgenijj
Отправлено: 10 Ноября, 2006 - 14:25:52
Участник
Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006 Откуда: Москва
Помог: 10 раз(а)
Во-первых, неправильно спроектирована структура БД. Здесь искусственно накладывается ограничение на уровень вложенности. Трехуровневый каталог - три таблицы. А если понадобится создать еще один уровень - создашь еще одну таблицу SUPERCATALOG? А еще один - MEGACATALOG? В твоем примере нет принципиальной разницы между каталогом и категорией. Каталог - это категория, для которой parentID=0 ( или NULL - это уж кому как больше нравится ).
Теперь, что касается картинки. Положим, мы выбираем из БД категории, для которых parentID=5:
Покинул форум
Сообщений всего: 15
Дата рег-ции: Нояб. 2006
Помог: 0 раз(а)
evgenijj пишет:
Во-первых, неправильно спроектирована структура БД.
Не согласен..
Ну, с чего вы так решили вдруг?
БД уже отработана и работает.
Там нет ничего лишнего. Конечно, можно было бы и переиначить по другому. Вы правы, там есть три таблицы. Они нужны для того, что бы - первая выводила все каталоги товаров. Это очень важно и сам SELECT запрос сортирует всё очень практично и без лишнех нагрузок на сервер. Во второй таблице содержатся категории товаров (на все каталоги, свои категории) Тоже, очень даже удобна, без лишних нагрузок. Все категории сортируются по присвоенному значению ID каждому каталогу. Ну и последняя, самая большая таблица. В ней все товары, из всех каталогов и категорий. В том то всё и дело, что таблица для товаров заполняется для всех каталогов одинаково. По этому, товаров, как и каталогов и категорий, может быть неограниченное количество. Так было задуманно с самого начала.
Просто, важно теперь вывести всё это в древевидной форме. От части, это уже удалось. Скрипт, который я изложил, выводит всё в древе, по категориям. Даже админку забацал. Но, есть ещё такой момент - показать графику, линии в древе. Вот, это уже сложнее. Конечно, может быть моя структура для этого не совсем пригодна и нуждается в дополнении. Сейчас, я как раз буду думать над этим.
А так, как вы говорите, - неправильно мол... Это не так. Всё работает и очень даже хорошо.
(Добавление)
evgenijj пишет:
Трехуровневый каталог - три таблицы.
Если точнее, была задуманна -- "каскадная таблица".
Да, именно эти уровни и делают эту БД такой многозадачной.
(Добавление)
evgenijj пишет:
А если понадобится создать еще один уровень - создашь еще одну таблицу SUPERCATALOG?
Нет... Просто, нужно будет тогда добавить ещё одну таблицу с товарами. Например, в данном примере, структуированна таблица разных типов существующих масел для разного рода использования. (всего их 12 шутк, включая ещё по каждому каталогу существуют свои категории, которые берутся из одно запроса SELECT) Только, таблицу с товарами, я её урезал. Таблица немного обширней, на самом деле. Что не меняет самой сути. По этому, можно смело предположить, что таблица с товарами уже - другая... Можно создать таблицу для деталей авто. (и вообще, любую другую таблицу) А в каталог и категории добавить лишь заголовки названий этих товаров. Вот и всё...
БД и скрипт отлично работают. Но, видите, там графика. (кстати, сама графика линий будет переделана. Там, эти линии вообще.. можно и поизящней было бы их нарисовать) Самой БД там ещё нет. Она в разработке. Хотя, приведённый мною пример здесь, отображает всё именно так, как там на странице. На данной странице используется кусочек PHP и джава скрипт. База уже перебита на MySQL. Просто, трудность вся в том, что графика там. Замыкающие линии... и тп..
Думаю, конечно, как это порешить. Конечно, решение уже есть где-то. Но, я новечок вообще в программировании, и даже не программист (верстальщик - редактор). Борюсь на чистом энтузиазме, мне это всё интересно (собственно, как и любому другому web-редактору).
Maksir
Отправлено: 11 Ноября, 2006 - 18:07:42
Новичок
Покинул форум
Сообщений всего: 15
Дата рег-ции: Нояб. 2006
Помог: 0 раз(а)
evgenijj пишет:
Теперь, что касается картинки. Положим, мы выбираем из БД категории, для которых parentID=5:
Респект!
Кажицо пошло!
Ваш код для подмены картинки очень помог! Спасибо!
Сейчас немного переконфигурирую и этот код заработает.
Maksir
Отправлено: 11 Ноября, 2006 - 20:12:07
Новичок
Покинул форум
Сообщений всего: 15
Дата рег-ции: Нояб. 2006
Помог: 0 раз(а)
У меня всё получилось!!!!!
Вы evgenijj просто гений!!!! :rotate:
Гениально всё!!!! (только БД у меня нурмульная! ) Всё работает на этой БД
я всё понял!!!!
(и главное, терь понял, как это делать)
Только там две ячейки. И в товарах у меня замыкающая 0.gif (без изображения, хотя, его можно было бы просто и не писать. это для наглядности) Хотя, терь, можно сделать и на три ячейки, как это и было задуманно изначально.
О Боже, как я рад!!!! просто опкакаюсь щаз...
evgenijj
Отправлено: 12 Ноября, 2006 - 17:44:50
Участник
Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006 Откуда: Москва
Помог: 10 раз(а)
Как мало человеку для счастья нужно . Осталось сделать еще один шаг - признать тот факт, что структура БД не оптимальна. Постараюсь объяснить. Итак, есть каталог продукции некоторой фирмы. Для хранения информации о товарах и категориях используем две таблицы: CATEGORIES и PRODUCTS. Категория может содержать вложенные категории и/или товары. Проводя аналогию с файловой системой, директория может содержать вложенные директории и/или файлы. Некоторые из этих директорий могут лежать в корне логического диска ( напимер, D: ). Но это не делает их какими-то "особенными", чтобы хранить информацию о них в отдельной таблице БД. Каждый элемент таблиц CATEGORIES и PRODUCTS содержит ссылку на родительский элемент - id_parent.
Таблица CATEGORIES:
id_ctg - уникальный идентификатор категории
id_parent - ссылка на родительский элемент
title - название категории
sortorder - порядок сортировки
Таблица PRODUCTS:
id_prd - уникальный идентификатор товарной позиции
id_ctg - ссылка на родительский элемент
title - наименование товарной позиции
description - описание товара
sortorder - порядок сортировки
SELECT id_ctg, title FROM categories WHERE id_parent=0 ORDER BY sortorder;
И не надо никакой третьей таблицы - а то она как пятое колесо в телеге: не несет никакой функциональной нагрузки, но создает дополнительные трудности при кодировании.
Покинул форум
Сообщений всего: 15
Дата рег-ции: Нояб. 2006
Помог: 0 раз(а)
Спасибо evgenijj ! Постараюсь разобраться с таблицей.
У меня такой вопрос. if ($row == $cnt)
Бился сегодня целый день. Хотел поставить условие таким образом, что бы было сравнение с последним id категории. Но, в цикле, естественно - не получается... На выходе от одной переменной получаются сразу все значения. И как это разделить, что бы в цикл передать для условия только последний id (замыкающего) этот id равен категории.
в цикле перебираются все значения по запросу (по товарам) Если в каталоге товаров 5, и категорий 3 , то будет примерно вот так;
echo здесь все id 11233 (три категории , пять товаров)
}
echo здесь будет id 3 (не дать, не передать... а очень нужно! это последний id, он нужен для условия)
По поводу таблицы. У меня же существует 12 каталогов с продукцией. В каждой из которых лежит "любое количество" - категорий. В каждой категориии лежит "любое количество" - товаров. Выводятся они все и сортируются только по каталогу.
Если бы у меня было условие по одному каталогу, то конечно же и таблиц было бы две.
Извините, просто, не пойму, как может мишать эта таблица с каталогом. Там, в строке SELECT значение cl.id='".$_GET['cat']."' подставляется id каталога. То есть, если у меня 12 каталогов, то и все id в таблице cl каталогов идут строго от 1 до 12. Кликая по ссылкам каталогов, пользователь попадает в другие каталоги.
Всего - 12 каталогов. И они открываются все по своему значению id каждый каталог отдельно (по-сути, тот же постраничный вывод)
А вот дерево товаров выстраивается уже по этим двум таблицам, как это и у вас в примере. ( таблицу с каталогами можно не косаться вообще при продумывании кода вывода категорий. я так вообще пишу на отдельном файле, а вместо параметра GET подставляю любое число из каталога)
\n\n(Добавление)
Ну, я, практически понимаю, о чем вы толкуете. Тот же принцып работы скрипта применяется практически везде. Например, в phpBB - там и топики, и сообщения -- в каждой всего по две таблицы -> таблица заголовок и таблица текст. В каждой есть параметры, которые передаются с условием по id пользователя. (но всё-таки, пользователи - это уже третья таблица. Хотя, в моей задаче, можно вместо этой третьей таблицы в каждую строку с товарами подставить дополнительнюу колонку с названием каталога и id) но, что-то у меня не стыкуется.. Все равно, в цикле нужно как-то показать последний существующий в запросе id категории, потому что в последней категории идут сообщения с последним id категории (это самое максимальное значение, которое ровняется и подставляется совсем другая ветка, которая замыкает дерево)
evgenijj
Отправлено: 12 Ноября, 2006 - 21:36:21
Участник
Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006 Откуда: Москва
Помог: 10 раз(а)
Цитата:
Бился сегодня целый день. Хотел поставить условие таким образом, что бы было сравнение с последним id категории. Но, в цикле, естественно - не получается... На выходе от одной переменной получаются сразу все значения. И как это разделить, что бы в цикл передать для условия только последний id (замыкающего) этот id равен категории.
Честно - ничего не понял. Я примерно представляю, что тебе нужно - но у тебя на сайте и так все работает. Я бы сделал примерно так (код в работе не проверял - сам тестируй):
Какую-нить простенькую базу для наглядности можно? Не пойму, что с чем там и зачем...
Кстати, код правил. Но, база у меня никакая.. базу свою тоже дополнял. делал - там-демчик.. всё равно не получилось.\n\n(Добавление)
За код спасибо! Очень интересно.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.