在 Liferay 7.2 中实现将 Web 内容自动保存为草稿
Implementing auto-saving Web Content as draft in Liferay 7.2
由于Liferay的Web Content默认不能自动保存为草稿,所以我需要实现这样一个功能。
我发现 Web 内容表单包含 ID 为“_com_liferay_journal_web_portlet_JournalPortlet_workflowAction”和 value=2[=36= 的隐藏输入字段] 对于具有 'draft' 状态的 Web 内容。此外,在 journalarticle table 的 Liferay 数据库中,状态栏也有 value=2。
我想我应该找到我的方法来注入一些 JS 代码来检查是否存在这样的表单并且它的字段值为 2,如果存在,则异步序列化和发送表单。我想知道是否有第二种方法可以检查 Java 端是否有任何已编辑的 Web 内容及其状态。然后我会在不检查任何源代码的情况下注入序列化和提交表单的 JS 代码。
我正在考虑创建 DynamicInclude 实例 class。但是,我被告知解决方案不应与编辑器相关联,而应直接与 Web 内容相关联,因为编辑器不会仅在创建 Web 内容期间使用,可能还会在其他地方使用。我得到一个提示,ResourceFilter 可能会有所帮助,但在我看来,它在文档中的描述不够充分,所以我无法理解它。
我对修改 Liferay 组件的经验很少,所以我不知道如何在实践中使用所有这些知识。我很乐意提供任何提示。
编辑:
此刻我已经成功添加了异步序列化和提交 Web 内容表单的 JS 代码。问题是它只在第一次执行(发送 302 POST 请求 并接收 200 GET 响应)。在下次提交尝试后没有刷新页面,只有 200 POST 请求 发送而没有任何响应。有趣的是,此请求的预览包含错误“自您开始编辑以来,另一个用户已进行了更改。请复制您的更改并重试。”。我不知道如何解决这个问题。我搜索了 Liferay 7.2 存储库并发现,当新版本与旧版本不同时会抛出带有此错误消息的异常。这没有意义,因为 Web 内容版本在保存为草稿后不会改变,我什至在我的 Java 代码中打印了响应内容,看起来这些版本是相同的。我很乐意提供任何帮助,因为我不知道如何继续前进。下面是我的Java脚本代码。
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());
由于Liferay的Web Content默认不能自动保存为草稿,所以我需要实现这样一个功能。
我发现 Web 内容表单包含 ID 为“_com_liferay_journal_web_portlet_JournalPortlet_workflowAction”和 value=2[=36= 的隐藏输入字段] 对于具有 'draft' 状态的 Web 内容。此外,在 journalarticle table 的 Liferay 数据库中,状态栏也有 value=2。
我想我应该找到我的方法来注入一些 JS 代码来检查是否存在这样的表单并且它的字段值为 2,如果存在,则异步序列化和发送表单。我想知道是否有第二种方法可以检查 Java 端是否有任何已编辑的 Web 内容及其状态。然后我会在不检查任何源代码的情况下注入序列化和提交表单的 JS 代码。
我正在考虑创建 DynamicInclude 实例 class。但是,我被告知解决方案不应与编辑器相关联,而应直接与 Web 内容相关联,因为编辑器不会仅在创建 Web 内容期间使用,可能还会在其他地方使用。我得到一个提示,ResourceFilter 可能会有所帮助,但在我看来,它在文档中的描述不够充分,所以我无法理解它。
我对修改 Liferay 组件的经验很少,所以我不知道如何在实践中使用所有这些知识。我很乐意提供任何提示。
编辑:
此刻我已经成功添加了异步序列化和提交 Web 内容表单的 JS 代码。问题是它只在第一次执行(发送 302 POST 请求 并接收 200 GET 响应)。在下次提交尝试后没有刷新页面,只有 200 POST 请求 发送而没有任何响应。有趣的是,此请求的预览包含错误“自您开始编辑以来,另一个用户已进行了更改。请复制您的更改并重试。”。我不知道如何解决这个问题。我搜索了 Liferay 7.2 存储库并发现,当新版本与旧版本不同时会抛出带有此错误消息的异常。这没有意义,因为 Web 内容版本在保存为草稿后不会改变,我什至在我的 Java 代码中打印了响应内容,看起来这些版本是相同的。我很乐意提供任何帮助,因为我不知道如何继续前进。下面是我的Java脚本代码。
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());