0

我正在与参与者一起使用自引用 HABTM 模型。您注册了一个活动,当您登录到您的预订/个人资料时,您会看到其他参与者的列表,您可以选择将自己和其他人添加到不同的组中;共享酒店房间,共享机场交通等。

到目前为止我所管理的:

1) 在我的个人资料中,我看到所有其他参与者的列表,带有复选框。到目前为止很棒。
2)添加另一个参与者工作正常。下次我编辑时,我添加的参与者显示为已选中。
3)删除另一个参与者也可以,只要您在提交之前仍然检查参与者!

再说一遍:

有3名参与者。我以其中之一的身份登录,我在参与者列表中看到另外 2 个人。我选择检查他们两个。这工作正常(总是)。后来我选择删除其中一个(通过取消选中复选框并点击提交)。这也可以正常工作(总是)。如果我想删除最后一个复选框......没有任何更新(总是!)。奇怪的是,我可以添加和删除任何奇怪的参与者组合,除非我选择一次性删除所有参与者(删除一个且唯一的参与者是“删除所有已检查的参与者”的特殊情况),否则它将始终有效。

据我所知,HABTM 的工作原理是首先删除所有关系,然后重新保存它们。当我一遍又一遍地删除、添加、删除、添加同一个参与者时,我可以在我的表格中看到 - HABTM 表格上的 id 总是在增加。但是,当我一次取消选择所有参与者时,关系不会更新。id 保持不变,所以就像保存从未发生过一样。

这种行为是如此具体和奇特,我觉得我在这里遗漏了一些明显的东西。无论如何,这是相关的代码:

模型

类参与者扩展 AppModel {
 var $hasAndBelongsToMany = 数组(
  '好友' => 数组(
   'className' => '参与者',
   'joinTable' => 'participants_participants',
   'foreignKey' => 'participant_id',
   'associationForeignKey' => 'buddy_id',
   '独特' => 真的,
  )
 );

控制器

功能编辑($id = null){
 if (!$id && empty($this->data)) {
  $this->Session->setFlash(__('Invalid Participant', true));
  $this->redirect(array('action'=>'index'));
 }
 if (!empty($this->data)) {
  if ($this->Participant->saveAll($this->data)) {
   $this->Session->setFlash(__('参与者已被保存', true));
   $this->redirect(array('action'=>'index'));
  } 别的 {
   $this->Session->setFlash(__('无法保存参与者。请重试。', true));
  }
 }
 如果(空($this->data)){
  $this->data = $this->Participant->read(null, $id);
 }

 // 获取除你自己以外的所有参与者
 $allParticipants = $this->Participant->find('list', array('conditions' => array('participant.id ' => $id)));

 // 获取所有将您添加到他们列表中的参与者
 $allBuddies = $this->Participant->ParticipantsParticipant->find('list', array(
  '条件' => 数组('buddy_id' => $id),
  'fields' => 'ParticipantsParticipant.participant_id',
  'order' => 'ParticipantsParticipant.participant_id ASC'
 ));

 $this->set(compact('allParticipants','allBuddies'));
}

看法

    echo $form->create('参与者');
    echo $associations->habtmCheckBoxes($allParticipants, $this->data['buddy'], 'buddy', 'div', '\'border: 1px solid #000;\'', '\'border: 1px solid #000;\'');
    echo $form->end('提交');

我正在使用稍微修改过的帮助程序 habtmCheckBoxes,可在此处找到:http ://cakeforge.org/snippet/detail.php?type=snippet&id=190 它的工作原理如下: function habtmCheckBoxes($rows=array(), $selectedArr =array(), $modelName, $wrapTag='p', $checkedDiv, $uncheckedDiv) {}

4

1 回答 1

0

这是因为 HABTM 在 CakePHP 中的工作方式 - 如果 HABTM 键存在于数组中,它只会保存 HABTM 数据。因此,当没有选中复选框时,没有数据通过并且蛋糕不会触及您现有的 habtm 记录。

一个快速的解决方法是向您的控制器添加几行代码。

if (!empty($this->data)) {
  if (empty($this->data['buddy'])) {
    $this->data['buddy'] = array('buddy' => array(''));
  }
  if ($this->Participant->saveAll($this->data)) {
   // ...
  } else {
   // ...
  }
}

但是,如果您也可以使用 cake 的表单助手(而不是您正在使用的其他助手)在您的视图中执行此操作:

echo $form->inputs(array(
    'legend' => 'Nominate your artwork for awards',
    'buddy' => array('label' => false, 'multiple' => 'checkbox', 'options' => $allBuddies)
));
于 2009-12-15T13:23:06.833 回答