вставка данных из jstree в базу данных

У меня возникли определенные проблемы, чтобы понять, как я могу получить набор идентификаторов или полную информацию об узле и использовать эти данные для вставки соответствующей строки в БД.

Почему это происходит? Ну, у меня есть следующая иерархия projeto> uc> ambiente> secao> med. В моем дереве JS я использую ленивую загрузку, так что, скажем, пользователь выбирает «projeto», и они отправляют все, что я получил, это «projeto» id, так что это легко, и я знаю, что мне нужно вставить в БД все, что это потомки и их дети. Но допустим, что пользователь выбирает конкретное ‘ambiente’ или определенное ‘secao’, все, что я получаю, — это один идентификатор или данные одного узла, но чтобы вставить эту информацию, мне нужно вставить все его родительские данные, прежде чем я смогу вставить их в дб.

Пример 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 и разместил его здесь.

Поэтому мне нужно вставить выбранные узлы в БД, но, учитывая, что если родительский узел не загружен в дерево, у него могут быть дочерние элементы. И, конечно же, решение для случая, когда я выбираю дочерний элемент и должен выполнять итерацию всех резервных копий, вставляя в него родительские зависимости, прежде чем вставить дочерний (последние два примера).

Надеюсь, вы, ребята, можете мне помочь. Если требуется какое-либо разъяснение, просто спросите.

Спасибо.

1

Решение

Хорошо, ребята, на полпути. создал следующий код:

//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» в БД.

РЕДАКТИРОВАТЬ: Хорошо, вот что я сделал, чтобы решить эту проблему. создал следующую функцию

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 уровня, функция сама вызывает и возвращает родительский идентификатор. Вот и все.

Это неполно и ужасно безобразно, но ради разъяснения и, может быть, если у кого-то возникнет такая же проблема, они увидят, как я это понял.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]