具有左右值的可嵌套树

时间:2014-01-30 07:56:19

标签: php tree nested structure

具有左右值的不稳定树结构句柄 我已经完成了添加父节点,子节点和删除节点的功能。 但是如何使用nestable.js移动节点拖放后保存树值

为了看看我的输出我想做什么......

enter image description here

我想管理数据左,数据正确的值

我的数据库结构是

enter image description here

请帮助解决如何管理拖放功能。

1 个答案:

答案 0 :(得分:2)

我试图对此发表评论,但该网站告诉我,为了这样做我需要50个声望,所以这可能会或可能不会回答你的问题,我必须等到我回到家时我才能摆弄一些东西类似于数据库/ Javascript结构。

我对left / right_id表等相当熟悉。我看到它们的第一个地方是phpBB3.0,我花了很多时间阅读它们。

您可以做的一件事就是添加一个parent_id列,这样您就可以立即获取所有子注释,而无需在SQL语句中使用“left_id> 1 AND right_id< 8”

现在,对于你的javascript问题,当我回到家时,我将如何尝试解决此问题,即声明一组id键=>儿童价值观。因此,在上面给出的屏幕截图示例中,您可能希望得到类似这样的内容

array(

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

为了得到这个,你必须遍历列表中每个成员的DOM,使用它们的id和array.push函数来根据需要添加值。

我可以尝试帮助更多,一旦我可以到我的家里,我有一个PHP服务器设置,但这应该给你一个如何开始它的想法。

您使用的是任何Javascript框架(例如MooTools,jQuery)吗?

编辑: 所以,我已经工作了很长一段时间,我有一个普遍的工作。下面是直接负责循环DOM树并分配left / right_id值的代码。根据自己的喜好编辑它应该相当容易。

我偏爱MooTools,所以我使用mootools库编写了这个(它提供了一些非常好的Element功能,实际上它给了我一个多级拖动和排序工具来测试它)。如果你更喜欢使用另一个库,那么切换代码应该相当容易,但是我不使用jQuery,所以我很遗憾在这方面没有用处

下载所有相关文件的链接: Here

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;

        }

已知问题

我发布的示例代码在第一次计算之后没有正确计算左/右ID,如果先前已经计算过,则会向上/向下移动一个级别。我猜这与多级排序类如何移动项目有关。此代码旨在作为起点。我很忙(不幸的是),所以我将来可能会或者可能无法解决这个问题,但无论哪种方式,这段代码都应该是一个很好的起点。