CQ5又名AEM - 以编程方式查找复制页面的来源

时间:2015-06-05 20:34:36

标签: cq5 aem

我目前正在探索AEM,并且想知道是否有可能确定"来源"一页澄清我的意思:

如果您使用"复制"复制页面。和"粘贴" CQ5 WCM中的选项(不是实时副本,只是页面的正常副本)是否可以通过编程方式确定新页面所基于的页面,即您复制哪个页面来创建新页面?

2 个答案:

答案 0 :(得分:1)

您可以查找具有相同名称(startsWith(...))和相同ResourceType的页面。但据我所知,只要粘贴了页面 - 就没有与“源”页面的连接。 此外,您可以比较Pages内容资源(jcr:content node)的子项名称

答案 1 :(得分:1)

我会从不同的角度来看待。复制页面时,这些页面之间没有关系也没有参考。但是,您可以自己准备这样的机制。这可以如下工作:

首先,您需要实现Filter,它将拦截每个请求。

请求表单负责在WCM中创建新页面,如下所示:

cmd:copyPage
_charset_:utf-8
srcPath:/content/src
destParentPath:/content/dest
before:

然后,将捕获复制请求的Filter应该是这样的:

@Component(immediate = true)
@Service
@Properties({ @Property(name = "filter.scope", value = "REQUEST") })
public class CopyPageFilter implements Filter {

    private static final String WCM_COMMAND_SERVLET = "/bin/wcmcommand";

    private static final String CMD = "cmd";

    private static final String COPY_PAGE = "copyPage";

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        if (isValid((SlingHttpServletRequest) request)) {
            // store the src-dst for a while
        } else {
            chain.doFilter(request, response);
        }
    }

    private boolean isValid(SlingHttpServletRequest request) {
        return WCM_COMMAND_SERVLET.equals(request.getPathInfo())
                && COPY_PAGE.equals(request.getParameter(CMD));
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        // nothing to initialize
    }

    @Override
    public void destroy() {
        // nothing to destroy
    }

}

它允许您临时存储源和目标之间的关系。下一步是实现SlingPostProcessor,它将在新创建的页面中存储有关源的信息。

@Component(immediate = true)
@Service
public class BootstrapGridPostProcessorService implements SlingPostProcessor {

    @Reference
    private CopyPageFilter copyPageFilter;

    @Override
    public void process(SlingHttpServletRequest request, List<Modification> modifications)
            throws RepositoryException {
        // 1. Check if this modification is a page creation
        // 2. Check if in CopyPageFilter we have info about source for our destination
        // 3. To the newly created page add a weak reference (uuid) or path to the source
    }

}

就是这样。我们添加了可以进一步使用的复制页面之间的关系。

重要我很确定在Touch UI中还有另一个负责页面创建的servlet。因此,您的Filter应考虑到这一点。