如何使用查询或脚本批量替换 sling:resourceType 值
How to replace sling:resourceType value in bulk using query or script
如何使用 Query 和 Scipt 批量替换 sling:resourceType
值。
例如我想更改 sling:resourceType
值
从 app/component/linkButton
到 app/component/content/linkbutton1
.
该组件在 20 个页面上使用,我想使用查询而不是在每个页面上手动更改它。
可以使用ACS AEM Tools open source project which includes AEM Fiddle。 AEM Fiddle 允许您直接在 AEM 实例上 运行 脚本,而无需构建。
如果您使用 AEM Fiddle,请导航至 http://localhost:4502/miscadmin#/etc/acs-tools/aem-fiddle
,单击右上角的加号,然后单击 select .java
。插入此代码和 运行。确保更新查询的路径。
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import javax.jcr.query.Query;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.ModifiableValueMap;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
public class fiddle extends SlingAllMethodsServlet {
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
response.setStatus(HttpServletResponse.SC_OK);
PrintWriter out = response.getWriter();
ResourceResolver resolver = null;
out.println("starting...");
try {
resolver = request.getResourceResolver();
if (resolver != null) {
Iterator<Resource> resources = resolver.findResources("/jcr:root/content/mysite//*[@sling:resourceType='app/component/linkButton']", Query.XPATH);
while (resources.hasNext()) {
Resource resource = resources.next();
ModifiableValueMap properties = resource.adaptTo(ModifiableValueMap.class);
properties.put("sling:resourceType", "app/component/linkButton1");
resolver.commit();
out.println(resource.getPath());
}
}
} catch(Exception e) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
e.printStackTrace(out);
} finally {
if (resolver != null && resolver.isLive()) {
resolver.close();
resolver = null;
}
}
out.println("...finished");
}
}
如果您更愿意像您所说的那样使用 JSP,代码是相同的:
<%@include file="/libs/foundation/global.jsp"%><%
%><%@page session="false" contentType="text/html; charset=utf-8"
pageEncoding="UTF-8"
import="org.apache.sling.api.resource.*,
java.util.*,
javax.jcr.*,
com.day.cq.search.*,
com.day.cq.wcm.api.*,
com.day.cq.dam.api.*,
javax.jcr.query.Query,
org.apache.sling.api.resource.ModifiableValueMap"%><%
Iterator<Resource> resources = resourceResolver.findResources("/jcr:root/content/mysite//*[@sling:resourceType='app/component/linkButton']", Query.XPATH);
while (resources.hasNext()) {
Resource current = resources.next();
ModifiableValueMap props = current.adaptTo(ModifiableValueMap.class);
props.put("sling:resourceType", "app/component/linkButton1");
resourceResolver.commit();
%>
<%=current.getPath()%>
<%
}
%>
目的的最佳选择是groovy console 。
执行此任务的以下脚本:
import javax.jcr.Node
getNode('/content/').recurse { resourceNode ->
if (resourceNode.hasProperty('sling:resourceType')) {
final def resourceType = resourceNode.getProperty('sling:resourceType').string
if (resourceType.equals('OLD_RESOURCE_TYPE')) {
println "changing " + resourceNode.path
resourceNode.setProperty('sling:resourceType', 'NEW_RESOURCE_TYPE')
resourceNode.save();
}
}
}
另一个肮脏的方法,但对我有用。 :)
- 打包路径,下载zip文件
- 解压到一个文件夹。
- 根据您的操作系统,
- 如果使用 Windows,请使用 Notepad++ 使用您的搜索模式在目录下的所有文件中查找替换。
- 如果 linux,使用 find 或 sed 命令替换 director 中的所有匹配项
AEM ACS TOOLS
怎么样?
它是 sling:resourceType
或 cq:Template
的批量更新工具。
Click here for the article on Getting Started
Click here for the Github Repo
祝你好运...
你也可以看看吊索管。
https://sling.apache.org/documentation/bundles/sling-pipes.html
这是您问题的完美解决方案
如何使用 Query 和 Scipt 批量替换 sling:resourceType
值。
例如我想更改 sling:resourceType
值
从 app/component/linkButton
到 app/component/content/linkbutton1
.
该组件在 20 个页面上使用,我想使用查询而不是在每个页面上手动更改它。
可以使用ACS AEM Tools open source project which includes AEM Fiddle。 AEM Fiddle 允许您直接在 AEM 实例上 运行 脚本,而无需构建。
如果您使用 AEM Fiddle,请导航至 http://localhost:4502/miscadmin#/etc/acs-tools/aem-fiddle
,单击右上角的加号,然后单击 select .java
。插入此代码和 运行。确保更新查询的路径。
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import javax.jcr.query.Query;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.ModifiableValueMap;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
public class fiddle extends SlingAllMethodsServlet {
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
response.setStatus(HttpServletResponse.SC_OK);
PrintWriter out = response.getWriter();
ResourceResolver resolver = null;
out.println("starting...");
try {
resolver = request.getResourceResolver();
if (resolver != null) {
Iterator<Resource> resources = resolver.findResources("/jcr:root/content/mysite//*[@sling:resourceType='app/component/linkButton']", Query.XPATH);
while (resources.hasNext()) {
Resource resource = resources.next();
ModifiableValueMap properties = resource.adaptTo(ModifiableValueMap.class);
properties.put("sling:resourceType", "app/component/linkButton1");
resolver.commit();
out.println(resource.getPath());
}
}
} catch(Exception e) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
e.printStackTrace(out);
} finally {
if (resolver != null && resolver.isLive()) {
resolver.close();
resolver = null;
}
}
out.println("...finished");
}
}
如果您更愿意像您所说的那样使用 JSP,代码是相同的:
<%@include file="/libs/foundation/global.jsp"%><%
%><%@page session="false" contentType="text/html; charset=utf-8"
pageEncoding="UTF-8"
import="org.apache.sling.api.resource.*,
java.util.*,
javax.jcr.*,
com.day.cq.search.*,
com.day.cq.wcm.api.*,
com.day.cq.dam.api.*,
javax.jcr.query.Query,
org.apache.sling.api.resource.ModifiableValueMap"%><%
Iterator<Resource> resources = resourceResolver.findResources("/jcr:root/content/mysite//*[@sling:resourceType='app/component/linkButton']", Query.XPATH);
while (resources.hasNext()) {
Resource current = resources.next();
ModifiableValueMap props = current.adaptTo(ModifiableValueMap.class);
props.put("sling:resourceType", "app/component/linkButton1");
resourceResolver.commit();
%>
<%=current.getPath()%>
<%
}
%>
目的的最佳选择是groovy console 。
执行此任务的以下脚本:
import javax.jcr.Node
getNode('/content/').recurse { resourceNode ->
if (resourceNode.hasProperty('sling:resourceType')) {
final def resourceType = resourceNode.getProperty('sling:resourceType').string
if (resourceType.equals('OLD_RESOURCE_TYPE')) {
println "changing " + resourceNode.path
resourceNode.setProperty('sling:resourceType', 'NEW_RESOURCE_TYPE')
resourceNode.save();
}
}
}
另一个肮脏的方法,但对我有用。 :)
- 打包路径,下载zip文件
- 解压到一个文件夹。
- 根据您的操作系统,
- 如果使用 Windows,请使用 Notepad++ 使用您的搜索模式在目录下的所有文件中查找替换。
- 如果 linux,使用 find 或 sed 命令替换 director 中的所有匹配项
AEM ACS TOOLS
怎么样?
它是 sling:resourceType
或 cq:Template
的批量更新工具。
Click here for the article on Getting Started
Click here for the Github Repo
祝你好运...
你也可以看看吊索管。
https://sling.apache.org/documentation/bundles/sling-pipes.html
这是您问题的完美解决方案