Форум русской поддержки Joomla!® CMS
09.12.2016, 02:08:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Дерево

 (Прочитано 372 раз)
0 Пользователей и 1 Гость смотрят эту тему.
spirit1086
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 135


« : 19.08.2015, 21:49:31 »

Здравствуйте, пишу свой компонент в нем хочу организовать вывод меню в древовидной структуре как в категориях, не пойму как записать в таблицу уровни, чтобы они были по порядку после манипуляций с меню.  Хотел посмотреть как Joomla делает это не нашел функцию сохранения записей категории. Подскажите с реализацией или статью какую 
Записан
passer
Живу я здесь
******

Репутация: +69/-3
Offline Offline

Пол: Мужской
Сообщений: 829



« Ответ #1 : 19.08.2015, 21:57:40 »

Запрос Google: "Nested Sets" , ну и "Adjacency List", тоже можно.
Записан
spirit1086
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 135


« Ответ #2 : 19.08.2015, 22: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
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #3 : 19.08.2015, 22:56:54 »

Установщиком хранимые процедуры не поддерживаются. Пишите установочный скрипт и там добавляйте. В Joomla nested sets реализован программно через класс JTableNested. Для меню проще сделать materialized path, он тоже реализован там програмно. Зачем вам вообще процедуры и чето выдумывать вообще? Наследуйтесь от JTableNested, добавьте нужные поля в таблицу и вперед!
Записан
spirit1086
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 135


« Ответ #4 : 19.08.2015, 23:14:03 »

подскажите хороший мануал по  JTableNested, не могу найти, а лучше если у вас есть пример, заранее спасибо очень надо
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #5 : 19.08.2015, 23: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, 23:41:31 от zomby6888 » Записан
zaboich
Осваиваюсь на форуме
***

Репутация: +11/-0
Offline Offline

Сообщений: 38


« Ответ #6 : 25.08.2015, 03: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/
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet