未选择HABTM下拉项目

时间:2013-02-03 00:26:55

标签: cakephp

我创建了一个有趣的网站来学习CakePHP,但出于某种原因,我无法获得一个多选下拉框来显示我选择的项目。在这个例子中,1视频游戏可能有多个困难(简单,正常,困难)。在我的游戏编辑页面上,我有一个多选框来挑选困难。它显示了所有三个困难,我可以选择它们并正确保存。但是,当我返回编辑页面时,我之前保存的项目不会突出显示为已选中。我已经验证了记录在数据库中正确保存。

表: 游戏 困难 difficulties_games

型号:

class Game extends AppModel {
public $actsAs = array('Containable');
public $hasAndBelongsToMany = array(
    'Difficulty' =>
        array(
            'className' => 'Difficulty',
            'joinTable' => 'difficulties_games',
            'foreignKey' => 'game_id',
            'associationForeignKey' => 'difficulty_id',
            'unique' => 'true'
            )
);
}
class Difficulty extends AppModel {
public $actsAs = array('Containable');
public $hasAndBelongsToMany = array(
    'Game' =>
        array(
            'className' => 'Game',
            'joinTable' => 'difficulties_games',
            'foreignKey' => 'difficulty_id',
            'associationForeignKey' => 'game_id',
            'unique' => 'true'
            )
);
}

控制器:

$game = $this->Game->findById($id);
$this->set('difficulties', $this->Game->Difficulty->find('list'));

查看(edit.ctp):

echo $this->Form->input('Difficulty');

这一定是我想念的简单但我已经阅读了关于HABTM的书并在这里搜索过,在多选框上找不到多少。

更新:

以下是控制器中的整个编辑功能:

public function edit($id = null) {
    if (!$id) {
        throw new NotFoundException(__('Invalid post'));
    }

    $game = $this->Game->findById($id);
    if (!$game) {
        throw new NotFoundException(__('Invalid post'));
    }
    if ($this->request->is('post') || $this->request->is('put')) {
        $this->Game->id = $id;
        if ($this->Game->saveAll($this->request->data)) {
            $this->Session->setFlash('Your game has been updated.');
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash($this->Game->invalidFields());
        }
    }

    if (!$this->request->data) {
        $this->request->data = $game;
    }
    $this->set('systems', $this->Game->System->find('list'));
    $this->set('genres', $this->Game->Genre->find('list'));
    $this->set('difficulties', $this->Game->Difficulty->find('list'));


}

此处还有一些关于视图的内容:

echo $this->Form->create('Game');
echo $this->Form->input('name');
echo $this->Form->input('system_id');
echo $this->Form->input('genre_id');
echo $this->Form->input('Difficulty');
echo $this->Form->input('id', array('type' => 'hidden'));
echo $this->Form->end('Save Game');

2 个答案:

答案 0 :(得分:8)

您使用的CakePHP版本是什么?版本2.2.6和2.3.0有一个与显示已选择的现有habtm相关的错误。因此,如果使用2.2.6或使用2.3.0,则更新为2.2.7,使用github的master分支,直到下一个bugfix发布完成。

答案 1 :(得分:1)

对于因性能原因在其AppModel中设置public $recursive = -1;的所有人,或者更改其控制器中的递归: 自动化不会在没有递归1的情况下工作!在检索数据以进行编辑时,请确保在选项中更改它。

$options = array(
    'recursive' => 1,
    'conditions' => array('YourModel.' . $this->YourModel->primaryKey => $id)
);
$this->request->data = $this->YourModel->find('first', $options);