CakePHP - сохранить несколько данных HABTM с выпадающими в одной форме - PullRequest
0 голосов
/ 01 мая 2011

Когда пользователь добавляет событие, я хочу, чтобы он мог выбирать, какие группы будут играть на этом событии. У меня уже есть таблица событий и таблица Bands, каждая из которых связана с моделью HABTM с другой.

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

echo $this->Form->input('Band', array('multiple'=>false, 'empty'=>true));

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

echo $this->Form->input('Band', array('multiple'=>false, 'empty'=>true));
echo $this->Form->input('Band', array('multiple'=>false, 'empty'=>true));
echo $this->Form->input('Band', array('multiple'=>false, 'empty'=>true));

Он не сохраняет три строки в таблице HABTM band_events - он просто сохраняет одну. И когда я пытаюсь отредактировать событие, все три выпадающих списка по умолчанию выбирают одну из ранее выбранных полос, но не все (очевидно, не может, поскольку не сохраняет данные).

Любые мысли о том, как я могу иметь несколько раскрывающихся списков, чтобы добавить более одной группы к событию? Существует слишком много групп, чтобы иметь флажки - и я ненавижу поля множественного выбора - слишком сложно для большинства пользователей.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 02 мая 2011

Спасибо Тайлеру за то, что он направил меня в правильном направлении.

В итоге я заставил его работать со следующим кодом.

В контроллере не было ничего особенного, и он сохранил данные вТаблица соединений HABTM "band_events "с использованием обычного $ this-> Event-> save ($ this-> data) ... точно так же, как если бы я не использовал массив полос.

Если есть что-тов этом коде, который выключен, пожалуйста, дайте мне знать - я не гуру Cake, я просто настраивал код Tylers на 3+ часа, пока не получил синтаксис ... и т. д., который работал.

    $numBands = sizeof($this->data['Band']);
    if($numBands) {
        for($i=0; $i<$numBands; $i++) {
            echo $this->Form->input('Band.Band['.$i.']', 
                array('multiple'=>false, 'empty'=>true, 'options'=>$bands, 
                'value'=>$this->data['Band'][$i]['BandsEvent']['band_id']));
        }
    } else {
        echo $this->Form->input('Band.Band[0]', array('multiple'=>false,
            'empty'=>true, 'options'=>$bands));
    }
0 голосов
/ 01 мая 2011

Вам необходимо использовать разные атрибуты имени для каждого входа Band, а также правильно настроить структуру для сохранения отношения HABTM. Предполагая, что вы поместили список групп в $ band.

echo $this->Form->input('Band.Band.0', array('multiple'=>false, 'empty'=>true, 'options'=>$bands));
echo $this->Form->input('Band.Band.1', array('multiple'=>false, 'empty'=>true, 'options'=>$bands));
echo $this->Form->input('Band.Band.2', array('multiple'=>false, 'empty'=>true, 'options'=>$bands));

Это должно создать правильную структуру, когда пользователь отправляет форму в том, что $ this-> data [Band] [Band] является массивом идентификаторов каналов.

Когда вы загружаете существующее событие для редактирования, вам нужно перебрать полосы и явно установить значение по умолчанию:

foreach($this->data['Band']['Band'] as $index => $band_id) {
    echo $this->Form->input("Band.Band.$index", array('multiple'=>false, 'empty'=>true, 'options'=>$bands, 'value'=>$band_id)));
}
...