Мне трудно решить следующее. Моя проблема довольно проста: я хотел бы выделить красным цветом поля форм, которые вызвали ошибки проверки. Сообщения об ошибках правильно размещаются в 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>
....
Сгенерированная форма имеет несколько строк (по одной для каждого объекта списка revisionsDocuments), и каждый элемент имеет уникальный идентификатор (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.
Заранее спасибо за ответы.
С наилучшими пожеланиями,
Patrick