在5.2 EE SP5或6.x中的Liferay布局模板(非主题)中嵌入portlet

在5.2 EE SP5或6.x中的Liferay布局模板(非主题)中嵌入portlet,liferay,portlet,velocity,Liferay,Portlet,Velocity,我们有几个站点托管在Liferay 5.2实例上,由多个社区、主题和布局模板组成,所有这些都按预期工作。但是,此设置不再适用于5.2版本的EE service Pack(特别是最新的EE SP5-与5.2.9相同)或最新的6.0.6(CE)。(附加测试表明,这是上次在EE SP3/5.2.7中使用的,但在EE SP4/5.2.8中成为一个问题。)我们迫切需要升级到最新的5.2 service pack(EE SP5)以解决其他问题-但升级到Liferay 6也是一个可能的选择,只要我们能够找到一

我们有几个站点托管在Liferay 5.2实例上,由多个社区、主题和布局模板组成,所有这些都按预期工作。但是,此设置不再适用于5.2版本的EE service Pack(特别是最新的EE SP5-与5.2.9相同)或最新的6.0.6(CE)。(附加测试表明,这是上次在EE SP3/5.2.7中使用的,但在EE SP4/5.2.8中成为一个问题。)我们迫切需要升级到最新的5.2 service pack(EE SP5)以解决其他问题-但升级到Liferay 6也是一个可能的选择,只要我们能够找到一个有效的解决方案和版本组合

特别是,我们有主题中的文件(例如,
inc side.vm
),这些文件作为主题的一部分包含在布局模板中。这允许内容由主题“拥有”,但在各种布局模板的上下文中使用-即使在多个站点(社区/主题)中使用相同的布局模板。将此内容直接放置在主题中(不涉及布局模板)不是一个选项,因为它需要放置在布局的UI空间中,并且各种布局可能要求此内容位于与主题相关的不同空间中

另外一个要求是,所包含的内容必须由“嵌入式”Portlet组成,也就是说,不能将每个页面拖放到UI中,而是与每个主题/布局相关联。通过简单地将主题+布局应用于站点/页面,每个页面上都会自动包含正确的portlet。这是必要的,因为对于一些由大约100页或更多页组成的站点/社区,在不嵌入主题+布局的情况下,每页添加此内容并保持其一致性既不实际也不可维护。(只需考虑10个主题(社区)*10个布局模板*10个页面/社区=1000个组合即可进行配置和维护。)

同样,这些都在5.2.3下工作(包括5.2 EE SP1、SP2和SP3),但在5.2 EE SP4下停止工作。我们是Liferay企业支持客户,支持票证已开放近2个月,但尚未提供解决方案。发行说明中没有提到这方面的内容,我们还无法从Liferay获得任何关于这一变化原因的指导,也无法获得任何成功的解决方法

以下是当前问题的一些细节: 在5.2 EE SP4或SP5的任何新安装下,可轻松且一致地复制

在主题的
templates
目录下包括
inc side.vm
。主题没有什么特别之处——即使使用Liferay默认“经典”主题的副本也可以

inc side.vm
中,包括以下内容:

<p>Before Diagnostics</p>
$theme.runtime("27_INSTANCE_0000", "", $velocityPortletPreferences.toString())
$velocityPortletPreferences.reset()
<p>After Diagnostics</p>
这与中所示的方法相同

根据我们支持票的建议,我还尝试了上述线路的以下单线替代方案:

#parse ("$fullTemplatesPath/inc-side.vm")
(注意
$fullTemplatesPath
$full\u templates\u path
相比。原因是
init.vm
调用
\set($full\u templates\u path=$fullTemplatesPath)
-但是
init.vm
不包括在模板中,只有主题。)

两种方法的结果都是相同的。
inc side.vm
中包含的任何静态文本/HTML将按预期显示。任何Velocity指令都将被解析和处理,而不会显示在输出中。在portlet中进行日志记录表明它已执行,甚至检索设置为
velocityPortletPreferences
的任何portlet首选项根本问题是portlet生成的任何内容都没有呈现到HTTP响应。事实上,从Firefox的“视图/源”或cURL来看,响应完全包含:

<p>Before Diagnostics</p>
<p>After Diagnostics</p>
诊断前的

诊断后

在我的自定义portlet中,我甚至尝试调用响应中可以找到的每个
flush()
close()
方法,认为这是一个与flush相关的问题

相反,在Liferay 6.0.6下进行测试(假设这可能只是5.2系列的问题)会给出不同但有趣的结果。包含的*.vm文件已成功读入页面。然而,它并没有作为速度代码进行评估。与5.2 SP5中包含的VM正在执行但不呈现不同,6.0.6正在呈现但不评估(或执行)

我们已经回顾了(“在Liferay上的主题中嵌入portlet”),上面的方法实际上是“方法一”。“方法二”是不可接受的选项,因为使用
会导致页面的DOM出现问题(特别是JavaScript IPC),这还需要事先知道每个portlet的UI大小,这既不实用也不可接受


我们希望更熟悉Liferay和/或Apache Velocity模板引擎(Liferay使用)的人能够提供解决此问题的解决方案或其他可接受的解决方案。我将提供任何额外的细节或澄清,我可以


谢谢

此问题由Liferay修补程序解决
lpe5096-ee5209-portal-kernel-jdk6.jar
。我正在有效使用的是Liferay于2011年12月29日提供的,其SHA-1校验和为ADB6E0590BFC4850C127A79254941D6DE5D385E,

我找到了您的支持票证,目前它看起来相当活跃-因为它很长,我明天再看一看(我在欧洲,这里是深夜-这不是解决这类问题的正确设置),但目前看来似乎发现了一些回归错误。感谢Olaf-我刚刚收到通知,有一个补丁可用,我将在接下来的24小时内进行测试。如果你有任何解决方法,请将其作为答案发布(或让适当的人员
<p>Before Diagnostics</p>
<p>After Diagnostics</p>