2015-06-11 4 views
-2

У меня есть столбец назначения ресурсов на моем Gantt. Я могу изменить назначение, но я хочу знать, как их сохранить? Также я могу изменить единицу измерения по умолчанию, равную процентному количеству часов.Как сохранить назначения ресурсов на Gantt Bryntum?

ответ

2

Прочитайте немного о CrudManager, который занимается загрузкой и сохранением данных. У этой ссылки есть все, что вам нужно.

http://www.bryntum.com/docs/scheduling/3.x/?#!/guide/gantt_crud_manager

Введение

В этом руководстве описывается, как использовать менеджер CRUD с Ext Ганта. Он содержит только детали Ганта. Для получения общей информации о реализации и архитектуре менеджера CRUD см. Это руководство.

Класс, реализующий CRUD-менеджер для Ext Gantt, называется Gnt.data.CrudManager. Он использует AJAX в качестве транспортной системы и JSON в качестве формата кодирования. Преимущества использования менеджера CRUD

В предыдущих версиях Ext Gantt вам приходилось загружать и сохранять данные, используя стандартный пакет данных Ext JS. Это потребует установки прокси-серверов в хранилищах данных и обработки загрузки и сохранения в каждом таком хранилище. Такой подход работал, но имел несколько недостатков:

To load data into the Gantt, you had to deal with each store separately. In the worst case, this could mean about 4-5 ajax requests to load the Gantt chart (Tasks, Dependencies, Resources, Assignments, Calendars) depending on which features you used. 
Hard to use database transactions on the server side. 

По соображениям производительности obvisously мы хотели бы процесс загрузки, чтобы использовать один запрос, который возвращает данные, которые будут потребляться всеми магазинами, используемых в диаграмме Ганта , Это теперь легко достичь, поскольку CM загружает данные по одному запросу. Когда дело доходит до сохранения изменений, вы обычно хотите иметь «все или ничего» на основе транзакций подход к постоянным обновлениям в вашей базе данных. Это невозможно, если вы используете два отдельных запроса ajax. Магазины

В Ext Gantt используется несколько разных объектов данных: календари, ресурсы, назначения, зависимости и задачи. Чтобы зарегистрировать их с помощью экземпляра Gnt.data.CrudManager, следует использовать следующие конфигурации: calendarManager, resourceStore, assignStore, dependencyStore, taskStore.

Вот как базовая конфигурация будет выглядеть:

var crudManager = new Gnt.data.CrudManager({ 
    autoLoad  : true, 
    calendarManager : calendarManager, 
    resourceStore : resourceStore, 
    dependencyStore : dependencyStore, 
    assignmentStore : assignmentStore 
    taskStore  : taskStore, 
    transport  : { 
     load : { 
      url  : 'php/read.php' 
     }, 
     sync : { 
      url  : 'php/save.php' 
     } 
    } 
}); 

Бэкэнд, в этом случае «read.php» должен возвращать JSON похож на один замеченный ниже:

{ 
    "success"  : true, 

    "dependencies" : { 
     "rows" : [ 
      {"Id" : 1, "From" : 11, "To" : 17, "Type" : 2, "Lag" : 0, "Cls" : "", "LagUnit" : "d"}, 
      {"Id" : 2, "From" : 12, "To" : 17, "Type" : 2, "Lag" : 0, "Cls" : "", "LagUnit" : "d"}, 
      {"Id" : 3, "From" : 13, "To" : 17, "Type" : 2, "Lag" : 0, "Cls" : "", "LagUnit" : "d"} 
     ] 
    }, 

    "assignments" : { 
     "rows" : [ 
      { 
       "Id"   : 1, 
       "TaskId"  : 11, 
       "ResourceId" : 1, 
       "Units"  : 100 
      }, 
      { 
       "Id"   : 2, 
       "TaskId"  : 11, 
       "ResourceId" : 2, 
       "Units"  : 80 
      } 
     ] 
    }, 

    "resources" : { 
     "rows" : [ 
      {"Id" : 1, "Name" : "Mats" }, 
      {"Id" : 2, "Name" : "Nickolay" }, 
      {"Id" : 3, "Name" : "Goran" } 
     ] 
    }, 

    "tasks" : { 
     "rows" : [ 
      { 
       "BaselineEndDate" : "2010-01-28", 
       "Id"    : 11, 
       "leaf"    : true, 
       "Name"    : "Investigate", 
       "PercentDone"  : 50, 
       "TaskType"   : "LowPrio", 
       "StartDate"   : "2010-01-18", 
       "BaselineStartDate" : "2010-01-20", 
       "Segments"   : [ 
        { 
         "Id"    : 1, 
         "StartDate"   : "2010-01-18", 
         "Duration"   : 1 
        }, 
        { 
         "Id"    : 2, 
         "StartDate"   : "2010-01-20", 
         "Duration"   : 2 
        }, 
        { 
         "Id"    : 3, 
         "StartDate"   : "2010-01-25", 
         "Duration"   : 5 
        } 
       ] 
      }, 
      { 
       "BaselineEndDate" : "2010-02-01", 
       "Id"    : 12, 
       "leaf"    : true, 
       "Name"    : "Assign resources", 
       "PercentDone"  : 50, 
       "StartDate"   : "2010-01-18", 
       "BaselineStartDate" : "2010-01-25", 
       "Duration"   : 10 
      }, 
      { 
       "BaselineEndDate" : "2010-02-01", 
       "Id"    : 13, 
       "leaf"    : true, 
       "Name"    : "Gather documents (not resizable)", 
       "Resizable"   : false, 
       "PercentDone"  : 50, 
       "StartDate"   : "2010-01-18", 
       "BaselineStartDate" : "2010-01-25", 
       "Duration"   : 10 
      }, 
      { 
       "BaselineEndDate" : "2010-02-04", 
       "Id"    : 17, 
       "leaf"    : true, 
       "Name"    : "Report to management", 
       "PercentDone"  : 0, 
       "StartDate"   : "2010-01-30", 
       "BaselineStartDate" : "2010-01-29", 
       "Duration"   : 0 
      } 
     ] 
    } 
} 

Не следует указывать конфигурации calendarManager, resourceStore, dependencyStore и assignStore, если они уже указаны для экземпляра хранилища задач. В этом случае менеджер CRUD будет просто взять их из предоставленного экземпляра магазина задачи:

var taskStore = new Gnt.data.TaskStore({ 
    calendarManager : calendarManager, 
    resourceStore : resourceStore, 
    dependencyStore : dependencyStore, 
    assignmentStore : assignmentStore 
}); 

var crudManager = new Gnt.data.CrudManager({ 
    // Specifying TaskStore only 
    taskStore  : taskStore, 
    transport  : { 
     load : { 
      url  : 'php/read.php' 
     }, 
     sync : { 
      url  : 'php/save.php' 
     } 
    } 
}); 

Вы можете предоставить любое количество дополнительных магазинов с использованием магазинов CONFIG:

варом crudManager = новый Gnt.data. CrudManager ({ taskStore: taskStore, магазины: [store1, store2, store3], транспорт: { нагрузка: { URL: 'PHP/read.php' }, синхронизации: { URL: «PHP/спасти.php ' } } });

Или добавить их программно с помощью метода addStore:

crudManager.addStore([ store2, store3 ]); 

Реализация

Вот как менеджер CRUD может быть создан:

var crudManager = new Gnt.data.CrudManager({ 
    autoLoad  : true, 
    taskStore  : taskStore, 
    transport  : { 
     load : { 
      url  : 'php/read.php' 
     }, 
     sync : { 
      url  : 'php/save.php' 
     } 
    } 
}); 

В приведенном выше примере данных, тем операция загрузки начнется автоматически, так как CM настроен с параметром autoLoad, установленным в true. Существует также метод загрузки для вызова загрузки вручную:

crudManager.load(function (response) { 
    alert('Data loaded...'); 
}) 

Чтобы сохранить изменения автоматически, есть возможность AUTOSYNC, и вы, конечно, можете также вызвать метод синхронизации вручную, если это необходимо:

crudManager.sync(function (response) { 
    alert('Changes saved...'); 
}); 

Любые экземпляры Gnt.panel.Gantt могут быть настроены на использование CRUD-менеджера, предоставляя конфигурацию crudManager. В этом случае вам не нужно указывать объекты taskStore, dependencyStore, resourceStore, assignStore на панели Gantt. Они будут взяты из предоставленного экземпляра crudManager.

new Gnt.panel.Gantt({ 
    viewPreset   : 'dayAndWeek', 
    startDate   : new Date(2014, 0, 1), 
    endDate    : new Date(2014, 1, 1), 
    width    : 800, 
    height    : 350, 
    // point grid to use CRUD manager 
    crudManager   : crudManager 
    columns    : [ 
     { 
      xtype : 'namecolumn' 
     }, 
     { 
      xtype : 'startdatecolumn' 
     } 
    ] 
}); 

Календари

Gnt.data.CrudManager поддерживает массовую загрузку всех календарей проекта в проект. Чтобы это сделать, необходимо указать конфигурацию Gnt.data.CrudManager.calendarManager или ее можно указать в хранилище задач.

var calendarManager = Ext.create('Gnt.data.CalendarManager', { 
    calendarClass : 'Gnt.data.calendar.BusinessTime' 
}); 

... 

var taskStore  = Ext.create('Gnt.data.TakStore', { 
    // taskStore calendar will automatically be set when calendarManager gets loaded 
    calendarManager : calendarManager, 
    resourceStore : resourceStore, 
    dependencyStore : dependencyStore, 
    assignmentStore : assignmentStore 
}); 

var crudManager = Ext.create('Gnt.data.CrudManager', { 
    autoLoad  : true, 
    taskStore  : taskStore, 
    transport  : { 
     load : { 
      url  : 'php/read.php' 
     }, 
     sync : { 
      url  : 'php/save.php' 
     } 
    } 
}); 

отклик нагрузки структура отклика нагрузки

календаря менеджер имеет немного более сложную структуру, чем описанный общий.

Первое отличие от стандартного ответа заключается в том, что для каждого календаря мы включаем его данные в поле Дни. Объект в поле «Дни» имеет ту же структуру, что и любой другой объект, содержащий данные хранилища. В нем есть строки, содержащие массив записей календаря (каждый из них представляет экземпляр Gnt.model.CalendarDay), а общее число определяет их количество.

Еще одна вещь, о которой стоит обратить внимание, заключается в том, как метаданные используются для загрузки менеджера календарей. Он имеет свойство projectCalendar, которое должно содержать идентификатор календаря, который должен использоваться в качестве календаря проекта.

{ 
    requestId : 123890, 
    revision : 123, 
    success  : true, 

    calendars : { 
     // each record represents a Gnt.model.Calendar instance 
     rows  : [ 
      { 
       Id     : "1", 
       parentId   : null, 
       Name    : "General", 
       DaysPerMonth  : 20, 
       DefaultAvailability : ["08:00-12:00","13:00-17:00"], 
       ... 
       // the calendar data 
       Days    : { 
        // each record represents Gnt.model.CalendarDay instance 
        rows : [{ 
         Id     : 2, 
         calendarId   : "1", 
         Name    : "Some big holiday", 
         Type    : "DAY", 
         Date    : "2010-01-14", 
         Availability  : [], 
         Weekday    : 0, 
         OverrideStartDate : null, 
         OverrideEndDate  : null, 
         IsWorkingDay  : false, 
         Cls     : "gnt-national-holiday" 
        }], 
        total : 1 
       }, 
       // child calendars go here 
       // each record represents a Gnt.model.Calendar instance 
       children : [{ 
        Id   : "2", 
        parentId : "1", 
        Name  : "Holidays", 
        ... 
        // "Holidays" calendar data 
        Days  : { 
         // each record represents Gnt.model.CalendarDay instance 
         rows : [ 
          { 
           Id   : 3, 
           calendarId : "2", 
           Name  : "Mats's birthday", 
           Date  : "2010-01-13", 
           ... 
          }, 
          { 
           Id   : 4 
           calendarId : "2", 
           Name  : "Bryntum company holiday", 
           Date  : "2010-02-01", 
           ... 
          }, 
          { 
           Id   : 5, 
           calendarId : "2", 
           Name  : "Bryntum 1st birthday", 
           Date  : "2010-12-01", 
           ... 
          } 
         ], 
         total : 3 
        }, 
        leaf : true 
       }] 
      } 
     ], 
     total  : 2, 
     metaData : { 
      // this specifies the identifier of the project calendar 
      projectCalendar : "1" 
     } 

    }, 

    store2  : { 
     ... 
    }, 

    store3  : { 
     ... 
    } 
} 
+0

Ok mats! Но хотелось бы знать, могу ли я изменить значение единицы по умолчанию для распределения ресурсов в процентах к часам –