CQ5 aka AEM - программный поиск источника скопированной страницы

В настоящее время я изучаю AEM, и мне было интересно, можно ли определить "источник" страницы. Чтобы уточнить, что я имею в виду именно:

Если вы копируете страницу с помощью параметров "Копировать" и "Вставить" в CQ5 WCM (не в реальном времени, а в обычном экземпляре страницы), можно программно определить, на какой странице основана ваша новая страница, т.е. страницу, которую вы скопировали, чтобы создать новую страницу?

2 ответа

Решение

Вы можете искать страницы с тем же именем (startWith(...)) и тем же ResourceType. Но, насколько я знаю, как только страница вставлена ​​- нет никакой связи с "исходной" страницей. Кроме того, вы можете сравнить имена дочерних элементов ресурса содержимого страниц (узел jcr:content)

Я бы подошел скорее с другой точки зрения. Когда вы копируете страницу, между ними нет никакой связи или ссылки. Однако вы можете подготовить такой механизм самостоятельно. Это может работать следующим образом:

Во-первых, вам нужно реализовать фильтр, который будет перехватывать каждый запрос.

Форма запроса, которая отвечает за создание новой страницы в 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 есть еще один сервлет, отвечающий за создание страницы. Поэтому ваш Filter следует принять это во внимание.

Другие вопросы по тегам