Перейти к основному содержимому

Динамическая загрузка (по требованию)

информация

Эта функция доступна только в PRO-версии

По умолчанию dhtmlxGantt загружает все данные сразу. Это может стать проблемой, если у вас большое количество задач.

В такой ситуации можно использовать режим динамической загрузки и загружать данные по веткам (подпроектам), по уровням по мере их открытия пользователем.

Как это работает

Когда динамическая загрузка включена, вызов gantt.load("url") отправит GET-запрос на указанный URL, ожидая, что ответ будет содержать только задачи верхнего уровня, а все вложенные ветви будут отображаться как закрытые.

Когда пользователь нажимает на значок Развернуть, Gantt автоматически вызывает метод load, отправляя на сервер идентификатор нажатой задачи:

gantt.load("url?parent_id="123"");

И ожидается, что ответ будет содержать подзадачи развернутого элемента.

заметка

Вы можете использовать событие onBeforeBranchLoading для изменения URL запроса или добавления дополнительных параметров к нему.

Включение динамической загрузки

Чтобы включить динамическую загрузку в диаграмме Gantt, необходимо настроить как клиентскую, так и серверную стороны.

  • Клиентская сторона (используйте опцию branch_loading):
gantt.config.xml_date = "%Y-%m-%d %H:%i:%s";
gantt.config.branch_loading = true;

gantt.init("gantt_here");

gantt.load("/dynamic_loading");
  • Серверная сторона:
<?php

include ('config.php');

$gantt = new JSONGanttConnector($res, $dbtype);

$parent_id = isset($_GET["parent_id"]) ? $_GET["parent_id"] : 0;

$gantt->mix("open", 0);
$gantt->mix("deep", 1);

$gantt->render_links("gantt_links", "id", "source,target,type");
$gantt->render_table(
"gantt_tasks",
"id",
"start_date,duration,text,progress,parent",
"",
"parent"
);

Связанный образец: Загрузка подпроектов по требованию (branch loading)

Обычно на клиентской стороне нет информации о дочерних элементах отображаемых данных (поскольку такие дети не были загружены с сервера).

Чтобы передать эту информацию, можно использовать специальное свойство данных '$has_child' (его можно изменить с помощью branch_loading_property, которое указывает количество дочерних элементов для задачи).

function check_children($row){
global $gantt;
$task_id = $row->get_value('id');
$sql = "SELECT COUNT(id) AS has_children FROM gantt_tasks WHERE parent='{$task_id}'";
$children = $gantt->sql->query($sql);

$child = $gantt->sql->get_next($children);
$children_qty = $child['has_children'];

$row->set_userdata('$has_child',$children_qty);
}
$gantt->event->attach("beforeRender","check_children");

Связанный образец: Загрузка подпроектов по требованию (branch loading)

Формат данных для динамической загрузки

Формат данных для динамической загрузки следующий:

{
"tasks":[
{
"id":13,
"start_date":"2020-04-02 00:00:00",
"duration":10,
"text":"Task #1",
"progress":0.2,
"parent":12,
"open":0,
"$has_child":0
},
{
"id":14,
"start_date":"2020-04-04 00:00:00",
"duration":4,
"text":"Task #2",
"progress":0.9,
"parent":12,
"open":0,
"$has_child":4
}],

"links":[
{"id":1,"source":1,"target":2,"type":"0"},
{"id":2,"source":1,"target":3,"type":"0"},
{"id":3,"source":1,"target":4,"type":"0"}
]

}

Как видно, это тот же JSON, что и используется для обычной загрузки данных. Чтобы сравнить, смотрите статью Поддерживаемые форматы данных.

Единственное различие — свойство $has_child, которое указывает, будет ли задача отображаться как «лист» (без переключателя «развернуть») или как разворачиваемый узел:

  • если свойство $has_child задано и содержит истинное значение (ненуловое число, true, непустая строка и т. п.), элемент будет отображаться с переключателем разворачивания/сворачивания. При разворачивании переключателя на сервер будет отправлен Ajax-запрос;
  • если $has_child не задано или содержит ложное значение (0, false, NaN, undefined, пустая строка, null), элемент будет отображаться без переключателя, как задача без дочерних элементов.

Если запрос имеет параметр parent_id, ответ должен содержать дочерние элементы задачи с указанным id. Если parent_id не указан, запрос должен содержать задачи корневого уровня:

ДействиеHTTP-методURLОтвет
загрузка задач корневого уровняGET/loadUrlDynamic loading format
загрузка дочерних задач для задачиGET/loadUrl?parent_id=idDynamic loading format

Загрузка задач динамически

Вы можете реализовать динамическую загрузку задач так, чтобы новые задачи загружались после прокрутки до последней видимой задачи. Подробности смотрите в статье Как загрузить задачи динамически.

Связанные API

Need help?
Got a question about the documentation? Reach out to our technical support team for help and guidance. For custom component solutions, visit the Services page.