luchob / softuni-music-db

Our workshop project for the course Spring Advanced 2021
3 stars 11 forks source link

проблемите със запазване след binding result продължават. #25

Closed dddobrev closed 3 years ago

dddobrev commented 3 years ago

Здравей Лъчо, Благодаря за подсказката th:selected="" ,но при мен сработи частично, а именно само там където съм изтеглил енъмите с "th:each="transm: ${T(com.example.AutoWorkShop.domain.entities.enums.TransmissionEnum).values()}". Там вече се запазват. Почервенява полето, не ми изписва грешката, но поне се запазват. Там където съм ги добавил от контролера, продължава да не ги запазва. Зарежда ги във формата, но ги изтрива при грешка. Преписал съм html логиката от мобилелеле, но не и ... не. Същото се получава и като едитна някой от ентититата, нулирани са. Имам проблем само с дроб-дауните. Също не изписва и съобщението за грешка само на техните полета. Моля за помощ. линк към проекта: Auto-WorkShop-Pro Благодаря! P.S. Оправяй се бързо и безпроблемно :)

luchob commented 3 years ago

Еее... едни дроп дауни ли ще те гътват? Ок, дай поред, да се фокусираме върху горивото на колата (fuel). Инициализираме всички стойности в контролера, нали:

 @GetMapping("/add")
    public String addCar(Model model) {
        ...
        model.addAttribute("fuel", FuelEnum.values());
        ...
    }

So far so good. Обаче в HTML-a нещо не ми харесва. Нека го направим така:

<option th:each="f: ${fuel}"
               th:text="${f}"
               th:value="${f}"
               th:selected="${f} == *{fuel}">Fuel
 </option>

Тук важните неща са - ${fuel}са всички горива. *{fuel}е избраното гориво, това дето е в байндинг модела. ${f} е текущото гориво, дето наливаме в дропдауна. th:selected="${f} == *{fuel}"- ако текущото гориво в дропдауна е туй в байндинг модела - направи го да е селектнато.

Следващият, последен проблем е с грешката. Тя се управлява от една буутстрап магия. Там има един тънък момент! Елементът на грешката (този с клас invalid-feedback) трябва да е sibling (веднага след) този с is-invalid. Ето пример:

<select th:errorclass="is-invalid">
...
</select>
<small  class="invalid-feedback"></small>

Пре теб обаче е:

<select th:errorclass="is-invalid">
...
<small  class="invalid-feedback"></small>
</select>

Малка разлика, но... :-)

Screenshot 2021-03-31 at 18 18 37 Screenshot 2021-03-31 at 18 19 07

Айде - вече нямаш проблеми с дропдауните ;-)

dddobrev commented 3 years ago

Лъчо, много Благодаря, страхотен си! с Енъмите се получи. Съобщенито за грешеки е налице ... абе супер хепи съм! Проблема с ентититата, обаче остана. Ако не успея да го фиксна ще остане така. Ето подробности. в контролера е така :

 @GetMapping("/add")
    public String addCar(Model model) {
//връща Лист от клиент вю модел
        model.addAttribute("clientEntity", clientService.findAll());
        model.addAttribute("transmission", TransmissionEnum.values());
        model.addAttribute("fuel", FuelEnum.values());
        return "car-add";
    }

= html темпл

<option th:each="cl: ${clientEntity}"
                                th:text="|${cl.firstName} ${cl.secondName} ${cl.telephone}|"
                                th:value="${cl.id}"
                                th:selected="${cl} == *{clientEntity}">client
                        </option>

==== ако редактирам темпл. така във html templ,

<option th:each="cl: ${clientEntity}"
                                th:text="|${cl.firstName} ${cl.secondName} ${cl.telephone}|"
                                th:value="${cl.id}"
                                th:selected="${cl.id} == *{clientEntity.id}">client
                        </option>

и е заредена формата става, но при рефреш или първончално зареждане темплийта се чупи . error-a e - org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'id' cannot be found on null .... чаршаф ерор...

luchob commented 3 years ago

Eee.... няма да го оставяш така. Ама как така ти хрумна да сложиш ентити в байндинг модела :-) В байндинг модела си сложи id-то на клиента. И така ще стане нещо от сорта на:

<select
                            id="clientId"
                            name="clientId"
                            th:errorclass="is-invalid"
                            class="form-control">
                        <option value="">- Select client -</option>
                        <option th:each="cl: ${clientEntity}"
                                th:text="|${cl.firstName} ${cl.secondName} ${cl.telephone}|"
                                th:value="${cl.id}"
                                th:selected="${cl.id} == *{clientId}">client
                        </option>
                    </select>
public class CarAddBindingModel {

    private Long clientId;

Оттам ще си направиш необходимите проверки и ще асайнеш правилния клиент на колата.

Поздрави, Л.

dddobrev commented 3 years ago

Ееее отново хиляди Благодаря :-) нещата отиват към каса бира на плажа :-) Лятото се показва, само да сме живи и здрави. Как ми хрумна - ентити в байндинг модела... не съм се сблъсквал с такива казуси, не си давах сметка за проблемите, но с писане, учене ... ще се получат нещата. По - късно такива полета във формата ще ги взимам с JS, но сега бързам заради сроковете. При едита на юзъра вземам id-то от базата, надявам се, че това не е проблем за секюритито.

Иначе как ти се струва идеята и структурата...

Още веднъж Много Благодаря :-) Митко

luchob commented 3 years ago

Дааа, показва се лятото. Остава и моторетката да изкарам, но... нека първо спре да ми се подава белия дроб навън като кашлям и действаме :-) За user id-то ако го предаваш с байндинг модела е много голям проблем за секюритито, определено. Изобщо не би трябвало да го предаваш, трябва да разчиташ на AuthenticatedPrincipal-a. Оттам вземаш името и от ДБ юзъра по име.

Поздрави, Л.

dddobrev commented 3 years ago

Благодаря ! Всичко ще бъде наред, ще се оправиш. Така си и мислех, но ми беше по-лесно така :-) Задължително ще рефакторирам редакцията на user profila.

Поздрави, Митко