DHXScheduler Сохранить / получить пользовательские поля лайтбокса

Я использую DHXScheduler в своем приложении JSP для расписания экзаменов. Я добавил полностью настраиваемый лайтбокс со своими полями с информацией об экзаменах.

Это мой класс EventsManager, который сохраняет, создает и получает события. Он расширяет класс DHXEventsManager.

public class EventsManager extends DHXEventsManager {

public EventsManager(HttpServletRequest request) {          
    super(request);
}

public Iterable getEvents() {

    Connection conn = null;
    DHXEventsManager.date_format = "yyyy-MM-dd HH:mm:ss";
    List<Event> events = new ArrayList<Event>();

    try {

        conn = SQLHelper.getConnection();
        Statement statement = conn.createStatement();

        StringBuffer query = new StringBuffer();
        query.append("SELECT * FROM ");
        query.append(TimetableEvent.TBL_EVENTS);
        query.append(" e JOIN ");
        query.append(StudyUnit.TBL_STUDYUNITS);
        query.append(" s ON e.");
        query.append(TimetableEvent.FLD_UNITCODE);
        query.append(" = s.");
        query.append(StudyUnit.FLD_UNITCODE);

        ResultSet rs = statement.executeQuery(query.toString());

        while (rs.next()) {

            Event e = new Event(); // extends DHXEvent and contains additional fields

            e.setId(Integer.parseInt(rs.getString(TimetableEvent.FLD_ID)));
            e.setText(rs.getString(TimetableEvent.FLD_UNITCODE));
            e.setStart_date(rs.getString(TimetableEvent.FLD_STARTDATE));
            e.setEnd_date(rs.getString(TimetableEvent.FLD_ENDDATE));
            e.setUnitCode(rs.getString(StudyUnit.FLD_UNITCODE));
            e.setTitle(rs.getString(StudyUnit.FLD_TITLE));
            e.setYear(rs.getString(StudyUnit.FLD_YEAR));
            e.setSemester(rs.getShort(StudyUnit.FLD_SEMESTER));
            e.setExamLength(rs.getFloat(StudyUnit.FLD_EXAMLENGTH));
            e.setNoOfStudents(rs.getShort(StudyUnit.FLD_NOOFSTUDENTS));
            e.setDepartment(rs.getString(StudyUnit.FLD_DEPARTMENT));
            e.setCredits(rs.getShort(StudyUnit.FLD_CREDITS));
            e.setEvening(rs.getBoolean(StudyUnit.FLD_EVENING));

            events.add(e);
            }

        } catch (SQLException e) {
            System.out.println("[EventsManager.getEvents()]: " + e.getMessage());

        } finally {
            SQLHelper.closeConnection(conn);
        }

        DHXEventsManager.date_format = "MM/dd/yyyy HH:mm";
        return events;
    }

    @Override
    public DHXStatus saveEvent(DHXEv event, DHXStatus status) {
    Connection conn = SQLHelper.getConnection();
    PreparedStatement pstmt = null;
    ResultSet rs = null;

    Event ev = (Event) event;

    try {

        if (status == DHXStatus.UPDATE) {
            pstmt = TimetableEvent.updateEvent(conn, ev);

        } else if (status == DHXStatus.INSERT) {
            System.out.println("SAVE");
            pstmt = TimetableEvent.insertEvent(conn, ev);

        } else if (status == DHXStatus.DELETE) {
            pstmt = TimetableEvent.deleteEvent(conn, event);
        }

        if (pstmt != null) {
            pstmt.executeUpdate();
            rs = pstmt.getGeneratedKeys();

            if (rs.next()) {
                event.setId(rs.getInt(1));
                ev.setId(rs.getInt(1));
            }
        }

    } catch (SQLException e) {
        System.out.println("[EventsManager.saveEvent() - " + status.name() + "]: " + e.getMessage());
        e.printStackTrace();

    } finally {

        if (rs != null) SQLHelper.closeResultSet(rs);
        if (pstmt != null) SQLHelper.closePreparedStatement(pstmt);
        if (conn != null) SQLHelper.closeConnection(conn);
    }

    return status;
}

    @Override
public DHXEv createEvent(String id, DHXStatus status) {
    return new Event();
}
}

Event класс расширяется DHXEvent и содержит геттеры и сеттеры для дополнительных полей. Проблема в том, что когда я кастую из DHXEv в EventЯ теряю дополнительные поля для нуля, но метод saveEvent принимает только DHXEv в качестве параметра.

Это events.jsp файл, в котором вызывается метод getEvents() из EventsManager для получения объектов JSON с событиями.

<%@ page contentType="application/json" 
         import="com.dhtmlx.planner.*,servlets.*,events.EventsManager"
%>

<%= getEvents(request) %>
<%!
    String getEvents(HttpServletRequest request) throws Exception {
        EventsManager evs = new EventsManager(request);
        return evs.run();
    }
%>

Это образец того, что его возвращают. Как видите, он возвращает только поля из DHXEv объект т.е. id, start_date, end_date and text,

{id:7, text:CIS3087, end_date:03/27/2014 13:00, start_date:03/27/2014 10:00}

Как я могу добавить эти дополнительные поля к объекту JSON, т.е. иметь объект с названием учебного подразделения, отделом и т. Д.?

Это некоторый соответствующий код на стороне клиента для планировщика... его конфигурации и методов save_form() и show_lightbox:

scheduler.config.api_date = "%Y-%m-%d %H:%i";
scheduler.config.details_on_dblclick = true;
scheduler.config.details_on_create = true;
scheduler.config.first_hour = "8";  
scheduler.config.last_hour = "22";
scheduler.config.drag_lightbox = true;
scheduler.config.show_loading = true;
scheduler.config.mark_now = true;

scheduler.init('scheduler_here', new Date(), "week");
scheduler.load("events.jsp", "json");

var dp = new dataProcessor("events.jsp");
dp.init(scheduler);

function save_form() {
      var ev = scheduler.getEvent(scheduler.getState().lightbox_id);

      ev.text = html("studyunit_code").value;
      ev.start_date = setDate("start_date", "starttime");
      ev.end_date = setDate("start_date", "endtime");

      scheduler.endLightbox(true, html("custom_form"));

      $("#form1").submit(); // submits all the other fields and saves them to a db table
}

scheduler.showLightbox = function(id) {

    var ev = scheduler.getEvent(id);
    scheduler.startLightbox(id, html("custom_form"));

    html("studyunit_code").value = ev.text;
    html("studyunit_code").focus();
    html("studyunit_title").value = ev.studyunit_title;

    var startDate = ev.start_date;
    getDate(startDate, "start_date", "starttime");

    var endDate = ev.end_date;
    getDate(endDate, "start_date", "endtime");              
};

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

Ты хоть представляешь, как я могу это решить? Спасибо!

1 ответ

Пожалуйста, убедитесь, что дополнительные поля в классе Event являются открытыми. DHXEventsManager использует Class.getFields() для получения свойств события. Если свойство является частным, то оно не доступно в сгенерированном JSON.

Другие вопросы по тегам