Javascript 在Liferay 7.2中实现将Web内容自动保存为草稿
由于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代码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代码的方法来检查这样一个表单是否存在,并且它
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请求的方法。