Javascript 在Liferay 7.2中实现将Web内容自动保存为草稿

Javascript 在Liferay 7.2中实现将Web内容自动保存为草稿,javascript,java,ajax,liferay,liferay-7,Javascript,Java,Ajax,Liferay,Liferay 7,由于Liferay的Web内容在默认情况下无法自动保存为草稿,因此我需要实现这样的功能 我发现Web内容表单包含id为“\u com\u liferay\u journal\u Web\u portlet\u JournalPortlet\u workflowAction”的隐藏输入字段,对于“草稿”状态的Web内容,值=2。此外,在Liferay的DB injournalarticle表中,还有一个status列,其值为2 我想我应该找到注入一些JS代码的方法来检查这样一个表单是否存在,并且它

由于Liferay的Web内容在默认情况下无法自动保存为草稿,因此我需要实现这样的功能

我发现Web内容表单包含id为“\u com\u liferay\u journal\u Web\u portlet\u JournalPortlet\u workflowAction”的隐藏输入字段,对于“草稿”状态的Web内容,值=2。此外,在Liferay的DB injournalarticle表中,还有一个status列,其值为2

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

我正在考虑创建DynamicInclude实例类。然而,有人告诉我,解决方案不应该与编辑器关联,而应该直接与Web内容关联,因为编辑器不会仅在创建Web内容时使用,可能还会在其他地方使用。我得到了一个提示,ResourceFilter可能会有所帮助,但在我看来,文档中对它的描述不够,所以我无法理解它

我几乎没有修改Liferay组件的经验,因此我不知道如何在实践中使用所有这些知识。我很乐意得到任何提示

编辑

目前,我已经成功地添加了JS代码,该代码异步序列化并提交Web内容表单。问题是它只在第一次执行(发送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());

“该解决方案不能与编辑器关联”是什么意思?您可以使用编辑器事件注册您的类,例如:“com.liferay.frontend.editor.ckeditor.web#ckeditor#oneditor创建”抱歉,我没有精确地说明,我已经更新了问题。我的意思是,我不能这样做,因为编辑器不会只在创建Web内容时使用,可能它们也会在其他地方使用。这就是为什么我需要将它与journalportlet相关联。我想通过使用“javax.portlet.name=com\u liferay\u journal\u web\u portlet\u JournalPortlet”ID来实现这一点,现在我正试图找到使用序列化web内容表单发送HTTP请求的方法。