由于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/