Я пытался прокомментировать это, но веб-сайт говорит мне, что для этого мне нужно 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