Question

J'utilise un modèle de référencement HABTM auto avec les participants. Vous vous inscrivez à un événement et lorsque vous vous connectez à votre réservation / profil que vous voyez une liste d'autres participants et vous pouvez choisir de vous ajouter et d'autres dans divers groupes; part chambre d'hôtel, le transport part de l'aéroport, etc.

Ce que j'ai réussi à ce jour:

1) Dans mon profil, je vois la liste de tous les autres participants avec des cases à cocher. Grand jusqu'à présent.
2) Ajout d'un autre participant fonctionne très bien. La prochaine fois que je modifier, le participant, j'ai ajouté est affiché comme cochée.
3) Suppression d'un autre participant fonctionne bien aussi aussi longtemps que vous avez encore vérifié les participants avant de soumettre!

Encore une fois, avec les mots:

Il y a 3 participants. Je suis connecté en tant que l'un d'entre eux, et je vois les 2 autres personnes sur la liste des participants. Je choisis de vérifier tous les deux. Cela fonctionne très bien (toujours). Plus tard, je choisis de supprimer l'un d'entre eux (en décochant la case à cocher et frapper soumettre). Cela fonctionne aussi bien (toujours). Si je veux supprimer la dernière case ... rien est mis à jour (toujours!). Ce qui est curieux est que je peux ajouter et supprimer toute combinaison étrange de participants et il sera toujours travailler si je choisis de supprimer tous les participants en une seule fois (la suppression d'un seul et unique participant est un cas particulier de « supprimer tous les bagages participants »).

Pour autant que je sache, HABTMs travail d'abord la suppression de toutes les relations, puis re-sauver eux. Je peux voir que dans mes tableaux quand je supprimer, ajouter, supprimer, ajouter encore et encore le même participant - l'id sur la table HABTM augmente toujours. Quand je désélectionner tous les participants à la fois, cependant, les relations sont pas mis à jour. Les ids restent les mêmes, il est donc comme la sauvegarde n'a jamais eu lieu.

Ce comportement est si spécifique et particulier, j'ai le sentiment que je suis absent ici quelque chose d'évident. Quoi qu'il en soit, voici le code correspondant:

Modèle

class Participant extends AppModel {
 var $hasAndBelongsToMany = array(
  'buddy' => array(
   'className' => 'Participant',
   'joinTable' => 'participants_participants',
   'foreignKey' => 'participant_id',
   'associationForeignKey' => 'buddy_id',
   'unique' => true,
  )
 );

Contrôleur

function 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(__('The Participant has been saved', true));
   $this->redirect(array('action'=>'index'));
  } else {
   $this->Session->setFlash(__('The Participant could not be saved. Please, try again.', true));
  }
 }
 if (empty($this->data)) {
  $this->data = $this->Participant->read(null, $id);
 }

 // Fetching all participants except yourself
 $allParticipants = $this->Participant->find('list', array('conditions' => array('participant.id ' => $id)));

 // Fetching every participant that has added you to their list
 $allBuddies = $this->Participant->ParticipantsParticipant->find('list', array(
  'conditions' => array('buddy_id' => $id),
  'fields' => 'ParticipantsParticipant.participant_id',
  'order' => 'ParticipantsParticipant.participant_id ASC'
 ));

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

Voir

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

J'utilise une aide légèrement modifiée, habtmCheckBoxes, a trouvé ici: http : //cakeforge.org/snippet/detail.php type = snippet & id = 190 Il fonctionne comme ceci: habtmCheckBoxes fonction ($ rows = array (), selectedArr $ = array (), $ modelName, $ wrapTag = 'p', checkedDiv $, uncheckedDiv $) {}

Était-ce utile?

La solution

Cela se produit à cause de la façon HABTM fonctionne au sein CakePHP - il enregistre uniquement les données HABTM si la clé HABTM existe dans le tableau. Par conséquent, lorsqu'aucun cases sont cochées, il n'y a pas de données traversèrent et le gâteau ne touche pas vos dossiers HABTM existants.

Une solution rapide serait d'ajouter quelques lignes de code à votre contrôleur.

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

Cependant, si pourrait également être possible pour vous d'utiliser assistant formulaire de gâteau (au lieu de l'aide que vous utilisez) pour ce faire à votre avis:

echo $form->inputs(array(
    'legend' => 'Nominate your artwork for awards',
    'buddy' => array('label' => false, 'multiple' => 'checkbox', 'options' => $allBuddies)
));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top