Forms CakePHP-以相同形式保存多个HABTM数据和下拉列表

Forms CakePHP-以相同形式保存多个HABTM数据和下拉列表,forms,cakephp,cakephp-1.3,has-and-belongs-to-many,Forms,Cakephp,Cakephp 1.3,Has And Belongs To Many,当用户添加活动时,我希望他们能够选择在该活动中播放的乐队。我已经有了我的Events表和Bands表,每个表都与HABTM模型相互关联 在我的“添加事件”页面上,我有一个下拉列表显示乐队,所以他们可以选择一个 echo $this->Form->input('Band', array('multiple'=>false, 'empty'=>true)); 我想有一个“添加另一个乐队”按钮,点击后,它会添加另一个下拉列表。我想我已经知道如何做动态场添加的事情了——但是——

当用户添加活动时,我希望他们能够选择在该活动中播放的乐队。我已经有了我的Events表和Bands表,每个表都与HABTM模型相互关联

在我的“添加事件”页面上,我有一个下拉列表显示乐队,所以他们可以选择一个

echo $this->Form->input('Band', array('multiple'=>false, 'empty'=>true));
我想有一个“添加另一个乐队”按钮,点击后,它会添加另一个下拉列表。我想我已经知道如何做动态场添加的事情了——但是——即使我这样尝试:(只是想看看我是否能让它工作)

它不会在bands_events HABTM表中保存三行,只保存一行。当我试图编辑事件时,所有三个选择下拉菜单默认选择以前选择的一个波段,但不是全部(显然不能,因为它没有保存数据)

有没有想过如何通过多个下拉菜单将多个乐队添加到一个活动中?有太多的乐队有复选框-我讨厌多选择框-对大多数用户来说太难了


非常感谢您的帮助。

您需要为每个波段输入使用不同的名称属性,并正确设置结构以保存HABTM关系。假设您已将乐队列表推到$bands中

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]是一个Band id数组的情况下提交表单时,应该会生成正确的结构

加载现有事件以进行编辑时,需要遍历标注栏并显式设置默认值:

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)));
}

多亏泰勒把我引向正确的方向

我最终让它使用以下代码

控制器没有什么特别的功能,通过使用普通的$this->Event->save($this->data)将数据保存在HABTM连接表“bands\u events”中。。。就像我没有使用一系列乐队一样

如果这段代码有什么问题,请让我知道-我不是蛋糕大师,我只是调整了泰勒代码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));
    }
$numBands=sizeof($this->data['Band']);
如果($numBands){
对于($i=0;$iForm->input('Band.Band['.$i.]'),
数组('multiple'=>false,'empty'=>true,'options'=>$bands,
'value'=>$this->data['Band'][$i]['BandsEvent']['Band_id']);
}
}否则{
echo$this->Form->input('Band.Band[0]),array('multiple'=>false,
“空”=>true,“选项”=>$bands));
}

我不确定您所说的“正确设置结构以保存HABTM关系”是什么意思。我在模型中正确设置了HABTM,并尝试将输入更改为该值,但现在它没有保存任何内容。有什么想法吗?
    $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));
    }