Мне трудно решить следующее. Моя проблема довольно проста: я хотел бы выделить красным цветом поля форм, которые вызвали ошибки проверки. Сообщения об ошибках правильно размещаются в FacesContext с помощью строки context.addMessage(...).
Я бы хотел, чтобы моя система была универсальной. Все поля формы, к которым прикреплено сообщение, автоматически выделяются.
Я нашел на этом сайте ссылку на эту прекрасную статью: http://www.jroller.com/mert/entry/how_to_find_a_uicomponent
С его помощью я реализовал PhaseListener для фазы RENDER_RESPONSE, который делает следующее:
@Override
public void beforePhase(PhaseEvent event) {
// get context
FacesContext context = event.getFacesContext();
// iterate on all the clientIds which have messages
Iterator<String> clientIdsWithMessages = context.getClientIdsWithMessages();
while (clientIdsWithMessages.hasNext()) {
// get the clientId for the field component
String clientIdWithMessage = clientIdsWithMessages.next();
// split on ":"
String[] splitted = clientIdWithMessage.split(":");
UIComponent component = findComponentInRoot(splitted[splitted.length - 1]);
if (component != null) {
Map<String, Object> attributes = component.getAttributes();
if (attributes.containsKey("style")) {
attributes.remove("style");
}
attributes.put("style", "background-color: #FFE1E1;");
}
}
}
Это отлично работает почти для всех моих применений.
Теперь, когда это становится немного сложно, некоторые из моих форм имеют такой код:
<ice:dataTable id="revisionDocuments" value="#{agendaBean.agenda.revisionsDocuments}" var="revision">
<ice:column>
<ice:inputText value="#{revision.sequenceAdresse}" id="revisionSequenceAdresse" />
</ice:column>
....
Сгенерированная форма имеет несколько строк (по одной для каждого объекта списка ревизийДокументы), и каждый элемент имеет уникальный идентификатор (clientId), который выглядит следующим образом:
contentForm:revisionDocuments:0:revisionSequenceAdresse
С 0 менялся на 1, 2, ... для каждой итерации. Следовательно, код, предоставленный для поиска UIComponent из ViewRoot, не работает должным образом. Все поля формы имеют одинаковый идентификатор. Что меня больше удивляет, так это то, что у них есть тот же «clientId» и в FacesContext:
contentForm:revisionDocuments:revisionSequenceAdresse
Я не могу различить, проходя по дереву, вижу ли я правильное поле формы или любое другое.
У кого-нибудь есть подсказка, чтобы решить эту проблему? Или другое предложение реализовать подсветку моих полей? Я должен признать, что мне не очень нравится мой код, я считаю грязным манипулировать viewRoot, как я это делаю, но я не мог найти лучшего решения, чтобы иметь общую подсветку моих полей.
Я использую IceFaces 2.0.2 с JSF-Impl 2.1.1-b04 на JBOss AS 7.0.2.Final.
Заранее спасибо за ответы. С уважением, Патрик