Ответ 1
Я не уверен, что могу дать вам полный ответ на ваш вопрос, но, надеюсь, я могу дать вам пару идей.
Я оказался в аналогичной ситуации при попытке создать систему для опросов.
В каждом опросе было много PollOptions, и я хотел, чтобы было возможно динамически добавлять столько параметров опроса, сколько необходимо на моей странице опросов /admin _edit.
Мне это удалось с помощью встроенной функции CakePHP плюс немного Javascript.
При создании формы в представлении admin_edit я сначала помещаю поля Poll и под этим я добавил следующее:
<div id="poll-options">
<?php
if (isset($this->data['PollOption'])) {
$i = 0;
foreach ($this->data['PollOption'] as $opt) {
echo $form->hidden("PollOption.$i.id");
echo $form->input("PollOption.$i.name", array('label' => "Option " . ($i + 1)));
$i++;
}
}
?>
</div>
$this->data
был установлен в PollController. Если в опросе уже были указаны PollOptions, они также были включены в $this->data
. Кроме того, если форма уже была отправлена и были ошибки проверки, все необходимые поля PollOption были построены снова, когда страница отображалась, поскольку они все еще находились в $this->data
от контроллера.
Итак, я позаботился о том, чтобы у меня всегда были поля, которые мне нужны в представлении.
Когда форма была отправлена, я попытался сохранить данные с помощью простого
$this->Poll->saveAll($this->data, array('atomic' => false, 'validate' => 'first'));
(Вы можете проверить API или документы CakePHP, если вы не уверены в синтаксисе выше)
Я использовал Javascript (jQuery) для динамического добавления полей PollOption:
$('#add-option-button').click(function(event){
var optionCount = $('#poll-options > div').size() + 1;
var inputHtml = '<div class="input text"><label for="PollOption' + optionCount + 'Name">Option ' + optionCount
+ '</label><input id="PollOption' + optionCount + 'Name" type="text" name="data[PollOption][' + optionCount + '][name]" /></div>';
event.preventDefault();
$('#poll-options').append(inputHtml);
});
Вы упомянули, что делали это сами, но не должны беспокоиться об этом, если вы не пытаетесь использовать компонент безопасности в форме.
Надеюсь, это поможет указать вам в правильном направлении или, может быть, дать вам несколько идей.