Что не работает
Вкл. Форма обновления , если я изменяю значения флажков, эти значения habtm не сохраняются в базе данных .
Хотя в форме создания и обновления я использую тот же метод: $this->Employee->save($this->data)
, который должен автоматически обрабатывать данные HABTM.
Что работает
Я успешно настроил модель HABTM, следуя этому учебному пособию : Сотрудники имеют языки AndBelongsToMany (т. Е. Чтобы указать, какой сотрудник говорит на каком языке).
Я могу создать отношения : при создании нового сотрудникас помощью формы создания проверьте все языки, которые знает сотрудник, и он успешно сохранит в базу данных: сотрудник перейдет к employee таблица базы данных, язык к language и отношения перейдут к employee_language table.
В форме редактирования я вижу, какие чекбоксы я проверил при создании сотрудника.
В чем я (вероятно) был признан виновным
При оценке, что дапри создании и обновлении сотрудника происходит переход к базе данных. Я обнаружил, что структура переменных $this->data
отличается.
При создании формы (проверьте 2 языка):

"$this->data" Array [2]
Employee Array [6]
name_lv John Doe
position_lv Computer administrator
enabled 0
Language Array [1]
Language Array [2]
0 1
1 5
В форме обновления (отмечен дополнительный язык, поэтому 3 языка):

"$this->data" Array [1]
Employee Array [8]
name_lv John Doe
position_lv Computer administrator
Language Array [3]
0 1
1 5
2 4
enabled 0
id 68
Обратите внимание, что теперь языки доступны в $this->data["Employee"]["Language"]
, не так, как всоздание $this->data["Language"]
Обходной путь
Если я сделаю $this->data["Language"] = $this->data["Employee"]["Language"];
, то значения будут сохранены (ууу), за исключением того, что в HABTM-таблице employee_language присутствуют повторяющиеся записи (о нет).
Итак, какой переключатель я переключаю, чтобы сделать мои флажки обновляемыми?
Подробнее (если хотите)
(модель) employee.php
class Employee extends AppModel {
var $name = "Employee";
var $hasAndBelongsToMany = array (
"Language" =>
array(
"className" => "Language",
"conditions" => array(
"Language.enabled" => "1"
)
)
);
...
}
(модель) language.php:
class Language extends AppModel {
var $name = "Language";
...
}
(просмотр) admin_create.ctp (это форма создания.Этот фрагмент отображает флажки для всех доступных языков):
...
<?php
echo $form->input('Language',array(
'label' => 'Speaks in languages:',
'type' => 'select',
'multiple' => 'checkbox',
'options' => $languages
)); ?>
...
(просмотр) admin_update.ctp (я вижу, какие языки я проверял при создании сотрудника):
...
<?php
echo $form->input('Language',array(
'label' => 'Speaks in languages:',
'type' => 'select',
'multiple' => 'checkbox',
'options' => $languages,
'selected' => $html->value('Employee.Language')
)); ?>
...