如何开发一个文件连接数据列表格式化插件

Skip to end of metadata



Go to start of metadata


 

在本教程中,我们将遵循开发插件  来开发我们的File Link Datalist格式化器的  指导原则。 有关更多详细信息步骤,请参阅第一个教程  如何开发一个Bean Shell哈希变量插件


1.什么问题?

我们有一个文件上传使用文件上传领域的形式。我们想要显示文件名作为链接来下载我们的数据列表中的文件。


2.你有什么想法来解决这个问题?

我们可以开发一个  Datalist Column Formatter插件将这个值转换成一个链接。


3.你的插件需要什么输入?

Joget Workflow的文件下载链接格式是

/jw/web/client/app/{appId}/{appVersion}/form/download/{formId}/{recordId}/{fileName}.?attachment=true

例如:

http://localhost:8080/jw/web/client/app/test/1/form/download/testFile/f6946830-c0a80070-48cad9b7-8b971682/CHANGES.txt.?attachment=true

从链接格式,我们需要从管理员用户获得以下信息。

  1. 表单ID:包含“文件上传”字段的表单。
  2. 下载为附件:是否在链接中添加“ ?attachment = true”。

4.你的插件的输出和预期结果是什么?

文件名在Datalist中显示为链接。


5.有没有可重用的资源/ API?

我们可以参考文件上传字段来了解如何生成文件的下载链接。


6.准备你的开发环境

我们需要始终准备好Joget Workflow Source Code,并按照这个指导方针建立起来  。 

本教程的以下内容是使用Macbook Pro和Joget源代码5.0.0版编写的。 其他平台命令请参考  如何开发插件

让我们说我们的文件夹目录如下。 

 

- Home

  - joget

    - plugins

    - jw-community

      -5.0.0

“plugins”目录是我们要创建和存储我们所有插件的文件夹,“jw-community”目录是Joget Workflow源代码存储的地方。

运行以下命令在“plugins”目录下创建一个maven项目。

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

然后,shell脚本将要求我们为您的插件输入一个版本,并在生成maven项目之前要求我们确认。

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

我们应该在终端显示“BUILD SUCCESS”消息,在“plugins”文件夹中创建一个“file_link_datalist_formatter”文件夹。

用你喜欢的IDE打开maven项目。我将使用  NetBeans。 

7. Just code it!

a. 继承插件类型抽象类

在“org.joget.tutorial”包下创建一个“FileLinkDatalistFormatter”类。然后,使用org.joget.apps.datalist.model.DataListColumnFormatDefault  抽象类来扩展  该类。 请参阅  Datalist Column Formatter插件


b. 实现所有的抽象方法

像往常一样,我们必须执行所有的抽象方法。我们将使用AppPluginUtil.getMessage方法来支持i18n,并使用常量变量MESSAGE_PATH作为消息资源包目录。

 

Implementation of all basic abstract methods

 Expand source


然后,我们必须为管理员用户提供一个UI来为我们的插件提供输入。在getPropertyOptions方法中,我们已经指定了  插件属性选项和配置  定义文件位于“/properties/fileLinkDatalistFormatter.json”。让我们在“file_link_datalist_formatter / src / main”目录下创建一个目录“resources / properties”。创建目录后,在“properties”文件夹中创建一个名为“fileLinkDatalistFormatter.json”的文件。

在属性定义选项文件中,我们需要提供如下的选项。请注意,我们可以在我们的属性选项中使用“@@ message.key @@”语法来支持i18n。

[{

    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 : ''

        }]

    }]

}]

 

一旦我们完成了属性选项来收集输入,我们可以在插件的主要方法 ,格式化 方法编写代码。

 

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;

}

 

c. 管理你的插件的依赖库

我们的插件使用org.displaytag.util.LookupUtil和类,它需要displaytag和jsp-api库。所以,我们必须将其添加到我们的POM文件。

<!-- 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 -->

d.确保你的插件国际化 (i18n) 

我们在getLabel和getDescription方法中使用i18n消息密钥。我们还在我们的属性选项定义中使用了i18n消息密钥。所以,我们需要为我们的插件创建一个消息资源包属性文件。

在“file_link_datalist_formatter / src / main”目录下创建目录“resources / messages”。然后,在该文件夹中创建一个“FileLinkDatalistFormatter.properties”文件。在属性文件中,让我们添加所有的消息键和它的标签如下。

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?

e. Felix框架中注册你的插件

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.

public void start(BundleContext context) {

    registrationList = new ArrayList<ServiceRegistration>();

    //Register plugin here

    registrationList.add(context.registerService(FileLinkDatalistFormatter.class.getName(), new FileLinkDatalistFormatter(), null));

f.构建并测试

让我们建立我们的插件。一旦构建过程完成,我们将在“file_link_datalist_formatter / target”目录下创建一个“file_link_datalist_formatter-5.0.0.jar”文件。

然后,让插件jar上传到  管理插件。上传jar文件后,仔细检查插件是否正确上传和激活。

在userview中创建一个CRUD来测试我们的插件。在列表中,让我们配置文件上传字段列如下。

在CRUD列表中,我们可以看到我们的文件名被转换为链接

8. 再进一步,分享或出售

您可以从file_link_datalist_formatter.zip下载源代码  。

要下载现成的插件jar,请在http://marketplace.joget.org/上找到它  

文档更新时间: 2018-11-06 06:18   作者:李庆