ตัวอย่างการใช้ 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)
อ่านเพิ่มเติม