หลังจากใช้ MySQL: return json format กันเป็นแล้วเรามาลองใช้กับ joget แทนที่จะต้องไปเขียน BeanShell ให้ยุ่งยาก (พลาดง่าย ๆ อีกตะหาก) ดูจริง ๆ แล้วสามารถใช้กับหน้าเว็บทั้งหมดไม่ใช่แค่ joGet เพราะมันคือ javascript พื้นฐาน
เปิดฟอร์มที่ต้องการมา
- สร้าง section ขึ้นมา โดยกำหนด Load Binder เป็น JDBC Binder และ SQL SELECT Query ใส่ query ที่ต้องการ เช่น
Load Binder for optionsListSELECT CONCAT ('[', GROUP_CONCAT (JSON_OBJECT ('label', name, 'value', appId)) , ']') AS optionsList FROM jwdb.app_app ORDER BY name ASC - ลาก Hidden Field มาตั้ง id เป็น optionsList ใน section ที่สร้างไว้
- เขียน javascript ดึงค่ามาจาก string json ที่เก็บไว้ใน input ชื่อ optionsList โดยใช้ JSON.parse () เผื่อความปลอดภัย ควรใช้ JSON.parse () ใน try catch เพราะว่าถ้า json ที่ได้ผิดปกติจะสามารถควบคุมได้ ลาก Custom HTML มาแล้วใส่ codeJSON.parse () example
<table class="table table-striped" id="tableA"> <thead> <tr> <th scope="col" style="width:20px;">#</th> <th scope="col">Name</th> <th scope="col">Value</th> </tr> </thead> <tbody></tbody> </table> <script> $ (document) .ready (function () { let html = new Array () ; let no = 0; let optionsList = $ ('#optionsList') ; try { let temp = JSON.parse (optionsList.val ()) ; if (temp.length > 0) { $.each (temp, function (index, value) { no++; html.push ('<tr><th scope="row">' + no + '</th><td>' + value.label + '</td><td>' + value.value + '</td><tr>') ; }) ; } if (html.length == 0) { html = '<tr><th scope="row">-</th><td>-</td><td>-</td><tr>'; } else { html = html.join ("\n") ; } } catch (e) { console.log (e.message) ; html = '<h1>Error!!</h1> - Untitled-1:29'; } $ ('#tableA > tbody') .html (html) ; }) ; </script>
สามารถ copy form ตัวอย่างได้จาก json
Form:JSON Parse
{
"className": "org.joget.apps.form.model.Form",
"properties": {
"noPermissionMessage": "",
"loadBinder": {
"className": "org.joget.apps.form.lib.WorkflowFormBinder",
"properties": {}
},
"name": "JSON Parse",
"description": "",
"postProcessorRunOn": "both",
"permission": {
"className": "",
"properties": {}
},
"id": "JSONParse",
"postProcessor": {
"className": "",
"properties": {}
},
"storeBinder": {
"className": "org.joget.apps.form.lib.WorkflowFormBinder",
"properties": {}
},
"tableName": "prototypes"
},
"elements": [
{
"elements": [
{
"elements": [
{
"className": "org.joget.apps.form.lib.HiddenField",
"properties": {
"useDefaultWhenEmpty": "",
"workflowVariable": "",
"id": "optionsList",
"value": ""
}
}
],
"className": "org.joget.apps.form.model.Column",
"properties": {
"width": "100%"
}
}
],
"className": "org.joget.apps.form.model.Section",
"properties": {
"readonly": "",
"loadBinder": {
"className": "org.joget.plugin.enterprise.JdbcLoadBinder",
"properties": {
"jdbcDatasource": "default",
"sql": "SELECT \n CONCAT ('[',\n GROUP_CONCAT (JSON_OBJECT ('label', name, 'value', appId)) ,\n ']') AS optionsList\nFROM\n jwdb.app_app\nORDER BY name ASC"
}
},
"permissionReadonly": "",
"permission": {
"className": "",
"properties": {}
},
"comment": "",
"id": "section1",
"label": "",
"storeBinder": {
"className": "",
"properties": {}
},
"readonlyLabel": ""
}
},
{
"elements": [
{
"elements": [
{
"className": "org.joget.apps.form.lib.CustomHTML",
"properties": {
"autoPopulate": "",
"id": "field2",
"label": "",
"value": "<table class=\"table table-striped\" id=\"tableA\">\n <thead>\n <tr>\n <th scope=\"col\" style=\"width:20px;\">#</th>\n <th scope=\"col\">Name</th>\n <th scope=\"col\">Value</th>\n </tr>\n </thead>\n <tbody>\n </tbody>\n</table>\n<script>\n $ (document) .ready (function () {\n\n let html = new Array () ;\n let no = 0;\n let optionsList = $ ('#optionsList') ;\n try {\n let temp = JSON.parse (optionsList.val ()) ;\n\n if (temp.length > 0) {\n $.each (temp, function (index, value) {\n no++;\n html.push ('<tr><th scope=\"row\">' + no + '</th><td>' + value.label + '</td><td>' + value.value + '</td><tr>') ;\n }) ;\n }\n if (html.length == 0) {\n html = '<tr><th scope=\"row\">-</th><td>-</td><td>-</td><tr>';\n } else {\n html = html.join (\"\\n\") ;\n }\n } catch (e) {\n console.log (e.message) ;\n html = '<h1>Error!!</h1>';\n }\n $ ('#tableA > tbody') .html (html) ;\n\n }) ;\n</script>"
}
}
],
"className": "org.joget.apps.form.model.Column",
"properties": {
"width": "100%"
}
}
],
"className": "org.joget.apps.form.model.Section",
"properties": {
"readonly": "",
"loadBinder": {
"className": "",
"properties": {}
},
"permissionReadonly": "",
"permission": {
"className": "",
"properties": {}
},
"comment": "",
"id": "section2",
"label": "Options List",
"storeBinder": {
"className": "",
"properties": {}
},
"readonlyLabel": ""
}
}
]
}