cakePHP дополнительная проверка для загрузки файла - PullRequest
3 голосов
/ 30 июня 2010

Как сделать загрузку файлов необязательной с проверкой?Код ниже проверяет, даже если я не выбрал файл.Я хочу проверить расширение, только если я выбрал файл.Если я не выбираю какой-либо файл, он не должен возвращать никакой ошибки проверки.

Ответы [ 2 ]

2 голосов
/ 30 июня 2010

"Я назначаю $ this-> data ['Catalog'] ['image'] = $ this-> data ['Catalog'] ['imageupload'] ['name'];"

Таким образом, к моменту сохранения массива данных он выглядит примерно так:

array(
    'image' => 'foobar',
    'imageupload' => array(
        'name' => 'foobar',
        'size' => 1234567,
        'error' => 0,
        ...
     )
)

Что означает, что правило проверки imageupload пытается работать с этими данными:

array(
    'name' => 'foobar',
    'size' => 1234567,
    'error' => 0,
    ...
 )

Т.е. значение, которое он пытается проверить, является массивом вещей, а не просто строкой.И это вряд ли пройдет указанное правило проверки.Это также, вероятно, никогда не будет «пустым».

Либо вы создаете пользовательское правило проверки, которое может обрабатывать этот массив, либо вам нужно выполнить дополнительную обработку в контроллере, прежде чем пытаться проверить его.

1 голос
/ 11 октября 2014

Концепция:

В контроллере перед проверкой или сохранением (который по умолчанию выполняет проверку автоматически) проверяется, загружен ли какой-либо файл.Если не загружен, то сбросьте валидатор для поля файла.

Пример кода:

Контроллер

// is any image uploaded?
$isNoFileUploaded = ($this->request->data['Model']['field_name']['error'] == UPLOAD_ERR_NO_FILE) ? true : false ;
if ($isNoFileUploaded) {
    $this->Model->validator()->remove('field_name');
}

Примечания:

Это решение подвергается предварительной обработке в качестве одного из двух альтернативных подходов (предварительная обработка в контроллере, пользовательская проверка в модели), предложенных @ deceze's answer

...