javascript - 在 Liferay 7.2 中实现自动保存网页内容为草稿

标签 javascript java ajax liferay liferay-7

由于Liferay的Web内容默认不能自动保存为草稿,所以我需要实现这样的功能。

我发现网络内容表单包含 ID 为“_com_liferay_journal_web_portlet_JournalPortlet_workflowAction”的隐藏输入字段,以及状态为“草稿”的网络内容的 value=2。此外,在 Liferay 的数据库中 journalarticle 表中也有带有 value=2 的状态列。

我想我应该找到注入(inject)一些JS代码的方法来检查这样的表单是否存在并且其字段的值=2,如果是,则异步序列化和发送表单。我想知道是否有第二种方法可以检查是否有任何 Web 内容被编辑以及 Java 端的状态如何。然后我会注入(inject) JS 代码来序列化并提交表单,而不检查任何源代码。

我正在考虑创建DynamicInclude实例类。但是,我被告知解决方案不应与编辑器关联,而应直接与 Web 内容关联,因为编辑器不会仅在创建 Web 内容期间使用,可能也会在其他地方使用。我得到一个提示,ResourceFilter 可能会有所帮助,但在我看来,文档中没有对其进行足够的描述,因此我无法理解它。

我对修改 Liferay 组件的经验很少,所以我不知道如何在实践中使用所有这些知识。我很乐意提供任何提示。

编辑:

此时我已成功添加异步序列化并提交 Web 内容表单的 JS 代码。问题是它只在第一次执行(发送302 POST 请求并接收200 GET 响应)。下次提交尝试后如果不刷新页面,则仅发送 200 个 POST 请求,而没有任何响应。有趣的是,此请求的预览包含错误“自您开始编辑以来,其他用户已进行更改。请复制您的更改并重试。”。我不知道如何解决这个问题。我搜索了 Liferay 7.2 存储库并发现,当新版本与旧版本不同时,会抛出此错误消息的异常。这是没有意义的,因为 Web 内容版本在保存为草稿后不会改变,我什至在我的 Java 代码中打印出了响应内容,而且看起来这些版本是相同的。我很高兴获得任何帮助,因为我不知道如何继续前进。下面我放了我的 JavaScript 代码。

window.saveDraft = function() {

    var form = $('form#_com_liferay_journal_web_portlet_JournalPortlet_fm1');
    var url = form.attr('action');
    var p_auth = new URLSearchParams(url).get('p_auth');
    var language = form.find('#_com_liferay_journal_web_portlet_JournalPortlet_languageId').attr('value');

    var contentInput = form.find( "input[id^='_com_liferay_journal_web_portlet_JournalPortlet_content_INSTANCE_']" );
    var shortContentInputId = contentInput.attr('id');
    var contentInputIdRandomPart = shortContentInputId.substr(shortContentInputId.length - 4, shortContentInputId.length);

    var content = contentInput.attr('value');
    var fixedContent = content.replace(/\r?\n|\r/g, '');    //removing unnecessary line breaks

    var data = new FormData(form[0]);
    data.append('p_auth', p_auth);
    data.set('_com_liferay_journal_web_portlet_JournalPortlet_javax.portlet.action', 'updateArticle');
    data.set('_com_liferay_journal_web_portlet_JournalPortlet_ddmFormValues', '{"availableLanguageIds":["' + language +'"],"defaultLanguageId":"' + language +'","fieldValues":[{"instanceId":"' + contentInputIdRandomPart + '","name":"content","value":{"' + language +'":"' + fixedContent + '"}}]}');
    url = url.replace('&p_auth='  + p_auth, '');
    $.ajax({
        url: url,
        data: data,
        cache: false,
        processData: false,
        contentType: false,
        method: 'POST',
    })
};

最佳答案

我已成功创建将 Web 内容异步保存为草稿的模块。在搜索引发 ArticleVersionException 的位置时,我忘记检查我的 IDE 是否标记了代码中的所有事件。事实证明,在检查提交日期是否正确的代码片段中抛出了异常。这就是为什么我需要在提交表单后在代码末尾设置实际时间戳值。就我而言,它是通过这行代码实现的:

form.find('#_com_liferay_journal_web_portlet_JournalPortlet_formDate').val(new Date().valueOf());

关于javascript - 在 Liferay 7.2 中实现自动保存网页内容为草稿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57690418/

相关文章:

javascript - mouseleave 事件在 vue.js 中延迟触发

javascript - 如何在没有用户确认提示的情况下使用 javascript/extendscript 在 Illustrator 中打开一组 PDF 文件?

javascript - 表单提交时在浏览器中显示加载

javascript - 如何在延迟后显示模态?

ajax - 检查请求是否由 Ajax 发送

javascript - 如何删除选择框中选项元素周围的蓝色边框和蓝色选项颜色

java - 在 OSGi 容器中使用 Solrj

java - ApplicationContextAware 在单例对象中注入(inject)原型(prototype)对象

java - Java 的 ObjectOutputStream 的 writeObject() 方法如何用于数组?

javascript - 使用 JavaScript 删除 HTML 表格中的所有行