#cakephp #cakephp-3.0
#cakephp #cakephp-3.0
Вопрос:
В шаблоне редактирования я создал 2 формы. Первая форма для редактирования записи из ‘Table1’ и вторая форма для добавления записи в связанную таблицу ‘Table2’ (принадлежит). Я не хочу редактировать связанную запись, но добавляю новую в Table2 и меняю ключ привязки записи с ‘Table1’.
В контроллере я использую patchEntity(), но таким образом редактируется исходная связанная запись в ‘Table2’.
Код для второй формы выглядит следующим образом.
<?= $this->Form->create($machine, ['url' => ['action' => 'edit_foto']]);?>
<?= $this->Form->controls([
'id' => ['type' => 'hidden'],
'foto.omschrijving' => [
'type' => 'text',
'label' => __('naam van de machine'),
'value' => $result->type_machine
], []);?>
<?= $this->Form->button(__('save'), ['type' => 'submit']); ?>
<?= $this->Form->end(); ?>
В контроллере для ‘Table1’ я использую что-то вроде этого.
public function editFoto($id) {
$data = $this->getRequest()->getData();
$machine = $this->Machines->get($id, [
'contain' => [
'Foto'
]
]);
if ($this->request->is([
'patch',
'post',
'put'
])) {
$machine = $this->Machines->patchEntity($machine, $data);
if ($this->Machines->save($machine)) {
$this->Flash->success(__('Machine {naam} has been saved.', [
'naam' => $machine['naam']
]));
return $this->redirect(['action' => 'edit', $id]);
}
}
}
Как я могу запретить контроллеру редактировать исходную запись и вместо этого принудительно добавить новую запись в ‘Table2’ и изменить ключ привязки в ‘Table1’?
Помощь очень ценится.
добавлена информация: данные, отправляемые формой, выглядят следующим образом:
[
'id' => '87',
'foto' => [
'omschrijving' => 'WAKER 135 - ter - testje',
'foto' => [
'tmp_name' => 'C:xampptmpphp6CFD.tmp',
'error' => (int) 0,
'name' => 'MAKITA DTD153RTJ accuschroevendraaier.jpg',
'type' => 'image/jpeg',
'size' => (int) 188971
],
'dir_id' => '5c9dd428cc4ef'
]
]
Ответ №1:
Вместо
$machine = $this->Machines->patchEntity($machine, $data);
$this->Machines->save($machine);
вы должны использовать
$machine = $this->Machines->newEntity($data, [
'associated' => ['Fotos']
]);
$this->Machines->save($machine);
чтобы сохранить данные. Если связи между Table1
и Table2
верны в моделях, это также обновит ключи привязки.
Убедитесь, что формат идентификаторов в FormHelper правильный. Смотрите документы, как обрабатывать сохранение с помощью ассоциаций. Вы можете увидеть это в $data
. При отправке формы $data
должна быть в следующем формате:
$data = [
'id' => '...',
'foto' => [
// ... model data
],
];
Комментарии:
1. Затем я получаю сообщение об ошибке: «Аргумент 1, переданный Cake ORM Marshaller::one(), должен иметь тип array, object given, вызываемый в C:xampphtdocsmyKMGvendorcakephpcakephpsrcORMTable.php в строке 2631 и определено [COREsrcORMMarshaller.php, строка 168]»
2. Я обновил свой ответ. Может быть, вы использовали
$machine
вместо$data
в качестве параметра?3. Tanx, $data сохраняется как новая запись, но binding_key не изменился. Вот мой код в модели: «$this-> belongsTo(‘Foto’, [ ‘className’ => ‘Fotos’, ForeignKey’ => ‘foto_id’ ]);», если это может вам помочь.
4. Я обновил свой ответ. Вы можете использовать
associated
параметр при создании объекта. Кроме того, пожалуйста, проверьте формат$data
. Методsave()
автоматически обработает ассоциации, если формат правильный.5. С соответствующим параметром или без него выполняется то же самое. Когда я отлаживаю оба сохраненных значения
$machines->foto->id
и$machines->foto_id
, я получаю правильное новое значение. Похоже, что данные в перенаправленном действии не обновляются. После успешного сохранения она должна перенаправить на основную form1 (действие = редактировать) и перезагрузить измененную запись (компьютер) с новой фотографией, не так ли?