php - 将jstree中的数据插入数据库

标签 php mysql jstree

我在弄清楚如何接收一组 ID 或完整的节点信息并使用该数据将相应的行插入数据库中时遇到了一些麻烦。

为什么会这样?好吧,我有以下层次结构 projeto>uc>ambiente>secao>med。在我的 JS 树中,我使用的是延迟加载,所以假设用户选择了一个“projeto”,他们提交的只是“projeto”id,所以这很简单,我知道我必须在数据库中插入所有它的 child 和他们的 child 。但是假设用户选择了一个特定的“ambiente”或一个特定的“secao”,我得到的只是一个 id 或一个节点数据,但是要插入该信息,我需要先插入所有它的父数据,然后才能将其插入到分贝。

示例 1 单个“projeto”选择的数据。

[{"id":"projeto_1","text":"Pr\u00e9dios P\u00fablicos","icon":"fa fa-folder icon-lg icon-state-info","parent":"#","parents":["#"],"data":{"id_mobile":"1"},"state":{"loaded":"false","opened":"false","selected":"true","disabled":"false"},"li_attr":{"id":"projeto_1"},"a_attr":{"href":"#"},"original":{"id":"projeto_1","text":"Pr\u00e9dios P\u00fablicos","icon":"fa fa-folder icon-lg icon-state-info"}}]

示例 2 选择了单个 'ambiente',可能有或没有 'secao' child 。

[{"id":"ambiente_4","text":"protocolo","icon":"fa fa-folder icon-lg icon-state-info","parent":"uc_1","parents":["uc_1","projeto_1","#"],"data":{"id_ambiente_mobile":"4"},"state":{"loaded":"false","opened":"false","selected":"true","disabled":"false"},"li_attr":{"id":"ambiente_4"},"a_attr":{"href":"#"},"original":{"id":"ambiente_4","text":"protocolo","icon":"fa fa-folder icon-lg icon-state-info","type":"ambiente"}}]

示例 3 单个'secao'选择的数据。

[{"id":"secao_5","text":"1 Lumin\u00e1ria(s) LFT 1X40W","icon":"fa fa-folder icon-lg icon-state-info","parent":"ambiente_5","parents":["ambiente_5","uc_1","projeto_1","#"],"data":{"id_secao_mobile":"5"},"state":{"loaded":"false","opened":"false","selected":"true","disabled":"false"},"li_attr":{"id":"secao_5"},"a_attr":{"href":"#"},"original":{"id":"secao_5","text":"1 Lumin\u00e1ria(s) LFT 1X40W","icon":"fa fa-folder icon-lg icon-state-info","type":"secao"}},{"id":"ambiente_5","text":"Recep\u00e7\u00e3o","icon":"fa fa-folder icon-lg icon-state-info","parent":"uc_1","parents":["uc_1","projeto_1","#"],"children":["secao_5"],"children_d":["secao_5"],"data":{"id_ambiente_mobile":"5"},"state":{"loaded":"true","opened":"true","selected":"true","disabled":"false","loading":"false"},"li_attr":{"id":"ambiente_5"},"a_attr":{"href":"#"},"original":{"id":"ambiente_5","text":"Recep\u00e7\u00e3o","icon":"fa fa-folder icon-lg icon-state-info","type":"ambiente"}}]

以上所有数据都是传递给php文件的数据。所以我只是 jso_encoded 并张贴在这里。

所以我需要的是将选定的节点插入数据库中,但考虑到如果父节点未加载到树上,它可能有子节点。当然,当我选择一个 child 并需要迭代所有备份时,在插入 child 之前将其插入 parent 家属的情况下的解决方案(最后两个示例)。

希望大家帮帮我。如果需要任何说明,请提出要求。

谢谢。

最佳答案

好的,伙计们,完成了一半。创建了以下代码:

//take the actual node.
for ($i = 0; $i < count($ids); $i++) {

    //if the actual node is loaded and opened.
    if (($ids[$i]['state']['loaded'] == true) && ($ids[$i]['state']['opened'] == true)) {
        //then the node is inserted in the db.
        checaNo ($ids[$i]);
        //and the iteration jump all it's selected children. This is because checaNo already insert all actual node children.
        $i = count($ids[$i]['children'])+1;

    }
    //the actual node has not any children or it's children is not loaded.
    else
    {
        //insert the node and it's children if they exists. Then go to the next node.
        checaNo($ids[$i]);
    }

}

现在的问题是,假设我已经选择了一个“ambiente”作为一个新的“projeto”,所以在我什至可以插入“ambiente”数据之前,我需要创建它的 parent 。在这个例子中是“projeto”和“uc”,需要插入“projeto”,然后需要插入“uc”,然后我才能在数据库上插入“ambiente”。

编辑:好的,这就是我为解决这个问题所做的工作。创建了以下函数

function checaPai ($no) {

    global $data;

    $nivel = count($no['parents'])-1;

    switch ($nivel) {
        case 0;
            break;
        case 1;
            $args_projeto = new stdClass();
            $id_projeto = explode("_", $no['parent']);
            $args_projeto->where = "data_hora_importacao = '$data' AND id_mobile = '" . $id_projeto[1]."'";

            $projeto = getMobileProjeto($args_projeto);

            $args_projeto_online = new stdClass();
            $args_projeto_online->where = "id = '" . $projeto[0]->id_online."'";
            $projeto_online = getOnlineProjeto($args_projeto_online);

            if (count($projeto_online) == 0) {

                $id_projeto = insereProjeto($args_projeto, false);

                return $id_projeto;
            }
            else {

                return $projeto_online[0]->id;

            }

            break;
        case 2;
            $args_uc = new stdClass();
            $id_uc = explode("_", $no['parent']);
            $args_uc->where = "data_hora_importacao = '$data' AND id_uc_mobile = '" . $id_uc[1]."'";
            $uc = getMobileUC($args_uc);

            $args_uc_online = new stdClass();
            $args_uc_online->where = "contrato = '" . $uc[0]->contrato."'";
            $uc_online = getOnlineUC($args_uc_online);

            if (count($uc_online) == 0) {


                $no_uc = array();
                $no_uc['parent'] = $uc->projeto;
                $id_uc = checaPai($no_uc);
                return $id_uc;
            }
            else {

                return $uc_online[0]->id;
            }

            break;
        case 3;
            break;
        case 4;
            break;
    }
}

上面的函数检查它的父项是否存在,然后插入或创建它所有的子项。当 child 有例如 2 或 3 个级别时,函数会调用自身并返回父 ID。就是这样。

它不完整而且非常丑陋,但为了澄清起见,也许如果有人有同样的问题,他们可以看看我是如何想出来的。

关于php - 将jstree中的数据插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30376719/

相关文章:

php - 警告 : mysqli_connect(): (HY000/1045): Access denied for user 'root' @'localhost' (using password: NO)

php - Laravel 使用多少成本/回合进行哈希处理?

php - Jquery $.post 到 PHP 脚本时间滞后

python - Flask 刷新页面时出错 ('NoneType' )

mysql - 如何提取 MySQL 表中包含特定字符的 csv 列的成员?

javascript - 从 Angular 变量填充 jstree ThreeView

javascript - switch(!0) 是什么意思

php - 使用 QuickBooks PHP Dev Kit/QuickBooks Web Connector 从 QuickBooks 导入项目

mysql - 连接到远程我的 Sql 显示用户 azerty@41.175.10.32 的访问被拒绝(使用密码 : Yes )

jstree - 使用jstree 3.0.0更改主题