【问题标题】:CQ5 aka AEM - Finding the source of a copied page programmaticallyCQ5 aka AEM - 以编程方式查找复制页面的来源
【发布时间】:2015-06-05 20:34:36
【问题描述】:

我目前正在探索 AEM,想知道是否可以识别页面的“来源”。为了澄清我的确切意思:

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

【问题讨论】:

    标签: aem


    【解决方案1】:

    您可以查找具有相同名称 (startsWith(...)) 和相同 ResourceType 的页面。但据我所知,粘贴页面后 - 与“源”页面没有任何联系。 此外,您可以比较 Pages 内容资源的子项的名称(jcr:content 节点)

    【讨论】:

      【解决方案2】:

      我宁愿从不同的角度来处理。当您复制页面时,它们之间没有关系也没有引用。但是,您可以自行准备此类机制。这可以如下工作:

      首先,你需要实现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 应该考虑到这一点。

      【讨论】:

      • 非常感谢您描述另一种方法。我不认为我现在会使用这种方法,因为我只是想知道 CQ 中是否存在默认存储此类信息的东西。我暂时不会对“复制页面”逻辑更改/添加额外的行为,但感谢您花费时间和精力提出不同的解决方案,这看起来很有趣,如果我需要从这方面解决问题,我会一定再看一遍。我希望我能投票给你的答案,但我目前没有足够的声誉。
      猜你喜欢
      • 2015-09-10
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多