У меня есть поле 'снимок экрана', которое, когда я пытаюсь получить доступ к beforeSave , вызывает его пустое поле.
Что я делаю, так это доступ к данным $ на beforeMarshal обратный вызов и сохранение массива в настройках модели, затем я могу получить к нему доступ в поле beforeSave и установить для поля «screenshot» значение filename.ext, если move_uploaded_file равно true.
Thisэто текущий код:
Модель
// Using CakePHP 3.8.5
public function validationDefault(Validator $validator)
{
$validator
->allowEmptyFile('screenshot', 'update')
->uploadedFile('screenshot' , [
'types' => ['image/jpeg', 'image/jpg', 'image/pjpeg'],
'maxSize' => 1000000 // 1MB
]);
return $validator;
}
public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options)
{
if (isset($data['screenshot']) && $data['screenshot']['error'] === UPLOAD_ERR_OK) {
$this->config([ 'file_array' => $data['screenshot'] ])
}
}
public function beforeSave(Event $event, EntityInterface $entity, ArrayObject $options)
{
...
$file = $this->config([ 'file_array');
if (move_uploaded_file($file['tmp_name'], $file_path)) {
return true;
} else {
throw new Exception(__('Unable to move...'));
}
}
Форма
<?= $this->Form->create($project, ['type' => 'file']) ?>
<?= $this->Form->control('screenshot', ['type' => 'file', 'class' => 'form-control-file']) ?>
<?= $this->Form->button(__('Submit'), ['class' => 'btn btn-primary col-md-3 offset-md-9']) ?>
<?= $this->Form->end() ?>
Код, который я ожидална работу
public function validationDefault(Validator $validator)
{
$validator
->allowEmptyFile('screenshot', 'update')
->uploadedFile('screenshot' , [
'types' => ['image/jpeg', 'image/jpg', 'image/pjpeg'],
'maxSize' => 1000000 // 1MB
]);
return $validator;
}
public function beforeSave(Event $event, EntityInterface $entity, ArrayObject $options)
{
...
$file = $entity->screenshot; // this is empty
if (move_uploaded_file($file['tmp_name'], $file_path)) {
return true;
} else {
throw new Exception(__('Unable to move...'));
}
}
Почему $ entity-> screenshot пусто в BeforeSave?
Это правильный способ сделать это?