Проверка загрузки файла только при создании записи, а не при редактировании - PullRequest
0 голосов
/ 01 октября 2010

У меня есть форма, которая позволяет загружать файл, и я использую проверку данных, чтобы проверить, какой это тип файла, и это все хорошо. Затем я хочу разрешить им редактировать ту же запись, но загрузка файла в это время не требуется.

Мое правило проверки следующее:

    '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.',
        ),
    )

Чего мне не хватает? (Заранее спасибо !!)

Ответы [ 3 ]

0 голосов
/ 02 октября 2010
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;
    }

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

0 голосов
/ 04 октября 2010

Я понял это. (Спасибо Омабене и 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'
        ),
    )
0 голосов
/ 02 октября 2010

У меня была та же проблема, мое решение не очень хорошее, но у меня сработало, что я и сделал, - allowEmpty => true. и в функции редактирования на контроллере я передал данные этого изображения в массив $ this-> data, что-то вроде этого, поэтому, когда вы переходите на форму, у вас уже есть поле 'image' с некоторыми данными, Вам не нужно загружать изображение снова или изменять его.

Если неясно, просто скажите мне, и я постараюсь разбить его.

Я надеюсь, что это работает для вас

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);
        }

}
...