In this tutorial, we will following the guideline of developing a plugin to develop our Not Permission plugin. Please also refer to the very first tutorial How to develop a Bean Shell Hash Variable for more details steps. |
ในบทช่วยสอนนี้เราจะทำตามแนวทาง guideline of developing a plugin ที่ไม่ได้รับอนุญาต โปรดอ้างอิงถึง How to develop a Bean Shell Hash Variable สำหรับขั้นตอนรายละเอียดเพิ่มเติม |
อะไรคือปัญหา? |
I want to configure the userview permission or form permission to not in groups, department or etc.
ฉันต้องการกำหนดค่าการอนุญาต userview หรือการอนุญาตแบบฟอร์มไม่ให้อยู่ในกลุ่มแผนกหรืออื่น ๆ |
ความคิดของคุณในการแก้ปัญหาคืออะไร? |
We can develop a Userview Permission/ Form Permission Plugin to reverse the result of other permission plugins.
เราสามารถพัฒนา Userview Permission/ Form Permission Plugin เพื่อย้อนกลับผลลัพธ์ของปลั๊กอินการอนุญาตอื่น ๆ |
สิ่งที่จำเป็นในการป้อนข้อมูลสำหรับปลั๊กอินของคุณ? |
To develop a Not Permission plugin, we can consider to provide the following as input.
ในการพัฒนาปลั๊กอินที่ไม่อนุญาตเราสามารถพิจารณาให้สิ่งต่อไปนี้เป็นอินพุต |
Permission: To configure a Permission plugin to get the result for reverse it.
การอนุญาต: การกำหนดค่าปลั๊กอินการอนุญาตเพื่อให้ได้ผลลัพธ์สำหรับการย้อนกลับ |
Must be Logged In User: The result will only valid if and only if the user is also a logged in user.
ต้องเป็นผู้ใช้ที่เข้าสู่ระบบ: ผลลัพธ์จะใช้ได้เฉพาะในกรณีที่ผู้ใช้นั้นเป็นผู้ใช้ที่เข้าสู่ระบบด้วย |
ผลลัพธ์และผลลัพธ์ที่คาดหวังของปลั๊กอินของคุณคืออะไร? |
The reverse value of the configured permission plugin.
ค่าย้อนกลับของปลั๊กอินการอนุญาตที่กำหนดค่าไว้ |
มีทรัพยากร / API ที่สามารถนำกลับมาใช้ใหม่ได้หรือไม่? |
You can refer to How to develop a Gantt Chart UI Menu on how to reuse a existing plugin.
คุณสามารถอ้างถึง How to develop a Gantt Chart UI Menu เกี่ยวกับวิธีการนำปลั๊กอินที่มีอยู่กลับมาใช้ใหม่ |
เตรียมสภาพแวดล้อมการพัฒนาของคุณ |
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 Joget Source Code version 8.0-Snapshot. Please refer to Guideline for Developing a Plugin for other platform command.
Let said our folder directory as following.
เราจำเป็นต้องให้ซอร์สโค้ด Joget Workflow ของเราพร้อมและสร้างโดยปฏิบัติตาม this guideline บทช่วยสอนต่อไปนี้จัดทำขึ้นด้วย Macbook Pro และ Joget Source Code เวอร์ชั่น 8.0-Snapshot โปรดอ้างอิง Guideline for Developing a Plugin สำหรับคำสั่งแพลตฟอร์มอื่น ๆ ให้กล่าวว่าไดเรกทอรีโฟลเดอร์ของเราดังต่อไปนี้ |
- Home - joget - plugins - jw-community |
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.
Run the following command to create a maven project in "plugins" directory.
ไดเรกทอรี "ปลั๊กอิน" คือโฟลเดอร์ที่เราจะสร้างและจัดเก็บปลั๊กอินทั้งหมดของเราและไดเรกทอรี "jw-community" เป็นที่เก็บซอร์สโค้ด Joget Workflow เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างโครงการ maven ในไดเรกทอรี "ปลั๊กอิน" |
cd joget/plugins/ ~/joget/jw-community/wflow-plugin-archetype/create-plugin.sh org.joget.tutorial not_permission 8.0-Snapshot |
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.
จากนั้นเชลล์สคริปต์จะขอให้เราป้อนเวอร์ชันสำหรับปลั๊กอินของคุณและขอให้เรายืนยันก่อนที่จะสร้างโครงการ Maven |
Define value for property 'version': 1.0-SNAPSHOT: : 8.0-Snapshot [INFO] Using property: package = org.joget.tutorial Confirm properties configuration: groupId: org.joget.tutorial artifactId: not_permission version: 5.0.0 package: org.joget.tutorial Y: : y |
We should get "BUILD SUCCESS" message shown in our terminal and a "not_permission" folder created in "plugins" folder.
Open the maven project with your favour IDE. I will be using NetBeans.
เราควรได้รับข้อความ "BUILD SUCCESS" ที่แสดงในเครื่องของเราและโฟลเดอร์ "not_permission" ที่สร้างในโฟลเดอร์ "plugins" เปิดโครงการ maven ด้วย IDE ที่คุณโปรดปราน ใช้ NetBeans |
เพียงแค่รหัส! |
การขยายคลาสนามธรรมของประเภทปลั๊กอิน |
Create a "NotPermission" class under "org.joget.tutorial" package. Then, extend the class with org.joget.apps.userview.model.UserviewPermission abstract class and implement org.joget.apps.form.model.FormPermission interface. Please refer to Userview Permission/ Form Permission Plugin.
สร้างคลาส "NotPermission" ภายใต้แพ็คเกจ "org.joget.tutorial" จากนั้นขยายคลาสด้วย org.joget.apps.userview.model.UserviewPermission คลาสนามธรรมและใช้อินเตอร์เฟส org.joget.apps.form.model.FormPermission โปรดอ้างอิงถึง Userview Permission/ Form Permission Plugin |
ใช้วิธีนามธรรมทั้งหมด |
As usual, we have to implement all the abstract methods. We will using AppPluginUtil.getMessage method to support i18n and using constant variable MESSAGE_PATH for message resource bundle directory.
ตามปกติเราต้องใช้วิธีนามธรรมทั้งหมด เราจะใช้วิธี AppPluginUtil.getMessage เพื่อสนับสนุน i18n และใช้ตัวแปร MESSAGE_PATH คงที่สำหรับไดเรกทอรีท |
package org.joget.tutorial; import org.joget.apps.app.service.AppPluginUtil; import org.joget.apps.app.service.AppUtil; import org.joget.apps.form.model.FormPermission; import org.joget.apps.userview.model.UserviewPermission; public class NotPermission extends UserviewPermission implements FormPermission { private final static String MESSAGE_PATH = "messages/NotPermission"; public String getName() { return "Not Permission"; } public String getVersion() { return "5.0.0"; } public String getDescription() { //support i18n return AppPluginUtil.getMessage("org.joget.tutorial.NotPermission.pluginDesc", getClassName(), MESSAGE_PATH); } public String getLabel() { //support i18n return AppPluginUtil.getMessage("org.joget.tutorial.NotPermission.pluginLabel", getClassName(), MESSAGE_PATH); } public String getClassName() { return getClass().getName(); } public String getPropertyOptions() { return AppUtil.readPluginResource(getClassName(), "/properties/notPermission.json", null, true, MESSAGE_PATH); } @Override public boolean isAuthorize() { 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 Plugin Properties Options definition file is locate at "/properties/notPermission.json". Let us create a directory "resources/properties" under "not_permission/src/main" directory. After create the directory, create a file named "notPermission.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.
จากนั้นเราต้องทำ UI สำหรับผู้ใช้ผู้ดูแลระบบเพื่อให้อินพุตสำหรับปลั๊กอินของเรา ในเมธอด getPropertyOptions เราได้ระบุไฟล์ข้อกำหนด Plugin Properties Options ไว้ที่ "/properties/notPermission.json" แล้ว ให้เราสร้างไดเรกทอรี "resources / properties" ภายใต้ไดเรกทอรี "not_permission / src / main" หลังจากสร้างไดเรกทอรีให้สร้างไฟล์ชื่อ "notPermission.json" ในโฟลเดอร์ "properties" ในไฟล์ตัวเลือกคำจำกัดความของคุณสมบัติเราจะต้องระบุตัวเลือกดังต่อไปนี้ โปรดทราบว่าเราสามารถใช้ไวยากรณ์ "@@ message.key @@" เพื่อรองรับ i18n ในตัวเลือกคุณสมบัติของเรา |
[{ title : '@@userview.notpermission.config@@', properties : [{ name : 'permission', label : '@@userview.notpermission.permission@@', type : 'elementselect', options_ajax : '[CONTEXT_PATH]/web/property/json/getElements?classname=org.joget.apps.userview.model.UserviewPermission', url : '[CONTEXT_PATH]/web/property/json[APP_PATH]/getPropertyOptions' }, { name : 'loggedIn', label : '@@userview.notpermission.loggedIn@@', type : 'checkbox', value : 'true', options : [{ value : 'true', label : '' }] }] }] |
After done the properties option to collect input, we can work on the main method of the plugin which is isAuthorize method.
หลังจากเสร็จสิ้นตัวเลือกคุณสมบัติเพื่อรวบรวมอินพุตเราสามารถทำงานกับวิธีหลักของปลั๊กอินซึ่งเป็นวิธี isAuthorize |
@Override public boolean isAuthorize() { boolean isAuthorize = false; try { if ("true".equals(getPropertyString("loggedIn")) && WorkflowUtil.isCurrentUserAnonymous()) { return false; } //get the binder Object permissionData = getProperty("permission"); if (permissionData != null && permissionData instanceof Map) { Map pMap = (Map) permissionData; if (pMap != null && pMap.containsKey("className") && !pMap.get("className").toString().isEmpty()) { PluginManager pluginManager = (PluginManager) AppUtil.getApplicationContext().getBean("pluginManager"); UserviewPermission permission = (UserviewPermission) pluginManager.getPlugin(pMap.get("className").toString()); if (permission != null) { Map pProps = (Map) pMap.get("properties"); permission.setProperties(pProps); permission.setCurrentUser(getCurrentUser()); permission.setRequestParameters(getRequestParameters()); isAuthorize = !permission.isAuthorize(); } } } } catch (Exception e) { LogUtil.error(getClassName(), e, ""); } return isAuthorize; } |
จัดการไลบรารีของปลั๊กอินของคุณ |
There are no extra dependency for this plugin.
ไม่มีอะไรพิเศษสำหรับปลั๊กอินนี้ |
เตรียมปลั๊กอินสากลให้พร้อม (i18n) |
We are using i18n message key in getLabel and getDescription method. We also used 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.
เรากำลังใช้คีย์ข้อความ i18n ในวิธี getLabel และ getDescription นอกจากนี้เรายังใช้คีย์ข้อความ i18n ในการกำหนดตัวเลือกคุณสมบัติของเราเช่นกัน ดังนั้นเราจะต้องสร้างไฟล์คุณสมบัติสำหรับปลั๊กอินของเรา |
Create directory "resources/messages" under "not_permission/src/main" directory. Then, create a "NotPermission.properties" file in the folder. In the properties file, let add all the message keys and its label as below.
สร้างไดเรกทอรี "ทรัพยากร / ข้อความ" ภายใต้ไดเรกทอรี "not_permission / src / main" จากนั้นสร้างไฟล์ "NotPermission.properties" ในโฟลเดอร์ ในไฟล์คุณสมบัติให้เพิ่มคีย์ข้อความทั้งหมดและป้ายกำกับของมันดังต่อไปนี้ |
org.joget.tutorial.NotPermission.pluginLabel=Not Permission org.joget.tutorial.NotPermission.pluginDesc=Used to reverse the result of other permission plugin userview.notpermission.config=Configure Not Permission userview.notpermission.permission=Permission userview.notpermission.loggedIn=Must be Logged In User |
ลงทะเบียนปลั๊กอินของคุณไปที่ Felix Framework |
We will have to register our plugin class in Activator class (Auto generated in the same class package) to tell Felix Framework that this is a plugin.
เราจะต้องลงทะเบียนคลาสปลั๊กอินของเราในคลาส Activator (สร้างอัตโนมัติในแพ็คเกจคลาสเดียวกัน) เพื่อบอก Felix Framework ว่านี่คือปลั๊กอิน |
public void start(BundleContext context) { registrationList = new ArrayList<ServiceRegistration>(); //Register plugin here registrationList.add(context.registerService(NotPermission.class.getName(), new NotPermission(), null)); } |
สร้างและทดสอบ |
Let build our plugin. Once the building process is done, we will found a "not_permission-5.0.0.jar" file is created under "not_permission/target" directory.
Then, let upload the plugin jar to Manage Plugins. After upload the jar file, double check the plugin is uploaded and activated correctly.
ให้สร้างปลั๊กอินของเรา เมื่อกระบวนการสร้างเสร็จสิ้นเราจะพบไฟล์ "not_permission-5.0.0.jar" ถูกสร้างขึ้นภายใต้ไดเรกทอรี "not_permission / target" จากนั้นให้อัปโหลด jar ปลั๊กอินไปที่ Manage Plugins หลังจากอัปโหลดไฟล์ jar ตรวจสอบอีกครั้งว่าปลั๊กอินถูกอัปโหลดและเปิดใช้งานอย่างถูกต้อง |
Let us open an userview and change one of the category permission to Not Permission. We will want the current user not in a "Managers" group.
ให้เราเปิดมุมมองผู้ใช้และเปลี่ยนหนึ่งในหมวดหมู่การอนุญาตเป็นไม่อนุญาต เราต้องการให้ผู้ใช้ปัจจุบันไม่อยู่ในกลุ่ม "Managers" |
After done the configuration and save the userview. Let us test it. First, check the admin user is not in "Managers" group.
หลังจากเสร็จสิ้นการกำหนดค่าและบันทึก userview ให้เราทดสอบมัน ก่อนอื่นให้ตรวจสอบผู้ใช้ผู้ดูแลระบบไม่ได้อยู่ในกลุ่ม "Managers" |
Check the userview, the "Personal" category configured with not in "Managers" group is shown correctly.
ตรวจสอบ userview หมวดหมู่ "ส่วนบุคคล" ที่กำหนดค่าโดยไม่ได้อยู่ในกลุ่ม "ผู้จัดการ" จะแสดงขึ้นอย่างถูกต้อง |
Now, assign the "admin" user to "Managers" group.
ตอนนี้กำหนดผู้ใช้ "admin" ให้กับกลุ่ม "ผู้จัดการ" |
The "Personal" category is now disappeared.
หมวดหมู่ "ส่วนบุคคล" หายไปแล้ว |
ก้าวไปอีกขั้นแบ่งปันหรือขายมัน |
You can download the source code from not_permission.zip.
To download the ready-to-use plugin jar, please find Not Permission in http://marketplace.joget.org/.
คุณสามารถดาวน์โหลดซอร์สโค้ดจาก not_permission.zip หากต้องการดาวน์โหลด jar ปลั๊กอินที่พร้อมใช้งานโปรดค้นหาได้ที่ http://marketplace.joget.org/ |