【问题标题】:CQ5 widget with xtype hidden隐藏 xtype 的 CQ5 小部件
【发布时间】:2013-09-05 07:07:42
【问题描述】:

我正在尝试使用页面属性中的“隐藏”xtype 向页面添加隐藏属性(键值对)。但该属性总是返回一个空/空白

小部件代码如下。

<vanitycheck
        jcr:primaryType="cq:Widget"
        defaultValue="myValue"
        hidden="{Boolean}true"
        name="./myKey"
        value="myValue"
        xtype="hidden"/>

JSP代码如下:

<%=currentPage.getProperties().get("myKey" , "") %>

【问题讨论】:

    标签: aem


    【解决方案1】:

    您要打开对话框吗? dialog.xml 中保存的默认值仅在编辑组件并保存后才会应用(即必须启用对话框 - 它们是对话框本身的默认值,而不是 JCR)。

    如果您希望在创建组件时在 JCR 中保留一个默认值,请将 cq:template.xml 文件与您的 dialog.xml 放在您的组件中。这将指定在创建时添加到节点中的默认属性。

    例如,你可以有一个文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" 
              xmlns:jcr="http://www.jcp.org/jcr/1.0" 
              xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
        jcr:primaryType="nt:unstructured"
        defaultValue="myValue"/>
    

    编辑:

    对于模板中的默认值,编辑/apps/[your-design]/[template-name]/.content.xml下的.content.xml文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" 
              xmlns:cq="http://www.day.com/jcr/cq/1.0"
              xmlns:jcr="http://www.jcp.org/jcr/1.0" 
              jcr:primaryType="cq:Template"
              jcr:title="Content Page Template">
        <jcr:content
            jcr:primaryType="cq:PageContent"
            sling:resourceType="foo/components/page/bar"
            defaultValue="myValue"/>
    </jcr:root>
    

    这些解决方案中的任何一个都只适用于新创建的内容(即cq:template.xml 的新组件或.content.xml 的新页面)。

    对于现有页面,可以按照您的建议使用对话框中的默认值;但由于这些值仅在打开对话框并在对话框中的“确定”上保存到 JCR 时才会加载,因此需要用户编辑每个页面上的页面属性才能将值保存到 JCR。

    如果这不合适,在 JSP/类中使用回退值可能是首选解决方案:resource.get(defaultValue, "myValue");

    【讨论】:

    • 实际上,我希望该属性不可编辑(因此,隐藏)并添加到页面属性中。页面中有一个现有对话框,我打算在其中添加我的属性。
    • 嗨 Riju,使用 cq:template.xml 文件会使属性不可编辑,而无需将其添加到 dialog.xml。对于页面模板,您可以在/apps/foo/templates/templateName/.content.xml 中进行类似的编码,但这种方法仅适用于新创建的页面。对于现有页面,您的解决方案应该可以工作,但它需要编辑器打开对话框以便加载此值,然后才能将其保存到“确定”的 JCR。如果用户不与对话框交互,您将无法使用对话框在页面上添加现有属性。
    • @anotherdave 您提供的两种不同解决方案的优缺点是什么?
    • @Behrang 一般来说,我更喜欢cq:template.xml 方法,因为一旦创建组件,属性就会存储在JCR 中的节点上(对于搜索索引等内容很重要)。缺点是它仅在最初创建内容时才有效。我不认为在对话框中使用 defaultValue 属性有什么好处,这只是可以采取的另一种方法——缺点是它确实需要编辑器干预(打开对话框并保存它以便默认值从ExtJS 被应用到 JCR 中。
    • @Behrang Feike Visser 在这篇博客文章中提到了它,尽管我在文档中没有看到它,据我所知dev.day.com/cemblog/en/experiencedelivers/2012/06/… 在 OOTB 组件上,/libs/collab/calendar/components/calendar 似乎包括一个,尽管它似乎只用于指定“sling:resourceTypes”而不是其他属性。