AEM/CQ 更新后组件不呈现
AEM/CQ Component Doesn't Render after Update
因此,我对之前构建的组件进行了更新。该组件用于仅呈现一个想要另一个页面的按钮。但是,我需要添加功能,以便它可以显示静态文本而不是按钮。所以我添加了一个单选按钮组,您可以在按钮和静态文本之间 select。
但是,在进行更新后,任何已在页面上使用过该组件的地方,它都不再呈现按钮。所以我将其更改为默认单选选项为按钮。现在,当我在页面上放置一个新组件时,它默认为按钮。但是,在我双击它们并单击“确定”之前,现有组件不会默认为任何内容;不需要其他改动,只需要打开和关闭组件,然后似乎看到默认值。
我的问题是,我如何才能使组件已部署的任何地方都使用默认选项单选按钮,并相应地呈现,而无需打开和关闭?或者有没有办法让 AEM 刷新所有页面上的每个组件,以便它可以看到并使用新的单选按钮,这会将它们默认为按钮?
我宁愿不向 JSP 添加代码,告诉它 "else if nothing is selected, use button"。
在对话框定义中,您只能指定对话框的默认值。当您拖放组件时,对话框甚至还不存在。当您打开它时,它会填充您在对话框定义中提供的默认值,然后,一旦您关闭它,就会将它们发布到 JCR,以便您可以看到效果。
要在创建时使用默认值实际初始化组件,您需要创建适当的内容模板。有关详细信息,请参阅 this page
编辑:
不幸的是,没有简单的方法可以将默认内容添加到已经存在的组件中,因为组件已经过了它的初始化状态。我解决这个问题的方法是,我创建一个 Groovy 脚本,将所需(在本例中为默认)值放入 JCR 并使用 Groovy Console 运行 它。安装后,转到 /etc/groovyconsole.html 和 运行 一个如下所示的脚本:
session.refresh(false)
def query = session.getWorkspace().getQueryManager().createQuery(
"SELECT * FROM [nt:unstructured] AS s " +
"WHERE s.[sling:resourceType] = '/path/to/my/component' " +
"AND s.[myProperty] IS NULL",javax.jcr.query.Query.JCR_SQL2)
query.execute().getNodes().each { jcrNode ->
println "set value for $jcrNode"
jcrNode.setProperty('myProperty', myValue)
}
//uncomment if you're happy with the list of applicable nodes printed by the script
//session.save()
它不是最漂亮和最安全的,但它应该可以工作。希望我没有打错字。
我最终解决这个问题的方法是,在我根据单选按钮的值选择执行不同操作的代码中,我使用了 if
语句。然后我将 if
复制到 else
.
中作为默认值
因此,我对之前构建的组件进行了更新。该组件用于仅呈现一个想要另一个页面的按钮。但是,我需要添加功能,以便它可以显示静态文本而不是按钮。所以我添加了一个单选按钮组,您可以在按钮和静态文本之间 select。
但是,在进行更新后,任何已在页面上使用过该组件的地方,它都不再呈现按钮。所以我将其更改为默认单选选项为按钮。现在,当我在页面上放置一个新组件时,它默认为按钮。但是,在我双击它们并单击“确定”之前,现有组件不会默认为任何内容;不需要其他改动,只需要打开和关闭组件,然后似乎看到默认值。
我的问题是,我如何才能使组件已部署的任何地方都使用默认选项单选按钮,并相应地呈现,而无需打开和关闭?或者有没有办法让 AEM 刷新所有页面上的每个组件,以便它可以看到并使用新的单选按钮,这会将它们默认为按钮?
我宁愿不向 JSP 添加代码,告诉它 "else if nothing is selected, use button"。
在对话框定义中,您只能指定对话框的默认值。当您拖放组件时,对话框甚至还不存在。当您打开它时,它会填充您在对话框定义中提供的默认值,然后,一旦您关闭它,就会将它们发布到 JCR,以便您可以看到效果。
要在创建时使用默认值实际初始化组件,您需要创建适当的内容模板。有关详细信息,请参阅 this page
编辑: 不幸的是,没有简单的方法可以将默认内容添加到已经存在的组件中,因为组件已经过了它的初始化状态。我解决这个问题的方法是,我创建一个 Groovy 脚本,将所需(在本例中为默认)值放入 JCR 并使用 Groovy Console 运行 它。安装后,转到 /etc/groovyconsole.html 和 运行 一个如下所示的脚本:
session.refresh(false)
def query = session.getWorkspace().getQueryManager().createQuery(
"SELECT * FROM [nt:unstructured] AS s " +
"WHERE s.[sling:resourceType] = '/path/to/my/component' " +
"AND s.[myProperty] IS NULL",javax.jcr.query.Query.JCR_SQL2)
query.execute().getNodes().each { jcrNode ->
println "set value for $jcrNode"
jcrNode.setProperty('myProperty', myValue)
}
//uncomment if you're happy with the list of applicable nodes printed by the script
//session.save()
它不是最漂亮和最安全的,但它应该可以工作。希望我没有打错字。
我最终解决这个问题的方法是,在我根据单选按钮的值选择执行不同操作的代码中,我使用了 if
语句。然后我将 if
复制到 else
.