0 Пользователей и 1 Гость просматривают эту тему.
  • 6 Ответов
  • 1468 Просмотров
*

spirit1086

  • Захожу иногда
  • 115
  • 1 / 0
Дерево
« : 19.08.2015, 20:49:31 »
Здравствуйте, пишу свой компонент в нем хочу организовать вывод меню в древовидной структуре как в категориях, не пойму как записать в таблицу уровни, чтобы они были по порядку после манипуляций с меню.  Хотел посмотреть как Joomla делает это не нашел функцию сохранения записей категории. Подскажите с реализацией или статью какую 
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
Re: Дерево
« Ответ #1 : 19.08.2015, 20:57:40 »
Запрос Google: "Nested Sets" , ну и "Adjacency List", тоже можно.
*

spirit1086

  • Захожу иногда
  • 115
  • 1 / 0
Re: Дерево
« Ответ #2 : 19.08.2015, 21:34:19 »
Почитал про Nested sets

Пытаюсь добавить в sql скрипт установки компонента процедуру выдает ошибка
Код
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax и дальше ниже описанная процедура
, не подскажите в чем проблема никогда процедуру не добавлял в sql установщик Joomla
Код
create table `#__mycategory` (
      `id` int auto_increment primary key,
      `name` varchar(255),
      `left_key` int,
      `right_key` int,
      `level` int
)

CREATE PROCEDURE category_add(IN _parent int, IN _name varchar(150))
BEGIN
      declare `@right_key` int;
      declare `@level` int;
      SELECT IFNULL(right_key,1),IFNULL(level,0) INTO `@right_key`,`@level` FROM #__mycategory WHERE id = _parent;
      SET `@right_key` = IFNULL(`@right_key`,1);
      SET `@level` = IFNULL(`@level`,0);
      UPDATE #__mycategory SET right_key = right_key + 2,  left_key = IF(left_key > `@right_key`, left_key + 2, left_key) WHERE right_key >= `@right_key`;
      INSERT INTO #__mycategory (left_key,right_key,level,name) VALUES (`@right_key`, `@right_key` + 1, `@level` + 1,_name);
END
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: Дерево
« Ответ #3 : 19.08.2015, 21:56:54 »
Установщиком хранимые процедуры не поддерживаются. Пишите установочный скрипт и там добавляйте. В Joomla nested sets реализован программно через класс JTableNested. Для меню проще сделать materialized path, он тоже реализован там програмно. Зачем вам вообще процедуры и чето выдумывать вообще? Наследуйтесь от JTableNested, добавьте нужные поля в таблицу и вперед!
интернет-блог: http://websiteprog.ru
*

spirit1086

  • Захожу иногда
  • 115
  • 1 / 0
Re: Дерево
« Ответ #4 : 19.08.2015, 22:14:03 »
подскажите хороший мануал по  JTableNested, не могу найти, а лучше если у вас есть пример, заранее спасибо очень надо
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: Дерево
« Ответ #5 : 19.08.2015, 22:27:30 »
Мануала нету, можно изучить сам класс в исходниках если интересно как работают его методы,  но в этом нет никакого смысла так как он наследуется от JTable в свою очередь и все методы JTable доступны там. О том как работать с JTable можете почитать  в доках:

https://docs.joomla.org/Using_the_JTable_class#Using_a_JTable_class_extensionх

Или нагуглить в интернете.  Вам вобщем-то потребуется только создать поля необходимые в таблице (patrent_id, rgt, lft, level, path). А дальше наследуйтесь от JTableNested и работаете как с JTable.  Отмечу только полезные методы  getTree() и rebuildPath(),  которые наверное придется изучить.
« Последнее редактирование: 19.08.2015, 22:41:31 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

zaboich

  • Осваиваюсь на форуме
  • 37
  • 11 / 0
Re: Дерево
« Ответ #6 : 25.08.2015, 02:44:58 »
Компонент com_categories позволяет другим расширениям хранить информацию о древовидных структурах в своих таблицах и управлять данными через свой функционал. Примеры использования можно посмотреть, например, в коде компонента com_banners.

Если количество категорий не большое, то использование com_categories - самый простой и удобный способ управления древовидными структурами.

Но com_categories использует для хранения древовидных структур комбинацию из трех методик: Список смежных вершин (Adjacency List) + Вложенные множества (Nested Set) + Материализованные пути (Materialized Path).
Каждая из этих методик дает свои преимущества при выборке данных. Например, Materialized Path позволяет строить красивые пути URL типа /category_lev1_1/category_lev2_2/.

Но как раз из-за использования метода Materialized Path любые операции с деревом - вставка, перемещение, удаление, приводит к полной рекурсивной перестройке дерева.
При количестве категорий или других древовидных элементов несколько тысяч перестройка занимает недопустимо много времени (минуты).

Если отказаться от использования материализованных путей, то можно в своем компоненте класс таблицы расширить от JTableNested и переопределить некоторые методы класса с учетом требований методик "Смежных вершин" и "Вложенных множеств".

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

В итоге требуется переопределить единственный метод  saveorder() из класса JTableNested и метод saveorder() из класса JModelAdmin. Этого будет достаточно, чтобы получить действующую модель работы с древовидными структурами.
Один из лучших циклов статей по вложенным структурам в реляционных базах данных Сергея Томулевича http://doc.prototypes.ru/database/
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться