Thymeleaf - установка поля объекта для другого объекта - PullRequest
0 голосов
/ 16 апреля 2020

Я застрял в этом вопросе на некоторое время. Я делаю приложение электронной коммерции, у меня есть класс продукта и класс CartItems.

Класс CartItems содержит продукт, потому что в корзине у вас есть продукты внутри, а CartItems в основном берет выбранный вами продукт и получает такие данные, как общая цена и количество.

CartItems:

@Table(name = "cartitems")
public class CartItems implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@Column(name = "quantity")
private int quantity;

@Column(name = "price")
private double price;

@OneToOne
@JoinColumn(name = "product_id")
private Product product;

@ManyToOne
@JoinColumn(name = "cart_id")
private Cart cart;

public CartItems() {

}

public CartItems(Product product, int quantity, double price, Cart cart) {
    this.quantity = quantity;
    this.price = price;
    this.product = product;
    this.cart = cart;
}

Страница каталога Thymeleaf:

 <div th:each="product : ${popularProducts}">
<form action="#" th:action="@{'/cart/'}" th:object="${cartItem}" method="POST">
  <div class="card">
    <img class="card-img" th:src="${product.pictureUrl}">
      <a href="#" class="card-link text-danger like">
        <i class="fas fa-heart"></i>
      </a>
    </div>
    <div class="card-body">
      <h4 class="card-title" th:text="${product.getName()}"></h4>
      <h6 class="card-subtitle mb-2 text-muted"  th:text="${product.getCategory()}"></h6>
      <p class="card-text" th:text="${product.getDescription()}">
      <div class="buy d-flex justify-content-between align-items-center">
        <div class="price text-success"><h5 class="mt-4" th:text="'$' + ${product.getPrice()}"></h5></div>
        <div class="form-group blu-margin">
         <div class="form-label-group">
              <input th:field="*{cartItem.quantity}" type="text" id="quantity" name="quantity" class="form-control" placeholder="1" required="required">
           </div>
        </div>
         <a href="#" class="btn btn-danger mt-3"><i class="fas fa-shopping-cart"></i> Add to Cart</a>
      </div>

Проблема заключается в настройке CartItems.product равным текущему отображаемому продукту.

Я перебираю каждый продукт и если пользователь нажимает кнопку «Добавить в корзину», я хочу, чтобы поле продукта CartItem было равно отображаемому в данный момент продукту . Как вы вручную устанавливаете это, когда вы передаете его обратно в контроллер?

Есть ли способ просто набрать $ {cartItem.product = product} без необходимости пользователя вручную записывать его как ввод?

В качестве альтернативы, есть ли способ, которым я могу кормить продукт : $ {PopularProducts}, используя атрибут модели? Как мне сообщить об этом после отправки формы вместе с объектом CartItem?

1 Ответ

0 голосов
/ 18 апреля 2020

Мне удалось это исправить, поместив идентификатор продукта в адрес почтового сопоставления в качестве переменной пути, затем с помощью репозитория продукта найти продукт по переданному идентификатору и затем установить его вручную в контроллере.

...