访问页面中的许多组件

时间:2015-08-10 05:55:37

标签: magnolia

使用玉兰花我创建了该区域并为页面定义了许多组件。

templateScript: /lukup-bkp/templates/pages/index.jsp
renderType: jsp
visible: true
title: Lukup trial Home
dialog: lukup-bkp:pages/home
areas:
  area1:
  renderType: jsp
  availableComponents:
  quotation:
    id: lukup-bkp:components/home_com

在我的jsp页面中,我正在检索div元素中文本的值,如下所示。

 <cms:area name="area1" />

如果我在一个区域中创建文本字段和blockquote:

areas:
  area1:
  renderType: jsp
  availableComponents:
  quotation:
    id: lukup-bkp:components/home_com
  blockquote:
    id: lukup-bkp:components/block_com

在我的jsp中,我必须只检索blockquote。如果我检索像

<cms:area name="area1" >

文本值和blockquote值都指向同一个组件。

我希望文本的值在一个div中,而blockquote值在另一个div中。我怎么能访问它。

1 个答案:

答案 0 :(得分:1)

Magnolia中区域定义的availableComponents子节点确定可供作者/编辑者使用的组件,即可放置在该区域内的内容组件。

区域定义的type属性确定编辑器可以在区域内放置多少个组件。 type的允许值为:singlelistnoComponent。有关详细信息,请参阅Magnolia documentation of the area definition

该类型确定如何呈现您所在区域的子内容。 single假定只存在一个子节点,并使用其组件定义中的模板脚本对其进行渲染。 list假定零个或多个子节点,并使用各自组件定义中的模板脚本呈现它们。 noComponent不会渲染该区域的子组件。

有关区域默认脚本,请参阅Area definition - default area scripts

因此area1的类型非常重要。我假设list

如果您想确保区域内的每个组件都被<div>包围,您可以编写这样的自定义区域脚本(它的Freemarker,您可能必须将其转换为JSP需要的话):

[#list components as component]
    <div>
        [@cms.component content=component /]
    </div>
[/#list]

要仅渲染块引用,您也可以在区域脚本中进行检查:

[#list components as component]
    [#if cmsfn.metaData(content, "mgnl:template") == 'lukup-bkp:components/block_com']
        [#-- component has the blockquote template --]
        <div>
            [@cms.component content=component /]
        </div>
    [/#if]
[/#list]