ป้ายกำกับ: ฟอร์ม

joget: BeanShell Form Binderjoget: BeanShell Form Binder

ตัวอย่างการใช้ BeanShell ดึงค่าจาก database มาแสดง

สร้าง table app_fd_prototype โดยใช้

--
-- Table structure for table `app_fd_prototype`
--

CREATE TABLE `app_fd_prototype` (
`id` varchar(255) NOT NULL,
`dateCreated` datetime DEFAULT NULL,
`dateModified` datetime DEFAULT NULL,
`c_Checkbox` longtext NOT NULL,
`c_DatePicker` longtext NOT NULL,
`c_FileUpload` longtext NOT NULL,
`c_HiddenField` longtext NOT NULL,
`c_PasswordField` longtext NOT NULL,
`c_Radio` longtext NOT NULL,
`c_SelectBox` longtext NOT NULL,
`c_TextArea` longtext NOT NULL,
`c_TextField` longtext NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Dumping data for table `app_fd_prototype`
--

INSERT INTO `app_fd_prototype` (`id`, `dateCreated`, `dateModified`, `c_Checkbox`, `c_DatePicker`, `c_FileUpload`, `c_HiddenField`, `c_PasswordField`, `c_Radio`, `c_SelectBox`, `c_TextArea`, `c_TextField`) VALUES
('399895e8-ac15e1b1-2ddac962-1ca1ea8b', '2017-10-02 00:00:00', '2017-10-27 00:00:00', 'permanent', '10/09/2017', '04a972cda3440360b437a67d3a0dbb9d.jpg ', 'HiddenField	', 'PasswordField', 'male', 'programmer', 'โปรแกรมเมอร์ธรรมดาที่อยากเขียนสิ่งที่ไม่ธรรมดา ลูกค้า ผู้ชมเข้ามาดูต้องบอกว่า ดี แจ๋ง ง่าย แต่คนเขียนต้องไม่ลำบากกับชีวิต', 'pitt phunsanit');

--
-- Indexes for dumped tables
--

--
-- Indexes for table `app_fd_prototype`
--
ALTER TABLE `app_fd_prototype`
ADD PRIMARY KEY (`id`);
COMMIT;

สร้างฟอร์มโดยใช้
ADVANCED: JSON Definition

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.joget.apps.app.service.AppUtil;
import org.joget.apps.form.model.Element;
import org.joget.apps.form.model.FormData;
import org.joget.apps.form.model.FormRow;
import org.joget.apps.form.model.FormRowSet;
import org.joget.commons.util.LogUtil;

public FormRowSet load(Element element, String primaryKey, FormData formData) {
    FormRowSet rows = new FormRowSet();
    
    // ตรวจสอบ primaryKey (Unescaped && เรียบร้อยแล้ว)
    if (primaryKey != null && !primaryKey.isEmpty()) {
        Connection con = null;
        try {
            /* ดึง DataSource หลักของ Joget */
            DataSource ds = (DataSource) AppUtil.getApplicationContext().getBean("setupDataSource");
            con = ds.getConnection();

            if (con != null && !con.isClosed()) {
                /* SQL Query ดึงข้อมูลจากตาราง Table Name ที่ระบุ */
                String sql = "SELECT c_Checkbox, c_DatePicker, c_FileUpload, c_HiddenField, c_PasswordField, c_Radio, c_SelectBox, c_TextArea, c_TextField FROM app_fd_prototype WHERE id = ?";
                PreparedStatement stmt = con.prepareStatement(sql);
                stmt.setString(1, primaryKey);

                ResultSet rs = stmt.executeQuery();
                if (rs.next()) {
                    FormRow row = new FormRow();
                    
                    // ดึงค่ามาพักไว้และจัดการ Null Safety ก่อน put ลง FormRow
                    // หมายเหตุ: ชื่อ key ใน row.put ต้องตรงกับ ID ของ Element ใน Form
                    row.put("Checkbox", (rs.getObject("c_Checkbox") != null) ? rs.getObject("c_Checkbox").toString() : "");
                    row.put("DatePicker", (rs.getObject("c_DatePicker") != null) ? rs.getObject("c_DatePicker").toString() : "");
                    row.put("FileUpload", (rs.getObject("c_FileUpload") != null) ? rs.getObject("c_FileUpload").toString() : "");
                    row.put("HiddenField", (rs.getObject("c_HiddenField") != null) ? rs.getObject("c_HiddenField").toString() : "");
                    row.put("PasswordField", (rs.getObject("c_PasswordField") != null) ? rs.getObject("c_PasswordField").toString() : "");
                    row.put("Radio", (rs.getObject("c_Radio") != null) ? rs.getObject("c_Radio").toString() : "");
                    row.put("SelectBox", (rs.getObject("c_SelectBox") != null) ? rs.getObject("c_SelectBox").toString() : "");
                    row.put("TextArea", (rs.getObject("c_TextArea") != null) ? rs.getObject("c_TextArea").toString() : "");
                    row.put("TextField", (rs.getObject("c_TextField") != null) ? rs.getObject("c_TextField").toString() : "");

                    rows.add(row);
                }
            }
        } catch (Exception e) {
            LogUtil.error("BeanShell Form Binder", e, "Error loading data for ID: " + primaryKey);
        } finally {
            try {
                if (con != null && !con.isClosed()) {
                    con.close();
                }
            } catch (SQLException e) {
                /* Ignored */
            }
        }
    }
    return rows;
}

// เรียกใช้ Method load
return load(element, primaryKey, formData);

ใส่ Edit Form > Advanced > Configure BeanShell Form Binder
Configure BeanShell Form Binder

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.joget.apps.app.service.AppUtil;
import org.joget.apps.form.model.Element;
import org.joget.apps.form.model.FormData;
import org.joget.apps.form.model.FormRow;
import org.joget.apps.form.model.FormRowSet;
import org.joget.commons.util.LogUtil;

public FormRowSet load(Element element, String primaryKey, FormData formData) {
    FormRowSet rows = new FormRowSet();
    
    // แก้ไขจาก && เป็น && ปกติ
    if (primaryKey != null && !primaryKey.isEmpty()) {
        Connection con = null;
        try {
            DataSource ds = (DataSource) AppUtil.getApplicationContext().getBean("setupDataSource");
            con = ds.getConnection();

            if (con != null && !con.isClosed()) {
                String sql = "SELECT c_Checkbox, c_DatePicker, c_FileUpload, c_HiddenField, c_PasswordField, c_Radio, c_SelectBox, c_TextArea, c_TextField FROM app_fd_prototype WHERE id = ?";
                PreparedStatement stmt = con.prepareStatement(sql);
                stmt.setString(1, primaryKey);

                ResultSet rs = stmt.executeQuery();
                if (rs.next()) {
                    FormRow row = new FormRow();

                    // สร้าง Helper Function ภายใน (เลือกใช้ตามความเหมาะสม) หรือเขียนแบบสั้น
                    // row.put(ID_Element, Value)
                    row.put("Checkbox",      formatValue(rs.getObject("c_Checkbox")));
                    row.put("DatePicker",    formatValue(rs.getObject("c_DatePicker")));
                    row.put("FileUpload",    formatValue(rs.getObject("c_FileUpload")));
                    row.put("HiddenField",    formatValue(rs.getObject("c_HiddenField")));
                    row.put("PasswordField",  formatValue(rs.getObject("c_PasswordField")));
                    row.put("Radio",         formatValue(rs.getObject("c_Radio")));
                    row.put("SelectBox",     formatValue(rs.getObject("c_SelectBox")));
                    row.put("TextArea",      formatValue(rs.getObject("c_TextArea")));
                    row.put("TextField",     formatValue(rs.getObject("c_TextField")));

                    rows.add(row);
                }
            }
        } catch (Exception e) {
            LogUtil.error("BeanShell Form Binder", e, "Error loading data for ID: " + primaryKey);
        } finally {
            try {
                if (con != null && !con.isClosed()) {
                    con.close();
                }
            } catch (SQLException e) { /* ignored */ }
        }
    }
    return rows;
}

// Helper method เพื่อลดความซ้ำซ้อนของโค้ด
private String formatValue(Object obj) {
    return (obj != null) ? obj.toString() : "";
}

/* เรียกใช้ method */
return load(element, primaryKey, formData);

Injected Variables:

element
Element that this binder is tie to. (org.joget.apps.form.model.Element)
primaryKey
The primary key provided by the element to load data. (java.lang.String)
formData
The data holder of the whole form. (org.joget.apps.form.model.FormData)

อ่านเพิ่มเติม