Мне помогли решить, как удалить файлы, загруженные с помощью пакета загрузки Cakephp. Однако, похоже, есть проблема с тем, как я обновляю значения полей photo и dir. Используя unlink, я смог полностью удалить файлы, но, похоже, возникает проблема, когда я пытаюсь установить значения равными нулю. Я сделал функцию, чтобы проверить это:
public function deletePhoto2($id)
{
// $this->request->allowMethod(['post']);
if ($this->request->is(['patch', 'post', 'put'])) {
$brigada = $this->Brigadas
->findById($id)
->firstOrFail();
$brigada->dir = null;
$brigada->photo = null;
if ($this->Brigadas->save($brigada)) {
$this->Flash->success(__('Your team data has been saved.'));
return $this->redirect(['action' => 'edit', $brigada->id]);
}
$this->set('brigada', $brigada);
}
}
Перед сохранением я обнаружил, что значения $brigada->photo и $brigada->dir равны нулю, но значения не сохраняются. У меня есть несколько возможностей, которые я хочу изучить, но мои знания PHP мешают:
$this->Brigadas->deleteCallback() или чем-то подобным, но я хотел бы сначала понять пример, поэтому я и спрашиваю. Я не нашел использования этих обратных вызовов ни в одном примере в Интернете, и документация по событиям для меня все еще немного эзотерична.Вот как BrigadasTable.php настраивается для загрузки файлов:
// http://josediazgonzalez.com/2015/12/05/uploading-files-and-images/
$this->addBehavior('Josegonzalez/Upload.Upload', [
'photo' => [
'fields' => [
'dir' => 'dir',
'size' => 'photo_size', // defaults to `size`
'type' => 'photo_type', // defaults to `type`
],
'nameCallback' => function ($table, $entity, $data, $field, $settings) {
if ($entity->gvCode){
$array = explode(".", $data['name']);
return strtolower($entity->gvCode) . '_' . date("Ymd-hisa") . '.jpg';
} else{
$array = explode(".", $data['name']);
$newArray = array_pop($array);
return strtolower(join('_', $array)) . '_' . date("Ymd-hisa") . '.jpg';
}
},
'transformer' => function ($table, $entity, $data, $field, $settings) {
$extension = pathinfo($data['name'], PATHINFO_EXTENSION);
// Store the thumbnail in a temporary file
$tmp = tempnam(sys_get_temp_dir(), 'upload') . '.' . $extension;
// Use the Imagine library to DO THE THING
$size = new \Imagine\Image\Box(640, 640);
$mode = \Imagine\Image\ImageInterface::THUMBNAIL_INSET;
$imagine = new \Imagine\Gd\Imagine();
// Save that modified file to our temp file
$imagine->open($data['tmp_name'])
->thumbnail($size, $mode)
->save($tmp);
$filenameTmp = explode('.', $data['name']);
array_pop($filenameTmp);
$filenameTmp = join('_', $filenameTmp) . '.jpg';
// return debug($filenameTmp);
// Now return the original *and* the thumbnail
return [
$data['tmp_name'] => $filenameTmp,
$tmp => 'thumbnail-' . $filenameTmp,
];
},
'deleteCallback' => function ($path, $entity, $field, $settings) {
// When deleting the entity, both the original and the thumbnail will be removed
// when keepFilesOnDelete is set to false
$entity->{$field} = null;
return [
$path . $entity->{$field},
$path . 'thumbnail-' . $entity->{$field}
];
},
'keepFilesOnDelete' => false
]
]);
Спасибо!
Прошу прощения, что не ответил раньше, @GregSchmidt. Это сказал, что это сохранено (я бы отладил, вернулся ли функция успешно). Это просто не обновило ничего вообще. Я думаю, что я все правильно собирал, так как он редактировал вызов перед сохранением, но сразу после сохранения ничего не возвращал. Мне любопытна причина этого.
Не уверен, что вы подразумеваете под «он отредактировал вызов перед сохранением, но сразу после сохранения ничего не вернул», поэтому я не могу комментировать, что могло пойти не так.
Извините, позвольте мне попробовать еще раз. Когда я отлаживаю до if ($this->Brigadas->save($brigada)), я получаю dir и photo как нуль, но не после функции сохранения.
О, может быть, поведение загрузки настраивает их даже в этом случае? Попробуйте удалить поведение из модели перед сохранением в этом экземпляре.






Вы можете запустить запрос на обновление напрямую, вместо того, чтобы извлекать запись, задавать значения и сохранять ее.
$query = $this->Brigadas->query();
$query->update()
->set([
'dir' => null,
'photo' => null,
])
->where(<condition>)
->execute();
Если какой-либо из ваших столбцов json,
$query = $this->Brigadas->query();
$query->update()
->set([
'dir = null',
'photo' => null,
])
->where(<condition>)
->execute();
Это работает! Я так счастлив, большое спасибо! Должен ли я поместить свой unlink в другую функцию в контроллере или есть способ сделать это без извлечения записи? Что вы порекомендуете?
@E.Velis Сначала запустить unlink, а затем обновить базу данных, кажется, имеет больше смысла.
Там написано, что спасло, а на самом деле нет? Или сохранение не работает?