【问题标题】:Create a listener for every form submission in Liferay 7.2在 Liferay 7.2 中为每个表单提交创建一个监听器
【发布时间】:2020-04-11 07:57:16
【问题描述】:

我想为我的门户中的每个表单提交创建一个侦听器。

我创建了一个名为“测试表单”的表单,并且在 Liferay 之前(或之后)将信息保存在本地数据库中,我想将数据表单发送到外部 API(并做任何需要的事情)。 我试图通过做类似的事情来完成这项任务:

import org.osgi.service.component.annotations.Component;

import com.liferay.portal.kernel.exception.ModelListenerException;
import com.liferay.portal.kernel.model.BaseModelListener;
import com.liferay.portal.kernel.model.Layout;
import com.liferay.portal.kernel.model.ModelListener;

@Component(immediate = true, service = ModelListener.class)
public class FormListener extends BaseModelListener<Layout> {

    @Override
    public void onBeforeCreate(Layout model) throws ModelListenerException {
        System.out.println(
            "About to create layout: " + model.getNameCurrentValue());

        model.setTitle("Title generated by model listener!");
    }
}

但是为与每个表单提交相关的类更改 Layout - 例如 FormContent 或类似的东西。是否可以使用“onAfterSubmit”侦听器(或类似的东西)来完成此操作,或者有更好的解决方案?

提前致谢。

【问题讨论】:

  • 我猜你需要听的是FormInstanceRecord。没有验证
  • 首先,您使用的是哪些表单应用程序? DDL 的表单视图或新的表单应用程序?
  • 由内容创建的表单。管理员用户将通过门户开发自己的表单,我的目标是 - 在门户中发布表单后 - 将所有数据填写在所有表单中并集成到其他应用程序中。类似于这个项目,所有用户在liferay平台创建后都与CRM集成github.com/amusarra/liferay-crm-sample-integration

标签: liferay liferay-7


【解决方案1】:

你可以像 Marco Mercuri 向你展示的那样做这个前端,但后端 ModelListener 是你的朋友,所以你在正确的轨道上。为此,您可能需要注意 DDLRecord。您可能同时需要 ModelListener 和 MessageListener,因为数据可能无法实时使用。作为一个例子,你可以看这里:https://github.com/jverweijL/auto-translator/tree/master/auto-translator-listener/src/main/java/com/liferay/demo/auto/translate

【讨论】:

  • 是的,在这种情况下我宁愿使用后端策略。但是,我在这个问题上苦苦挣扎了几天 - 并且已经在上面了:(并且无法成功。尝试使用 DDLRecord 实体的这种方法,但我什至无法导入这个模型。我应该为此注入任何依赖项还是应该可用在内核中作为 Layour 模型?
【解决方案2】:

如果您想在提交任何表单时执行某项操作,您可以使用带有事件监听器的脚本。

创建 Liferay 主题:Theme documentation

在您的 main.js 文件(或任何您想要的地方)中,在表单提交上放置一个 javascript/jQuery/... 事件侦听器,如下所示:

$('form').on('submit',function(){
    //do what you need...
}); 

jQuery event listener documentation

PS

您编写的代码是布局上的模型侦听器(即我们网站的 Liferay“语言”页面)。您发布的方法onBeforeCreate 在创建新页面之前执行,因此每页执行一次。它与表单和提交无关。

【讨论】:

  • 是的,这可能是一个可行的解决方案!但是使用 jquery 并在前端完成所有这些工作看起来并不是最优雅的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 2020-03-18
  • 2012-02-13
  • 2017-05-16
  • 1970-01-01
  • 2017-06-04
相关资源
最近更新 更多