Я использую самонаводящуюся модель HABTM с участниками. Вы регистрируетесь на мероприятие, и когда вы входите в свою бронь/анкету, вы видите список других участников, и вы можете добавить себя и других в различные группы; номер отеля доля, доля транспорта из аэропорта и т.д.Редактирование самостоятельной ссылки HABTM в работе cakephp, иногда
Что мне удалось до сих пор:
1) В моем профиле я вижу список всех остальных участников с флажками. Отлично.
2) Добавление другого участника отлично работает. В следующий раз, когда я отредактирую, участник, которого я добавил, отображается как отмеченный.
3) Удаление другого участника также прекращается, пока вы все еще проверили участников перед отправкой!
Опять же, со словами:
Есть 3 участника. Я зарегистрировался как один из них, и я вижу двух других участников списка участников. Я решил проверить их оба. Это прекрасно работает (всегда). Позже я решил удалить один из них (сняв флажок и нажав submit). Это также отлично работает (всегда). Если я хочу удалить последний флажок ... ничего не обновляется (всегда!). Любопытно, что я могу добавлять и удалять любую странную комбинацию участников, и она всегда будет работать, ЕСЛИ я не буду удалять всех участников за один раз (удаление одного и единственного участника - это особый случай «удалить всех участников»).
Насколько я знаю, HABTM работают, сначала удаляя все отношения, а затем повторно сохраняя их. Я вижу, что в моих таблицах, когда я удаляю, добавляю, удаляю, добавляю одного и того же участника снова и снова - идентификатор в таблице HABTM всегда увеличивается. Однако, когда я отменяю выделение всех участников одновременно, отношения - это , а не. Иды остаются неизменными, так что это похоже на то, что спасение никогда не происходило.
Такое поведение настолько специфично и своеобразно, что у меня такое чувство, что я не вижу здесь ничего очевидного. Во всяком случае, здесь соответствующий код:
Модель
class Participant extends AppModel { var $hasAndBelongsToMany = array( 'buddy' => array( 'className' => 'Participant', 'joinTable' => 'participants_participants', 'foreignKey' => 'participant_id', 'associationForeignKey' => 'buddy_id', 'unique' => true, ) );
Контроллер
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')); }
Посмотреть
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');
Я использую слегка модифицированную помощника, habtmCheckBoxes, найти здесь: http://cakeforge.org/snippet/detail.php?type=snippet&id=190 Он работает следующим образом: function habtmCheckBoxes ($ rows = ar ray(), $ selectedArr = array(), $ modelName, $ wrapTag = 'p', $ checkedDiv, $ uncheckedDiv) {}
Да!Я где-то читал «установить id на NULL» при работе с habtm, но я никогда не понимал, как это работает. Угадай, вот что ты сделал сейчас. Большое спасибо! – 2009-12-15 15:29:06