Hallo!
Ich habe ein Problem bei der Validierung von Textfeldern mit MyFaces, speziell dem Setzen von css-Klassen bei fehlgeschlagener Validierung. Verwende MyFaces 1.2 mit Richfaces 3.3.3 und Facelets.
Habe zu Testzwecken einen Validator gebaut, der mir nur mal die Feldlänge (ich weiß, da gibts bereits vorgefertigte ... ist, wie gesagt, zu Testzwecken) überprüft.
Die Fehlermeldung wird jetzt auch richtig angezeigt, aber beim Textfeld ändert sich kein Style. Deswegen habe ich einen Phaselistener gschrieben, der in der RENDER_RESPONSE Phase alle Komponenten mit Messages ausließt und dann ein Attribut "styleClass" setzt.
Er findet zwar die fehlerhaften Felder und setzt auch das Attribut richtig, allerdings ändert sich bei der Ausgabe nichts.
Ich habe ein Problem bei der Validierung von Textfeldern mit MyFaces, speziell dem Setzen von css-Klassen bei fehlgeschlagener Validierung. Verwende MyFaces 1.2 mit Richfaces 3.3.3 und Facelets.
Habe zu Testzwecken einen Validator gebaut, der mir nur mal die Feldlänge (ich weiß, da gibts bereits vorgefertigte ... ist, wie gesagt, zu Testzwecken) überprüft.
HTML:
<rich:messages showSummary="false" showDetail="true" />
<h:inputText id="nachname_person" value="#{person.nachname}">
<f:validator validatorId="lengthValidator"/>
<f:attribute name="maxLength" value="#24"/>
<rich:ajaxValidator event="onblur" />
</h:inputText>
Die Fehlermeldung wird jetzt auch richtig angezeigt, aber beim Textfeld ändert sich kein Style. Deswegen habe ich einen Phaselistener gschrieben, der in der RENDER_RESPONSE Phase alle Komponenten mit Messages ausließt und dann ein Attribut "styleClass" setzt.
Java:
public class ValidationStylePhaseListener implements PhaseListener {
@Override
public void afterPhase(PhaseEvent event) {}
@Override
public void beforePhase(PhaseEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
Iterator<String> clientIdList = context.getClientIdsWithMessages();
String errorStyle = "error";
StringBuilder highlight = new StringBuilder();
while (clientIdList.hasNext()) {
String clientId = clientIdList.next();
UIComponent component = FacesContext.getCurrentInstance().getViewRoot().findComponent(clientId);
if (component instanceof UIInput) {
String style = (String) component.getAttributes().get(HTML.STYLE_CLASS_ATTR);
component.getAttributes().put(
HTML.STYLE_CLASS_ATTR,
StringUtils.implode(new Object[] { style, errorStyle }, " "));
}
}
}
@Override
public PhaseId getPhaseId() {return PhaseId.RENDER_RESPONSE;}
}
Er findet zwar die fehlerhaften Felder und setzt auch das Attribut richtig, allerdings ändert sich bei der Ausgabe nichts.