2015-05-21 31 views
1

我很难确定如何接收一组id或完整的节点信息并使用该数据将对应行插入到数据库中。将数据从jstree插入到数据库中

这是怎么发生的?那么,我有以下层次projeto> uc> ambiente> secao> med。在我的JS树中我使用延迟加载,所以让我们说用户选择'projeto',他们提交我得到的所有'projeto'id,所以这很容易,我知道我必须在数据库上插入所有它的孩子和他们的孩子。但让我们说,用户选择一个特定的'ambiente'或特定的'secao',我只能得到一个id或一个节点数据,但要插入该信息,我需要先插入所有父母数据,然后才能将其插入D b。

示例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' 儿童的或没有。

[{"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并在这里发布。

所以我需要的是将选定的节点插入数据库,但考虑到如果父节点没有加载在树上它可能有孩子。当然,当我选择一个孩子并需要迭代所有备份时,他们会在插入孩子之前插入它的父亲(后两个例子)。

希望你们能帮助我。如果需要澄清,只需要求。

谢谢。

回答

0

好吧,大家半路完成。创建下面的代码:

//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”数据我需要创建它的父母。在这个例子中,需要插入“projeto”和“uc”,“projeto”,然后插入“uc”,然后才可以在数据库中插入“ambiente”。

编辑:好的,这里是我做了什么来解决这个问题。 creted以下函数

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; 
    } 
} 

上述检查的功能,用于它的父存在,然后被插入或创建和它的所有儿童的。当孩子有2或3个级别时,该函数调用它自己并返回父ID。而已。

这是不完整和可怕的丑陋,但为了澄清的缘故,也许如果有人有同样的问题,他们可以看到我的想法。