Joget DX 8 Stable Released
The stable release for Joget DX 8 is now available, with a focus on UX and Governance.
...
We can develop a เราสามารถพัฒนา ปลั๊กอินตัวจัดรูปแบบคอลัมน์ข้อมูล (Datalist Column Formatter Plugin) to convert the value to a link. เพื่อแปลงค่าเป็นลิงค์
The file download link format of รูปแบบลิงค์ดาวน์โหลดไฟล์ของ Joget Workflow isคือ
/jw/web/client/app/{appId}/{appVersion}/form/download/{formId}/{recordId}/{fileName}.?attachment=true
Sampleตัวอย่าง:
http://localhost:8080/jw/web/client/app/test/1/form/download/testFile/f6946830-c0a80070-48cad9b7-8b971682/CHANGES.txt.?attachment=true
From the link format, we need to get the following information from admin user.จากรูปแบบลิงก์เราต้องได้รับข้อมูลต่อไปนี้จากผู้ใช้งาน admin
...
ชื่อไฟล์จะปรากฏเป็นลิงค์ใน DatalistThe file name is displayed as a link in Datalist.
...
...
We can refer to the คุณสามารถอ้างอิงถึง File Upload Field on how to generate the download link of the file. เกี่ยวกับวิธีสร้างลิงค์ดาวน์โหลดของไฟล์
...
...
เราจำเป็นต้องให้ซอร์สโค้ด Joget Workflow ของเราพร้อมและสร้างโดยทำตาม We need to always have our Joget Workflow Source Code ready and builded by following this guideline.
The following of this tutorial is prepared with a Macbook Pro and บทช่วยสอนต่อไปนี้จัดทำขึ้นด้วย Macbook Pro และ Joget Source Code version 5.0.0. Please refer to แนวทางสำหรับการพัฒนาปลั๊กอิน for other platform command.โปรดอ้างอิงถึง แนวทางสำหรับการพัฒนาปลั๊กอิน เพื่อคำสั่งแพลตฟอร์มอื่นๆ
ให้กล่าวว่าไดเรกทอรีโฟลเดอร์ของเราดังต่อไปนี้Let said our folder directory as following.
Code Block |
---|
- Home - joget - plugins - jw-community -5.0.0 |
The ไดเรกทอรี "plugins" directory is the folder we will create and store all our plugins and the ปลั๊กอิน" คือโฟลเดอร์ที่เราจะสร้างและจัดเก็บปลั๊กอินทั้งหมดของเราและไดเรกทอรี "jw-community" directory is where the เป็นที่เก็บซอร์สโค้ด Joget Workflow Source code stored.
เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างโครงการ maven ในไดเรกทอรี "ปลั๊กอิน"Run the following command to create a maven project in "plugins" directory.
Code Block | ||
---|---|---|
| ||
cd joget/plugins/ ~/joget/jw-community/5.0.0/wflow-plugin-archetype/create-plugin.sh org.joget.tutorial file_link_datalist_formatter 5.0.0 |
Then, the shell script will ask us to key in a version for your plugin and ask us for confirmation before generate the maven project.จากนั้น the shell script จะขอให้เราป้อนปลั๊กอินสำหรับรุ่นของคุณและขอให้เรายืนยันก่อนสร้างโครงการ maven
Code Block | ||
---|---|---|
| ||
Define value for property 'version': 1.0-SNAPSHOT: : 5.0.0 [INFO] Using property: package = org.joget.tutorial Confirm properties configuration: groupId: org.joget.tutorial artifactId: file_link_datalist_formatter version: 5.0.0 package: org.joget.tutorial Y: : y |
We should get เราควรได้รับข้อความ "BUILD SUCCESS" message shown in our terminal and a ที่แสดงในเครื่องของเราและโฟลเดอร์ "file_link_datalist_formatter" folder created in ที่สร้างในโฟลเดอร์ "plugins" folder.
Open the maven project with your favour IDE. I will be using NetBeans. เปิดโครงการ maven ด้วย IDE ที่คุณโปรดปราน เราแนะนำให้ใช้ NetBeans.
...
...
...
สร้างคลาส Create a "FileLinkDatalistFormatter" class under ภายใต้ "org.joget.tutorial" package. Then, extend the class with จากนั้นขยายคลาสด้วย org.joget.apps.datalist.model.DataListColumnFormatDefault abstract class. โปรดอ้างอิงถึง Please refer to ปลั๊กอินตัวจัดรูปแบบคอลัมน์ข้อมูล (Datalist Column Formatter Plugin).
...
...
เช่นเคยเราจะต้องใช้ As usual, we have to implement all the abstract methods ทั้งหมด. We will using เราจะใช้ AppPluginUtil.getMessage method to support i18n and using constant variable เพื่อสนับสนุน i18n และใช้ตัวแปรคงที่ MESSAGE_PATH for สำหรับ message resource bundle directory.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
package org.joget.tutorial; import org.joget.apps.app.service.AppPluginUtil; import org.joget.apps.app.service.AppUtil; import org.joget.apps.datalist.model.DataList; import org.joget.apps.datalist.model.DataListColumn; import org.joget.apps.datalist.model.DataListColumnFormatDefault; public class FileLinkDatalistFormatter extends DataListColumnFormatDefault { private final static String MESSAGE_PATH = "messages/FileLinkDatalistFormatter"; public String getName() { return "File Link Datalist Formatter"; } public String getVersion() { return "5.0.0"; } public String getClassName() { return getClass().getName(); } public String getLabel() { //support i18n return AppPluginUtil.getMessage("org.joget.tutorial.FileLinkDatalistFormatter.pluginLabel", getClassName(), MESSAGE_PATH); } public String getDescription() { //support i18n return AppPluginUtil.getMessage("org.joget.tutorial.FileLinkDatalistFormatter.pluginDesc", getClassName(), MESSAGE_PATH); } public String getPropertyOptions() { return AppUtil.readPluginResource(getClassName(), "/properties/fileLinkDatalistFormatter.json", null, true, MESSAGE_PATH); } public String format(DataList dataList, DataListColumn column, Object row, Object value) { throw new UnsupportedOperationException("Not supported yet."); } } |
Then, we have to do a UI for admin user to provide inputs for our plugin. In getPropertyOptions method, we already specify our ตัวเลือกคุณสมบัติปลั๊กอิน definition file is locate at จากนั้นเราต้องทำ UI สำหรับผู้ใช้ผู้ดูแลระบบเพื่อให้อินพุตสำหรับปลั๊กอินของเรา ใน getPropertyOptions method, เราได้ระบุไฟล์ ตัวเลือกคุณสมบัติปลั๊กอิน ของเราไว้ที่ "/properties/fileLinkDatalistFormatter.json". Let us create a ให้เราสร้าง directory "resources/properties" under ภายใต้ "file_link_datalist_formatter/src/main" directory. After create the หลังจากสร้าง directory, create a file named สร้างไฟล์ชื่อ "fileLinkDatalistFormatter.json" in the ในโฟลเดอร์ "properties" folder.
ในไฟล์ตัวเลือกคุณสมบัติ, เราจะต้องกำหนดตัวเลือกดังต่อไปนี้. โปรดทราบว่าเราสามารถใช้ In the properties definition options file, we will need to provide options as below. Please note that we can use "@@message.key@@" syntax to support i18n in our properties options.เพื่อสนับสนุน i18n ในตัวเลือกคุณสมบัติของเรา
Code Block | ||
---|---|---|
| ||
[{ title : '@@datalist.fileLinkFormatter.config@@', properties : [{ name : 'formDefId', label : '@@datalist.fileLinkFormatter.form@@', type : 'selectbox', options_ajax : '[CONTEXT_PATH]/web/json/console/app[APP_PATH]/forms/options', required : 'True' }, { name : 'attachment', label : '@@datalist.fileLinkFormatter.attachment@@', type : 'checkbox', options : [{ value : 'true', label : '' }] }] }] |
Code Block | ||
---|---|---|
| ||
public String format(DataList dataList, DataListColumn column, Object row, Object value) { String result = (String) value; if (result != null && !result.isEmpty()) { try { String formDefId = getPropertyString("formDefId"); AppDefinition appDef = AppUtil.getCurrentAppDefinition(); result = ""; String attachment = ""; if ("true".equals(getPropertyString("attachment"))) { attachment = "?attachment=true"; } //get the id of this record String primaryKeyValue = (String) LookupUtil.getBeanProperty(row, dataList.getBinder().getPrimaryKeyColumnName()); HttpServletRequest request = WorkflowUtil.getHttpServletRequest(); //suport for multi values for (String v : value.toString().split(";")) { if (!v.isEmpty()) { // determine actual path for the file uploads String fileName = v; String encodedFileName = fileName; try { encodedFileName = URLEncoder.encode(fileName, "UTF8").replaceAll("\\+", "%20"); } catch (UnsupportedEncodingException ex) { // ignore } String filePath = request.getContextPath() + "/web/client/app/" + appDef.getAppId() + "/" + appDef.getVersion().toString() + "/form/download/" + formDefId + "/" + primaryKeyValue + "/" + encodedFileName + "." + attachment; if (!result.isEmpty()) { result += ", "; } result += "<a href=\""+filePath+"\" target=\"_blank\">"+StringUtil.stripAllHtmlTag(fileName)+"</a>"; } } } catch (Exception e) { LogUtil.error(getClassName(), e, ""); } } return result; } |
ปลั๊กอินของเราใช้คลาส Our plugin is using org.displaytag.util.LookupUtil and class, it required displaytag and และมันจำเป็นต้องใช้ displaytag และ jsp-api library. So, we have to add it to our POM file.ดังนั้นเราต้องเพิ่มในไฟล์ POM ของเรา
Code Block | ||
---|---|---|
| ||
<!-- Change plugin specific dependencies here --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>displaytag</groupId> <artifactId>displaytag</artifactId> <version>1.2</version> <exclusions> <exclusion> <artifactId>slf4j-api</artifactId> <groupId>org.slf4j</groupId> </exclusion> <exclusion> <artifactId>jcl104-over-slf4j</artifactId> <groupId>org.slf4j</groupId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency> <!-- End change plugin specific dependencies here --> |
We are using เรากำลังใช้ i18n message key in ใน getLabel and และ getDescription method. We also used i18n เรายังใช้ i18n message key in our properties options definition as well. So, we will need to create a ในไฟตัวเลือกคุณสมบัติของเราด้วย. ดังนั้นเราจะต้องสร้างไฟล์ message resource bundle properties file for our plugin.สำหรับปลั๊กอินของเรา
สร้าง Create directory "resources/messages" under ภายใต้ "file_link_datalist_formatter/src/main" directory. Then, create a จากนั้นสร้างไฟล์ "FileLinkDatalistFormatter.properties" file in the folder. In the properties file, let add all the message keys and its label as below.ในโฟลเดอร์ ในไฟล์ตัวเลือกเราต้องเพิ่ม message keys และ label ดังต่อไปนี้
Code Block |
---|
org.joget.tutorial.FileLinkDatalistFormatter.pluginLabel=File Link Datalist Formatter org.joget.tutorial.FileLinkDatalistFormatter.pluginDesc=To format the column value as attachment download link. datalist.fileLinkFormatter.config=Configure File Link Formatter datalist.fileLinkFormatter.form=Form datalist.fileLinkFormatter.attachment=Download as Attachment? |
We will have to register our plugin class in Activator เราจะต้องลงทะเบียนคลาสปลั๊กอินของเราใน Activator class (Auto generated in the same class package) to tell เพื่อบอก Felix Framework that this is a plugin.ว่านี่คือปลั๊กอิน
Code Block | ||
---|---|---|
| ||
public void start(BundleContext context) { registrationList = new ArrayList<ServiceRegistration>(); //Register plugin here registrationList.add(context.registerService(FileLinkDatalistFormatter.class.getName(), new FileLinkDatalistFormatter(), null)); } |
ให้สร้างปลั๊กอินของเรา เมื่อกระบวนการสร้างเสร็จสิ้นเราจะพบไฟล์ "file_link_datalist_formatter-5.0.0.jar" ถูกสร้างขึ้นภายใต้ไดเรกทอรี "file_link_datalist_formatter / target"
จากนั้นให้อัปโหลดปลั๊กอินไปที่ Manage Plugins. หลังจากอะพโหลดไฟล์ jar, ตรวจสอบอีกครั้งว่าปลั๊กอินนั้นถูกอัพโหลดและเปิดใช้งานอย่างถูกต้อง
ให้สร้าง CRUD ในมุมมองของเราเพื่อทดสอบปลั๊กอินของเรา ในรายการให้กำหนดค่าคอลัมน์ฟิลด์อัปโหลดไฟล์ดังนี้
ในรายการ CRUD เราจะเห็นว่าไฟล์ของเราถูกแปลงเป็นลิงค์
คุณสามารถดาวน์โหลด source code จาก file_link_datalist_formatter.zip.
หากต้องการดาวน์โหลด jar ปลั๊กอินที่พร้อมใช้งานโปรดค้นหา http://marketplace.joget.org/.
...