Cicli if con Thymeleaf e th:field

di il
2 risposte

Cicli if con Thymeleaf e th:field

Ho scritto questo script che funziona:

<div th:object="${UtenteForm}" th:remove="tag">
<div th:field="*{NomeUtenteForm}" th:remove="tag">
<div th:switch="${#fields.hasErrors('NomeUtenteForm')}" th:remove="tag">
    <div th:case="${true}" th:remove="tag">
        <div>Ci sono errori! Rispetta queste regole: ecc... ecc...</div>
    </div>
    <!--/*
    <div th:case="*" th:remove="tag">
        <div></div>
    </div>
    */-->
</div>
</div>
</div>
Ma è terribilmente complicato, prolisso e scomodissimo oltre che difficile da leggere. Inoltre, bellezza a parte, non capisco come posso usare gli operatori "||" e "&&".
In pratica vorrei visualizzare nella pagina un tag <div> con del semplicissimo testo quando c'è un qualunque tipo di errore, associato a qualunque tipo di variabile. Precisamente queste 3 variabili:

${#fields.hasErrors('NomeUtenteForm')}
${#fields.hasErrors('PasswordForm')}
${#fields.hasErrors('ConfermaPasswordForm')}
Sapreste dirmi come posso fare?
grazie

2 Risposte

  • Re: Cicli if con Thymeleaf e th:field

    Se vuoi semplicemente elencare tutti i messaggi di errore ad esempio con dei <li> in <ul> o con dei semplici <p>, il minimo (ma proprio minimo) da fare è quello che viene indicato nella documentazione 7.2 All errors
    Esattamente il primo esempio, quello dove c'è un banale <ul> "condizionato" (th:if) e dentro un <li> ripetuto (th:each) per ciascun messaggio di errore.

    Il minimo assoluto è quello. Ma il punto/problema è che quel "err" che si vede è solo banalmente la stringa dell'errore. E che potrebbe essere poco contestualizzata. A meno che TU abbia scritto dei messaggi di errore più precisi del tipo es. "Il campo Anno deve essere superiore o uguale a 1900".

    I messaggi predefiniti per le annotazioni, che sono definiti nel Hibernate Validator, sono decisamente meno contestualizzati. Ad esempio per @Min il messaggio predefinito in italiano dice "deve essere superiore o uguale a {value}" (dove {value} è il segnaposto sostituito con il valore indicato nel @Min). La domanda è: COSA deve essere superiore? Il messaggio appunto NON lo dice (ovviamente, essendo generalizzato).

    Un'altra alternativa è usare quello che è indicato in 7.5 Rich error objects. Si usa detailedErrors() che fornisce dei bean (non solo stringhe) che hanno le proprietà fieldName, message e global.

    In sostanza:
    - ti serve il fieldName --> usi i rich error object ovvero quelli forniti da detailedErrors()
    - non ti serve il fieldName o comunque hai tuoi messaggi ben contestualizzati o stai iterando solo sugli errori di un campo specifico --> usi la forma più semplice indicata all'inizio
  • Re: Cicli if con Thymeleaf e th:field

    Grazie, tutto chiaro.
Devi accedere o registrarti per scrivere nel forum
2 risposte