Я хочу пронумеровать любые сообщения об ошибках JSF (например, проверка, сообщения преобразования), который появляется, если пользователь вводит недопустимый вход в несколько полей ввода. Например, как это, когда пользователь отправляет форму:
-----Форма------
(1) Имя: самка John 13
Возраст: 30
(2) Электронная почта: myemail@domain
Как я могу сделать это?
С уважением
Что касается части сообщений, просто отобразите их все, используя
обычным способом, который вы задаете как list-style-type: decimal;
. Это будет отображать числа вместо пуль.
Следующим шагом будет нумерация этикеток. Для этого потребуется немного больше работы, поскольку JSF не предоставляет встроенных средств для этого. В основном вам нужно определить, связана ли данная метка с сообщением или нет, и в каком порядке сообщение было поставлено в очередь. Вы можете собрать эту информацию в Map
следующим образом:
private Map<String, String> messageIndexes;
public Map<String, String> getMessageIndexes() {
FacesContext context = FacesContext.getCurrentInstance();
if (messageIndexes == null && context.getRenderResponse()) {
messageIndexes = new HashMap<String, String>();
Iterator<String> clientIds = context.getClientIdsWithMessages();
for (int i = 1; clientIds.hasNext(); i++) {
messageIndexes.put(clientIds.next(), String.format("(%d)", i));
}
}
return messageIndexes;
}
, а затем использовать ее следующим образом:
<h:form id="form">
<h:outputText value="#{bean.messageIndexes['form:input1']}" />
<h:outputLabel for="input1">Label 1</h:outputLabel>
<h:inputText id="input1" value="#{bean.input1}" required="true" />
<br />
<h:outputText value="#{bean.messageIndexes['form:input2']}" />
<h:outputLabel for="input2">Label 2</h:outputLabel>
<h:inputText id="input2" value="#{bean.input2}" required="true" />
<br />
...
</h:form>
Если идентификатор клиента отсутствует на карте, то просто ничего не будет быть отрендеренным.
Чтобы переместить все задания из bean-компонента, вы можете рассмотреть либо PhaseListener
(сделайте это в beforePhase ()
из RENDER_RESPONSE
), либо или компонент настраиваемой метки.
Большое спасибо. Я использовал ваше решение и внес небольшие изменения. Я решил это, используя PhaseListener для фазы RENDER_RESPONSE. Однако мне пришлось вызвать метод ниже из beforePhase () вместо afterPhase (). В противном случае мои изменения не повлияли.
public void addMessageIdentifier() {
FacesContext context = FacesContext.getCurrentInstance();
if (context.getRenderResponse()) {
// Iterate over faces messages and add counter
Iterator<FacesMessage> messages = context.getMessages();
if (messages != null && messages.hasNext()) {
int counter = 1;
while (messages.hasNext()) {
FacesMessage message = messages.next();
if (message.getSeverity().equals(FacesMessage.SEVERITY_ERROR)) {
String indicator = "(" + new Integer(counter).toString() + ") ";
message.setDetail(indicator);
message.setSummary(indicator + message.getSummary());
counter++;
}
}
}
}
}