0

参加者との自己参照HABTMモデルを使用しています。イベントにサインアップすると、予約/プロファイルにログインすると、他の参加者のリストが表示され、自分や他の人をさまざまなグループに追加することを選択できます。ホテルの部屋を共有したり、空港からの交通手段を共有したりします。

私がこれまでに管理したこと:

1)プロファイルに、チェックボックスが付いた他のすべての参加者のリストが表示されます。これまでのところ素晴らしい。
2)別の参加者を追加すると正常に機能します。次に編集すると、追加した参加者がチェック済みとして表示されます。
3)送信する前に参加者を確認している限り、別の参加者を削除しても問題ありません。

繰り返しますが、言葉で:

参加者は3名です。私はそのうちの1人としてログインしており、参加者リストに他の2人が表示されています。私はそれらの両方をチェックすることにしました。これは(常に)正常に機能します。後で私はそれらの1つを削除することを選択します(チェックボックスをオフにして送信を押すことによって)。これも(常に)正常に機能します。最後のチェックボックスを削除したい場合...何も更新されません(常に!)。不思議なことに、参加者の奇妙な組み合わせを追加および削除でき、一度にすべての参加者を削除することを選択しない限り、常に機能します(唯一の参加者を削除することは、「チェックされたすべての参加者を削除する」という特殊なケースです)。

私の知る限り、HABTMは、最初にすべてのリレーションを削除してから、それらを再保存することで機能します。同じ参加者を何度も削除、追加、削除、追加すると、テーブルでHABTMテーブルのIDが常に増加していることがわかります。ただし、一度にすべての参加者の選択を解除すると、関係が更新されません。IDは同じままなので、保存が行われなかったようです。

この振る舞いは非常に特殊で独特であり、ここで明らかな何かが欠けているような気がします。とにかく、関連するコードは次のとおりです。

モデル

クラス参加者はAppModelを拡張します{
 var $ hasAndBelongsToMany = array(
  'buddy' => array(
   'className' =>'参加者'、
   'joinTable' =>'participants_participants'、
   'foreignKey' =>'participant_id'、
   'associationForeignKey' =>'buddy_id'、
   'unique' => true、
  )。
 );

コントローラ

関数edit($ 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));
  }
 }
 if(empty($ 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(
  '条件'=>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('Submit');

ここにあるわずかに変更されたヘルパー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データを保存します。したがって、チェックボックスがチェックされていない場合、データは渡されず、cakeは既存のhabtmレコードに影響を与えません。

簡単な修正は、コントローラーに数行のコードを追加することです。

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

ただし、(使用している他のヘルパーの代わりに)ケーキのフォームヘルパーを使用して、ビューでこれを行うことも可能である場合は、次のようにします。

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