У меня есть форма, позволяющая загрузить файл, и я использую проверку данных, чтобы проверить, какой тип файла он есть, и все это хорошо. То, что я хочу сделать, – это разрешить им редактировать эту же запись, но загрузка файла в это время не требуется.
Мое правило проверки выглядит следующим образом:
'header_pic' => array( 'extension' => array( 'rule' => array('extension', array('jpeg', 'jpg', 'gif', 'png')), 'message' => 'You must supply a GIF, PNG, or JPG file.', ) )
Но для этого правила требуется файл. Я нашел параметр «on», и я мог бы добавить его к этому правилу, но тогда он будет проверять только файлы при создании. Не на редактирование.
Я пробовал это, но это не сработало:
'header_pic' => array( 'extension' => array( 'rule' => array('extension', array('jpeg', 'jpg', 'gif', 'png')), 'required' => false, 'allowEmpty' => true, 'message' => 'You must supply a GIF, PNG, or JPG file.', ), 'notEmpty' => array( 'rule' => array( 'notEmpty'), 'on' => 'create', 'message' => 'You must supply a file.', ), )
Что мне не хватает? (Заранее спасибо!!)
var $validate = array( 'imageupload' => array( 'checksizeedit' => array( 'rule' => array('checkSize',false), 'message' => 'Invalid File size', 'on' => 'update' ), 'checktypeedit' =>array( 'rule' => array('checkType',false), 'message' => 'Invalid File type', 'on' => 'update' ), 'checkuploadedit' =>array( 'rule' => array('checkUpload', false), 'message' => 'Invalid file', 'on' => 'update' ), 'checksize' => array( 'rule' => array('checkSize',true), 'message' => 'Invalid File size', 'on' => 'create' ), 'checktype' =>array( 'rule' => array('checkType',true), 'message' => 'Invalid File type', 'on' => 'create' ), 'checkupload' =>array( 'rule' => array('checkUpload', true), 'message' => 'Invalid file', 'on' => 'create' ), ) ); function checkUpload($data, $required = false){ $data = array_shift($data); if(!$required && $data['error'] == 4){ return true; } //debug($data); if($required && $data['error'] !== 0){ return false; } if($data['size'] == 0){ return false; } return true; //if($required and $data) } function checkType($data, $required = false,$allowedMime = null){ $data = array_shift($data); if(!$required && $data['error'] == 4){ return true; } if(empty($allowedMime)){ $allowedMime = array('image/gif','image/jpeg','image/pjpeg','image/png'); } if(!in_array($data['type'], $allowedMime)){ return false; } return true; } function checkSize($data, $required = false){ $data = array_shift($data); if(!$required && $data['error'] == 4){ return true; } if($data['size'] == 0||$data['size']/1024 > 2050){ return false; } return true; }
Я использовал это для того же самого, и я успешно попробовал. И сделайте изменения, если вам нужно. все лучшее
Я понял. (Спасибо omabena и RSK за их предложения.) Я понял, что я могу просто настроить два правила проверки и использовать их для добавления и один для создания. Работает довольно чисто.
'header_pic' => array( 'extension' => array( 'rule' => array('extension', array('jpeg', 'jpg', 'gif', 'png')), 'message' => 'You must supply a GIF, PNG, or JPG file.', 'required' => false, 'on' => 'add' ), 'extension2' => array( 'rule' => array('extension', array('jpeg', 'jpg', 'gif', 'png')), 'message' => 'You must supply a GIF, PNG, or JPG file.', 'required' => true, 'on' => 'create' ), )
у меня была такая же проблема, мое решение это не очень хорошо, но это сработало для меня, что я сделал, чтобы позволитьEmpty => true. и в функции редактирования на контроллере я передал данные этого изображения в массив $ this-> data, что-то вроде этого, поэтому, когда вы переходите к форме, у вас уже есть поле «изображение» с некоторыми данными и вам не нужно снова загружать изображение или изменять его.
Если это не ясно, просто скажите мне, и я постараюсь сломать его.
Я надеюсь, что это сработает для вас
function admin_edit($id = null) { if (!$id && empty($this->data)) { $this->Session->setFlash(__('Invalid category', true)); $this->redirect(array('action' => 'index')); } if (!empty($this->data)) { if(!empty($this->data['Category']['image']['name'])) { $image_name = $this->Picture->upload_image_and_thumbnail($this->data,"image",570,70,"categories",true,"Category"); $this->data['Category']['image'] = $image_name; } else{ $image_name = $this->Category->find('first',array( 'conditions'=> array( 'Category.id' => $this->data['Category']['id'] ), 'fields' => array( 'Category.image' ) )); $this->data['Category']['image'] = $image_name['Category']['image']; } if ($this->Category->save($this->data)) { $this->Session->setFlash(__('The category has been saved', true)); $this->redirect(array('action' => 'index')); } else { $this->Session->setFlash(__('The category could not be saved. Please, try again.', true)); } } if (empty($this->data)) { $this->data = $this->Category->read(null, $id); } }