CakePHP: добавить поля в форму (динамически) - PullRequest
14 голосов
/ 14 мая 2011

Я пытаюсь динамически добавлять поля в мою форму CakePHP, но кажется, что у каждого метода, который я использовал, были свои недостатки, которые я не мог исправить.Вот что я попробовал:

  1. Не добавляйте новый вход, просто разделяйте значения в одном входе запятой.Это казалось довольно простым, с некоторыми проблемами при попытке взорвать ввод и сохранить каждое значение в новой строке в базе данных.Но я отказался от идеи, когда мне нужно было отредактировать эти значения ... собрать все значения и внедрить их во входные данные, а затем, когда я сохранил, проверить, все ли значения есть, если нет, удалить соответствующую строку из таблицы ...Для большой работы.

  2. Я пытался создавать новые входы на лету с помощью JS.Но здесь я наткнулся на 2 проблемы: компонент безопасности, который создавал попытку «черной дыры» (и мне действительно нужен этот компонент для проверки целостности формы) и тот факт, что в случае сбоя проверки мои входные данные исчезнут вместе с их значениями.,Я должен добавить, что одна модель может иметь неограниченное количество полей, поэтому входные данные будут выглядеть примерно как name=[Model][14][field], name=[Model][17][field], поэтому я не могу ограничить компонент безопасности не проверять эти определенные входные данные (я знаю их идентификаторы, только когда добавляю их с помощью JSво всяком случае, после того, как компонент Security создает свои данные).

  3. Добавление полей с помощью PHP (поэтому перезагрузите страницу после добавления нового поля), но я не могу выяснить,как добавить поле точно после другого существующего поля, а также как сохранить данные ввода при ошибках валидации.

Любое предложение высоко ценится!

Спасибовы!

Ответы [ 2 ]

14 голосов
/ 16 мая 2011

Я не уверен, что могу дать вам полный ответ на ваш вопрос, но, надеюсь, я могу дать вам пару идей.

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

В каждом опросе было много опций опроса, и я хотел, чтобы на моей странице опроса polls / admin_edit было динамически добавлено столько опций опроса, сколько необходимо.

Мне удалось это сделать с помощью встроенного в CakePHPфункциональность плюс немного Javascript.

При создании формы в представлении admin_edit я сначала вставил поля опроса и добавил, что добавлено:

<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в ОпросыКонтроллер.Если опрос уже имел связанные варианты опроса, они также включались в $this->data.Кроме того, если форма уже была отправлена ​​и были ошибки проверки, все необходимые поля PollOption были построены заново, когда страница отображалась, потому что они все еще находились в $this->data от контроллера.

Так что позаботились оубедившись, что у меня всегда были нужные мне поля в представлении.

Когда форма была отправлена, я попытался сохранить данные с помощью простого

$this->Poll->saveAll($this->data, array('atomic' => false, 'validate' => 'first'));

(Вы можете проверить CakePHP APIили документы, если вы не уверены в приведенном выше синтаксисе)

Я использовал 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);
});

Вы упомянули, что делали это самостоятельно, ноу вас не должно возникнуть проблем с этим, если вы не пытаетесь использовать компонент Security в форме.

Надеюсь, это поможет вам указать правильное направление или, возможно, даст вам некоторые идеи.

1 голос
/ 25 февраля 2014

в некоторых случаях это решение:

 var optionCount = $('#poll-options > div').size() + 1;

может переопределить ваши старые данные в сценарии, когда торт найдет существующий идентификатор (optionCount) в БД.если вы добавляете новые данные, то итерационный индекс должен генерироваться генератором uniq ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...