หลังจากใช้ 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": "" } } ]
}