CakePHP - 以相同的形式保存多个HABTM数据w /下拉列表

时间:2011-05-01 01:15:05

标签: forms cakephp cakephp-1.3 has-and-belongs-to-many

当用户添加一个事件时,我希望他们能够选择在该事件中正在播放哪个频段。我已经拥有了我的事件表和我的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));

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

有关如何为活动添加多个下拉菜单的多个下拉菜单的任何想法?有太多的乐队有复选框 - 我讨厌多选框 - 对大多数用户来说太难了。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

您需要为每个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]是一个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)));
}

答案 1 :(得分:0)

感谢Tyler引导我走向正确的方向。

我最终让它使用以下代码。

控制器没有任何特殊之处,并使用正常的$ this->事件 - >保存($ this->数据)将数据保存在HABTM连接表“bands_events”中...就像我没有使用一系列乐队。

如果此代码中的某些内容已关闭,请告诉我 - 我不是蛋糕大师,我只是将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));
    }