- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Что делать, если ваша email-рассылка попала в спам
10 распространенных причин и решений
Екатерина Ткаченко
В 2023 году 36,9% всех DDoS-атак пришлось на сферу финансов
А 24,9% – на сегмент электронной коммерции
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Хочу сделать комментарии. Причём с уровнем вложенности и древовидной структурой (т.е. чтобы для комментариев, которые являются ответом на какой-то другой - был отступ)
Ну что-то вроде этого:
Но никак не соображу как это лучше реализовать.
У меня есть 3 версии:
1) У каждого комментария есть свой id, id комментария к которому он идёт ответом (toComment).
При этом из БД выбираются все комментарии для этой записи с order by `toComment`,`id`
Но как тогда определить отступ и древовидность комментариев? Несколько раз пробегать по массиву? или запоминать какой комментарий на какой идёт ответом?
И представим например что комментарии идут так:
То скрипт, а именно sql запрос, будет работать неверно. Т.к. 8 комментарий будет выводится только уже после 7, а должен до него.
Но тут можно ввести ещё одно поле - уровень вложенности или что-то подобное. Да, в прицнипе можно. Но для всего этого тредуются опять же рассчёты. И кажется мне что это всё слишком сложно получается, можно проще.
2) Выбирать сначала комментарии с toComment=null и сортировкой по id.
А затем при выводе данного коментария лезть в БД и смотреть, если ли там запись с toComment равным id этого коммента. Итак до тех пор, пока не будет пройдена вся структура. И легко вычислять отступы тут будет
В целом можно, но а что есть комментариев будет много, и/или много человек будут просматривать эту страницу? Не будет ли серверу плохо от такого кол-ва запросов к БД?
3) Хранить в в toComment всю цепочку. Т.е. так:
Но считывать всё просто в массив. А затем уже парсить toComment, сортировать массив и выводить на экран.
Но опять же не нравится мне тут считывание этого дела в память и хранение там.
В общем есть у меня подозрение, что я изобретаю колесо. Хотя описания алгоритма в нете так и не нашел. В основном только описание как сделать примитивные комменты, ну типа гостевой книги.
Может кто-то сталкивался и знает как лучше это сделать?
варинат1 + ячейка для вложенности.
где вы тут сложность видите?
Можно и через манипуляции с массивами, но это слишком усложнит код. Лучше немного усложнить данные.
Вам поможет Nested Sets (Вложенные множества). В сети полно информации по этой теме.
Вообще, погуглите что-то типа "Хранение древовидных структур в БД".
Есть даже готовые ПХП-классы для работы с такими таблицами.
Если ничего не найдете отпишитесь мне, попробую помочь.
Qinghua,
где вы тут сложность видите?
Ну по сути это ничего не изменит:
И опять же, как тогда сделать order by, чтобы выводить это дерево в нужном порядке?
Собственно тогда тоже придётся считывать в массив и соритровать его.
Или я не правильно вас понял?
Kirilll,
Спасибо. Пока не разбрался как это всё работает,но судя по всему лучше будет взять готовый класс для работы с подобным деревом и немного изменить его под себя.
NestedSets - это не класс. Это принцип хранения древовидных данных.
Там все завязано на том, что каждая запись, кроме ID имеет еще 2 поля - левій и правый ключ. И с помощью этих ключей можно манипулировать с деревом как угодно: перемещать узлы и ветви, удалять ветви без потери целостности дерева, выбирать все дочерние узлы...
Это именно то, что нужно вам. Я в этом уверен.
Поэтому потратьте пару часов на то, чтобы разобраться с этим, и будет вам счастье! )))
Сортировка.
Одним SQL-запросом это не сделать, Order By тут не поможет в полной мере,
сортировать всё же придётся на уровне скриптов, а не SQL-сервера.
Дизайн.
Первое, что пришло в голову - отдельный DIV для каждого комментария.
В верхней его части выводите текст, а затем размещайте всё его дочернее
хозяйство тем же макаром (каждый комментарий - это DIV)...
я МОГУ ПИСАТЬ!! УРА ЛЮДИ!!!
Сортировка.
Одним SQL-запросом это не сделать, Order By тут не поможет в полной мере,
сортировать всё же придётся на уровне скриптов, а не SQL-сервера.
При Нестед Сетс делается одним запросом. Сортируется по левому ключу.
Скриптом сортировать - накладно по производительности.
Дизайн.
Первое, что пришло в голову - отдельный DIV для каждого комментария.
В верхней его части выводите текст, а затем размещайте всё его дочернее
хозяйство тем же макаром (каждый комментарий - это DIV)...
Вложенные ДИВы тоже хорошо.
Но списками (UL - LI), ИМХО, более правильно с точки зрения оптимизации. Ну а CSS-ом можно оформить как угодно, хоть ДИВ, хоть список...
бери нестед, не прогадаешь. + если хватит головы довести под твою задачу, так еще и выборок любых ветвей можно за константу добиться.
а отодвигать как всегда, padding: 0px 30px * $level ;)
Нужно держать весь путь:
Немного простого кода для работы с путём.
Можно даже от ID отказаться
остался вопрос с выборкой первых 10ти комментов уровня 0 и неограниченного кол-ва комментов, которые являются детьми этих 10
нестед позволяет это сделать ?