Closed dddobrev closed 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>
Малка разлика, но... :-)
Айде - вече нямаш проблеми с дропдауните ;-)
Лъчо, много Благодаря, страхотен си! с Енъмите се получи. Съобщенито за грешеки е налице ... абе супер хепи съм! Проблема с ентититата, обаче остана. Ако не успея да го фиксна ще остане така. Ето подробности. в контролера е така :
@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 .... чаршаф ерор...
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;
Оттам ще си направиш необходимите проверки и ще асайнеш правилния клиент на колата.
Поздрави, Л.
Ееее отново хиляди Благодаря :-) нещата отиват към каса бира на плажа :-) Лятото се показва, само да сме живи и здрави. Как ми хрумна - ентити в байндинг модела... не съм се сблъсквал с такива казуси, не си давах сметка за проблемите, но с писане, учене ... ще се получат нещата. По - късно такива полета във формата ще ги взимам с JS, но сега бързам заради сроковете. При едита на юзъра вземам id-то от базата, надявам се, че това не е проблем за секюритито.
Иначе как ти се струва идеята и структурата...
Още веднъж Много Благодаря :-) Митко
Дааа, показва се лятото. Остава и моторетката да изкарам, но... нека първо спре да ми се подава белия дроб навън като кашлям и действаме :-) За user id-то ако го предаваш с байндинг модела е много голям проблем за секюритито, определено. Изобщо не би трябвало да го предаваш, трябва да разчиташ на AuthenticatedPrincipal-a. Оттам вземаш името и от ДБ юзъра по име.
Поздрави, Л.
Благодаря ! Всичко ще бъде наред, ще се оправиш. Така си и мислех, но ми беше по-лесно така :-) Задължително ще рефакторирам редакцията на user profila.
Поздрави, Митко
Здравей Лъчо, Благодаря за подсказката th:selected="" ,но при мен сработи частично, а именно само там където съм изтеглил енъмите с "th:each="transm: ${T(com.example.AutoWorkShop.domain.entities.enums.TransmissionEnum).values()}". Там вече се запазват. Почервенява полето, не ми изписва грешката, но поне се запазват. Там където съм ги добавил от контролера, продължава да не ги запазва. Зарежда ги във формата, но ги изтрива при грешка. Преписал съм html логиката от мобилелеле, но не и ... не. Същото се получава и като едитна някой от ентититата, нулирани са. Имам проблем само с дроб-дауните. Също не изписва и съобщението за грешка само на техните полета. Моля за помощ. линк към проекта: Auto-WorkShop-Pro Благодаря! P.S. Оправяй се бързо и безпроблемно :)