2009-12-13 5 views
0

Я использую самонаводящуюся модель 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) {}

ответ

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 { 
    // ... 
    } 
} 

Однако, если может быть также возможно использовать форму помощника торт (вместо другого помощника, который вы используете), чтобы сделать это на ваш взгляд:

echo $form->inputs(array(
    'legend' => 'Nominate your artwork for awards', 
    'buddy' => array('label' => false, 'multiple' => 'checkbox', 'options' => $allBuddies) 
)); 
+0

Да!Я где-то читал «установить id на NULL» при работе с habtm, но я никогда не понимал, как это работает. Угадай, вот что ты сделал сейчас. Большое спасибо! – 2009-12-15 15:29:06