Доброго времени суток.
Имеется форма для создания неопределённого количества продуктов.
Модель - Product.
Как правильно составить эту форму, чтобы можно было создавать неограниченное количество продуктов (массив)?
Если мне необходимо какое-либо поле продублировать, то делаю так:
<input type="text" name="Product[field_name][]">
<input type="text" name="Product[field_name][]">
Но как провернуть подобное, но для целой модели?
Были идеи и даже реализация подстановки рандомного ключа по шаблону, на лету с помощью JS, но чувствую, что это очень грубый костыль, каких еще поискать надо.
В идеале, хотелось бы, чтобы запись вида:
<input type="text" name="Product[][name]">
<input type="text" name="Product[][description]">
работала по аналогии с предыдущим вариантом, но, увы, это не реально.
Может быть есть способ подобного определения полей в рамках какого-то тега?
Вроде:
<!-- Первый продукт, запишется с ключом 0 -->
<form-item>
<input type="text" name="Product[][name]">
<input type="text" name="Product[][description]">
</form-item>
<!-- Второй продукт, запишется с ключом 1 -->
<form-item>
<input type="text" name="Product[][name]">
<input type="text" name="Product[][description]">
</form-item>
Можно, конечно, при создании нового экземпляра формы отдавать её не из скрытого шаблона на странице, а посредством AJAX подгрузки, где на стороне PHP, в экшене создавать новую модель под эту форму, сохранять, получать ID созданной модели и в качестве ключа использовать этот ID.
Однако, если нет более элегантного решения - получение HTML-кода формы через AJAX, наиболее приемлемый вариант.
Заранее благодарю за любые ответы.
UPD:
Множатся не формы, а модели, которые нужно заполнить. И их количество динамически меняется. Поэтому в моём случае оптимально использовать в качестве ключа - ID модели:
<input type="text" name="Product[<?=$productModel->id;?>][name]">
<input type="text" name="Product[<?=$productModel->id;?>][description]">
То есть форму запрашивать посредством AJAX и при рендере формы указывать ключ новой, созданной при запросе модели, которая уже сохранена в базе под инкрементируемым ID.