вложенное дерево с левым и правым значением

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

Чтобы не увидеть мой вывод, что я хочу сделать....

введите здесь описание изображения

я хочу управлять значениями data-left, data-right

И моя структура базы данных

введите здесь описание изображения

Пожалуйста, помогите в этом, как управлять функцией перетаскивания.


person user3146706    schedule 30.01.2014    source источник


Ответы (1)


Я пытался прокомментировать это, но веб-сайт говорит мне, что для этого мне нужно 50 репутации, так что это может ответить или не ответить на ваш вопрос, мне придется подождать, пока я не вернусь домой, когда я смогу возиться с чем-то подобным в базе данных. / Структура JavaScript.

Я хорошо знаком с таблицами left/right_id и т.п. Первое место, где я их увидел, было на phpBB3.0, и я провел много времени, читая их.

Одна вещь, которую вы можете сделать, чтобы ускорить ваши запросы, — это добавить столбец parent_id, таким образом вы можете сразу получить ВСЕ дочерние заметки без необходимости использовать «left_id > 1 AND right_id ‹ 8» в ваших операторах SQL.

Теперь, что касается вашего вопроса о javascript, как я попытаюсь сделать это, когда вернусь домой, это объявить массив ключей id => дочерние значения. Итак, в примере со скриншотом, который вы привели выше, вы, надеюсь, могли бы получить что-то вроде этого

array(

    2 => array(
       5 => array(
          3
        ),
       6
    ),
    3 => array(
      8
    ),
    4
)

Чтобы получить это, вам нужно пройти через DOM для каждого члена списка, используя их идентификаторы и функцию array.push для добавления значений по мере необходимости.

Я постараюсь помочь еще раз, как только доберусь до своего дома, где у меня настроен PHP-сервер, но это должно дать вам представление о том, как его начать.

Используете ли вы какой-либо фреймворк Javascript (например, MooTools, jQuery)?

Редактировать: Итак, я работал над этим довольно долго, и у меня есть общая работа. Ниже приведен код, непосредственно отвечающий за перебор дерева DOM и присвоение значений left/right_id. Его должно быть довольно легко отредактировать по своему вкусу.

Я предпочитаю MooTools, поэтому я написал это, используя библиотеку mootools (она предлагает некоторые довольно удобные функции Element и фактически дает мне многоуровневый инструмент перетаскивания и сортировки для проверки). Если вы предпочитаете использовать другую библиотеку, должно быть довольно легко переключить код для работы с ней, но я не использую jQuery, поэтому, к сожалению, я бесполезен в этом отношении

Ссылка для загрузки всех задействованных файлов: здесь

function calculate_ids(el,left_id, parent_id){

            var el = $(el);
            //makes the element a MooTools Element

            var left_id = left_id || 1;
            //If left_id is given, we are using this function recursively

            var parent = parent_id || 0;
            //Gives us a quick method in order to figure out what level we are currently on

            var id_array = {};
            /*ID array object will look like
                {
                    1:{
                        'left_id':1,
                        'right_id':2,
                        'parent':0
                    },
                    2:{
                        'left_id':3,
                        'right_id':6,
                        parent_id:0
                    },
                    3:{
                        'left_id':4,
                        'right_id':5
                    },
                    etc.
                }
            */

            var els = el.getChildren('li');
            //Get the immediate children

            els.each(function(child){

                var id = child.get('id');
                //The ID

                var descendants = child.getElements('li');
                //Gets ALL most descendent children that match the format, these are ordered the way they are in the DOM

                var right_id = left_id + descendants.length * 2 + 1

                id_array[id] = {
                    'left_id':left_id,
                    'right_id':right_id,
                    'parent':parent
                };
                if(descendants.length > 0){
                    //There are child elements to this thing, recursion!
                    id_array = Object.merge(id_array, calculate_ids( child.children[0], left_id + 1, id) );
                }

                left_id = right_id + 1;
                //Increment the left_id counter
            });

            return id_array;

        }

Известные вопросы

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

person Jhecht    schedule 30.01.2014
comment
Это сэкономило бы мне немного времени, если бы вы могли поделиться своим кодом HTML/Javascript, чтобы добавлять/перемещать элементы. Если нет, то спасибо за терпение. - person Jhecht; 01.02.2014