次の問題を解決するのに苦労しています。私の問題は非常に単純です。検証エラーを引き起こしたフォームフィールドを赤で強調表示したいと思います。エラーメッセージは、context.addMessage(...)行を使用してFacesContextに正しく配置されます。
システムを汎用的にしたいと思います。メッセージが添付されているすべてのフォームフィールドが自動的に強調表示されます。
私はこのサイトでこの優れた記事へのリンクを見つけました: http ://www.jroller.com/mert/entry/how_to_find_a_uicomponent
これを使用して、RENDER_RESPONSEフェーズのPhaseListenerを実装しました。これは、次のことを行います。
@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リストのオブジェクトごとに1つ)、各要素には次のような一意の識別子(clientId)があります。
contentForm:revisionDocuments:0:revisionSequenceAdresse
反復ごとに1、2、...の0が変更されます。その結果、ViewRootからUIComponentを検索するために提供されたコードは正しく機能しません。すべてのフォームフィールドには同じ「id」があります。さらに驚いたのは、FacesContextにも同じ「clientId」があることです。
contentForm:revisionDocuments:revisionSequenceAdresse
ツリーを調べている間、正しいフォームフィールドまたは他のフィールドが表示されているかどうかを区別できません。
誰かがこれを解決するためのヒントを持っていますか?または私のフィールドのハイライトを実装するための別の提案?私は認めなければなりません、私は自分のコードが本当に好きではありません、私がしているようにviewRootを操作するのは汚いと思いますが、私のフィールドの一般的なハイライトを持つためのより良い解決策を見つけることができませんでした。
JBOssAS7.0.2.FinalでJSF-Impl2.1.1-b04を使用してIceFaces2.0.2を実行しています。
よろしくお願いします。よろしく、パトリック