Внимание! Форум временно закрыт. Все вопросы вы можете задать на странице MaxSite CMS в Github

Вложенные комментарии

Аватар пользователя
Saturn
Сообщений: 10
Зарегистрирован: 05 фев 2009, 15:20

Re: Вложенные комментарии

Сообщение Saturn » 20 фев 2009, 11:17

рекурсия - не лучший вариант. на 200 рубриках будет грузить ресурсы.
лучше делать заранее дерево уже в структуре комментов, а потом ОДНИМ запросом строить дерево.
примеров в инете уйма - на phpclub.ru 100% есть несколько статей.
"Блажен король, но кружка с пивом
Любого сделает счастливым"
(c) Роберт Бернс

Аватар пользователя
MAX
Администратор
Сообщений: 3179
Зарегистрирован: 31 янв 2009, 19:02

Re: Вложенные комментарии

Сообщение MAX » 20 фев 2009, 11:39

Без рекурсии не получится. Рубрики, кстати так и выводятся. Просто результат кэшируется, поэтому это не так критично.

А вообще я этим вопросом долго занимался. Функция mso_cat_array_single() как раз и есть полученный результат. Там автоматом вычисляется уровень и дочерние элементы. При этом всего один sql-запрос. У меня просто не получилось «добить» этот массив так, чтобы формировались [childs], пригодные для mso_create_list(). :(

Аватар пользователя
MAX
Администратор
Сообщений: 3179
Зарегистрирован: 31 янв 2009, 19:02

Re: Вложенные комментарии

Сообщение MAX » 20 фев 2009, 12:49

Вот еще старая запись по теме: http://maxsite.org/page/kak-iz-dereva-s ... -strukturu

Аватар пользователя
Elf
Сообщений: 35
Зарегистрирован: 05 фев 2009, 00:00

Re: Вложенные комментарии

Сообщение Elf » 21 фев 2009, 02:18

admin писал(а):Вот еще старая запись по теме: http://maxsite.org/page/kak-iz-dereva-s ... -strukturu

Вспомнил старое, доброе, вечное... и настряпал то что ты просил... :)
Даю пример рекурсивной функции, которая правильно строит дерево с открытием и закрытием тегов в нужных местах:

Код: Выбрать все

/*
создается массив, который на выходе должен выглядеть вот так:
* 1
* 2
* 3
  o 3-1
  o 3-2
    + 3-3-1
    + 3-3-2
  o 3-3
* 4
*/
$arr=Array();
$arr[1]=Array('id' => 1, 'parent' => 0, 'name' => '1');
$arr[2]=Array('id' => 2, 'parent' => 0, 'name' => '2');
$arr[3]=Array('id' => 3, 'parent' => 0, 'name' => '3');
$arr[4]=Array('id' => 4, 'parent' => 0, 'name' => '4');
$arr[5]=Array('id' => 5, 'parent' => 3, 'name' => '3-1');
$arr[6]=Array('id' => 6, 'parent' => 3, 'name' => '3-2');
$arr[7]=Array('id' => 7, 'parent' => 3, 'name' => '3-3');
$arr[8]=Array('id' => 8, 'parent' => 6, 'name' => '3-3-1');
$arr[9]=Array('id' => 9, 'parent' => 6, 'name' => '3-3-2');

$parents=array();

foreach ($arr as $val) {  // делаем массив с родителями у которых есть дети.
 if ($val['parent'] != 0 ) {
  $parents[$val['parent']] += 1;
 }
}

function Category ($parent=0) {  // пишем функцию рекурсии
 global $arr, $parents; // получаем массив
 
 if (count($arr)) {  // есть ли смысле вообще работать дальше, если массив пуст?
    foreach ($arr as $val) { // выбираем категории группировано по родителям
      if ($val['parent'] == $parent) $root_cat[] = $val['id'];
   }
   $par_of_cat=false; // занулили флаг родителя
   $count_cats=count($root_cat); // посчитали категории

   if ($count_cats) {  // есть категории для вывода?
      foreach ($root_cat as $id) { // все таки есть, перебираем.
               if ($parents[$id]) $par_of_cat=$id; // родитель? установить флаг

               print("<li>".$arr[$id]['name']); // выводим все что нужно, предварив началом списка
               if ($par_of_cat) print("\n<ul>\n"); // родитель? открыть новый список
               
               Category($id);  // вызвать себя рекурсивно

               if ($par_of_cat) { // родитель закрывается? закрыть теги, сбросить флаг
              print("</ul></li>\n");
              $par_of_cat=false;
            } else {
                   print("</li>\n"); // не родитель, просто закрыть тег
            }
      }
   }
 }
}
print("<ul>"); // не забыть начать спиок
Category(); // вызваться первый раз
print("</ul>\n"); // не забыть закончить список

/* вот что у нас получилось на выходе ( красоту навел руками )
<ul>
   <li>1</li>
   <li>2</li>
   <li>3
      <ul>
         <li>3-1</li>
         <li>3-2
            <ul>
               <li>3-3-1</li>
               <li>3-3-2</li>
            </ul>
        </li>
         <li>3-3</li>
      </ul>
   </li>
   <li>4</li>
</ul>
*/

писал ночью, по сему не обессудьте :)
данный код (ну не этот, а сильно замудреный) работает у меня в модуле вывода дерева категорий для движка ДЛЕ.
Да пребудет с вами СЕТЬ!

Аватар пользователя
Saturn
Сообщений: 10
Зарегистрирован: 05 фев 2009, 15:20

Re: Вложенные комментарии

Сообщение Saturn » 21 фев 2009, 08:07

Макс, а я твою mso_cat_array_single() вполне нормально заюзал. Получаю рубрики, а потом с массивом этим строю что хочу (для меню выпадающего на сайте).
а что именно не так с child'ами там?
"Блажен король, но кружка с пивом
Любого сделает счастливым"
(c) Роберт Бернс

Аватар пользователя
MAX
Администратор
Сообщений: 3179
Зарегистрирован: 31 янв 2009, 19:02

Re: Вложенные комментарии

Сообщение MAX » 21 фев 2009, 12:13

В mso_cat_array_single() всё нормально. :) В ней childs - это id рубрик. А для mso_create_list() нужен childs, который массив с полями и который тожеможет содержать свои childs. Это нужно для построения ul-li-списка.

Аватар пользователя
Wave
Сообщений: 1218
Зарегистрирован: 01 фев 2009, 17:38

Re: Вложенные комментарии

Сообщение Wave » 14 май 2009, 16:37

admin писал(а):Для меня самая сложность - это форма возле каждого коммента. Есть правда пара вариаций.
Кстати о птичках.
У Владимира (simplecoding.org, если кто не видел) есть цикл статей о разработке багтрекера на кодигнайтере.
Здесь оглавление есть. И здесь же как раз та часть, что о древовидных комментариях на CI+jQuery. О том, как строить-выводить дерево, где-то в предыдущих частях. Стоит прочесть все.

Аватар пользователя
Arsenal
Сообщений: 121
Зарегистрирован: 02 фев 2009, 09:52

Re: Вложенные комментарии

Сообщение Arsenal » 13 июл 2009, 19:24

Реализовал для проекта городского, которым занимаюсь вложенные коменты.
Встроил их пока на локалхостовскую рыбалку, гоняю.

В кратце реализовано так
1. Одним запросом считываются все коменты страницы
2. С помощью рекурсии строятся комментарии

Сегодня чуть позже выложу сперва на rybalka.tv все, а потом выложу исходник того, как я все сделал. Плагин у меня сейчас времени нет писать новый, потому если кто-то найдет время сделать такой плагин - воспользуетесь моими наработками

Аватар пользователя
Arsenal
Сообщений: 121
Зарегистрирован: 02 фев 2009, 09:52

Re: Вложенные комментарии

Сообщение Arsenal » 14 июл 2009, 05:37

Встроил древовидные комментарии

http://rybalka.tv/page/novaja-sistema-kommentirovanija

Большая просьба каждому оставить комментарий в том блоге.

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

mixar
Модератор
Сообщений: 333
Зарегистрирован: 14 окт 2009, 11:09

Re: Вложенные комментарии

Сообщение mixar » 28 окт 2009, 19:42

А что будет, когда 10-15 уровней вложенности? Комментарий по ширине будет пикселей 10 или шаблон расколбасит(((

А вообще смотрится хорошо и можно видеть нить дискуссии!
[url=http://www.codeigniter.ru]CodeIgniter по-русски[/url] | [url=http://freebsd.pro]FreeBSD Community[/url]


Вернуться в «Старые неактуальные темы»

Кто сейчас на форуме

Пользователь просматривает форум: нет зарегистрированных пользователей

cron