2013-05-05 10 views
3

В Adobe AEM (бывший CQ5), каков наилучший способ добавить пользовательский html для частичного компонента?Добавление к <head> из компонента CQ

Предположим, что у меня есть страница, на которой я могу разместить свой компонент в любом из доступных parsys (так что возможны несколько экземпляров, и я не знаю точного пути). Я хочу, чтобы этот компонент добавлял некоторые данные для рассылки на основе содержимого (в дополнение к стандартным рендерингам). Проблема в том, что код компонента выполняется после JSP для рендеринга, поэтому я не могу передать данные для рендеринга, например. атрибут запроса.

+0

Хороший вопрос. Мне тоже интересно об этом. Добавление clientlib с компонентом помещает их в середину html-body, что нежелательно. Прямо сейчас я просто добавляю все в headlibs, предполагая полный контроль над тем, какой ограниченный набор компонентов пользователь может добавить. – jedatu

ответ

2

Возьмите все это с усилением соли, дикие спекуляции следующим образом:

Я не 100% уверен в этом, но я всегда считал, что сценарии компонентов выполняются в том порядке, они включены на странице, что означает, что к моменту выполнения сценария рендеринга компонента страница уже была отображена, что делает невозможным описание.

Если вам действительно нужно это, должно быть возможно (по крайней мере теоретически) написать какой-то код, который выполняется в head или headlibs.jsp, и построил список всех компонентов на странице (в основном просто рекурсивно ходить по jcr : дерево узлов контента для страницы и построение списка типов ресурсов, которые вы найдете), а затем на основе этого включают в себя набор категорий клиентской библиотеки, возможно, путем создания скрытых свойств компонентов ... или чего-то еще.

+0

Как и в случае с вашим предложением, я создал TabLib, который можно было бы включить в headlibs.jsp, похожий на cq: includeClientLibs. В этом случае он просматривает узел контента и использует resourceType и resourceSuperType для поиска компонентов на странице. Затем он ищет свойство зависимостей string [] в компоненте и использует HtmlLibraryManager для записи включений. Он может быть настроен для рендеринга только CSS или JS, если это необходимо. Кажется, он работает нормально. – jedatu

+0

@jedatu Можете ли вы разместить образец кода? – koga73

0

Мы создали компоненты «вверх по течению» или обертки, которые включают в себя другие компоненты.

В восходящем случае, они могут добавить атрибуты к объекту запроса (или играть с печеньем или ...)

В «обертка» случай (Composition Pattern), компонент «s другие компоненты. Мы передаем данные во включенный компонент, добавляя String или Object к атрибуту запроса, который будет искать внутренний компонент. После включения компонент-оболочка удалит добавленный атрибут (поэтому он не случайно загрязняет настройки). Затем «внутренний компонент» отвечает за поиск определенных атрибутов объекта запроса.

<%! 
public String getPassedData(HttpServletRequest req, String attrName) { 
    final Object passed = (req.getAttribute(attrName)==null) ? "" : req.getAttribute(attrName); 
    if (override.equals("")) 
     return passed.toString(); 
    } 
%> 

 Смежные вопросы

  • Нет связанных вопросов^_^