Проверка файла не работает в торт PHP - PullRequest
1 голос
/ 05 марта 2012

Если я не выбрал файл, проверка времени не сработает и не отобразит сообщение «неверный файл».

это URL действия:

http://localhost/carsdirectory/cars/create_ad

create_ad.ctp (вид)

 <?php echo $this->Form->create('Car', array('type' => 'file', 'action' => 'create_ad')); ?>

      <?php echo $this->Form->file('CarImage.image_path')?>

<?php echo $this->Form->end(array('label' => 'Submit', 'name' => 'Submit', 'div' => array('class' => 'ls-submit')));?>

car_image.php (модель)

 <?php
 class CarImage extends AppModel
 {
 var $name = 'CarImage';

 var $belongsTo = 'Car';

 var $validate = array(

 'image_path' => array(

 'rule' => array('extension', array('jpeg', 'jpg', 'png', 'gif')),

 'allowEmpty' => false,

 'required' => true,

 'message' => 'invaid file'
        ),

  'car_id' => array(
          'rule' => "numeric",
           'allowEmpty' => false,
           'message' => 'Car details could not be saved'
      )


       );
 }
 ?>

car_images (таблица)

Поле -> 1) id 2) путь_карты 3) идентификатор_карты

1 Ответ

3 голосов
/ 06 марта 2012

Как я прокомментировал и предположил, по вашей схеме кажется правильным то, что у вас есть следующие ассоциации:

Модель автомобиля:

public $hasMany = array(
    'CarImage' => array(
        'className' => 'CarImage',
        'foreignKey' => 'car_id',
        'dependent' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'exclusive' => '',
        'finderQuery' => '',
        'counterQuery' => ''
    ), 
);

Модель CarImage:

public $belongsTo = array(
    'Car' => array(
        'className' => 'Car',
        'foreignKey' => 'car_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

Поле для формы, поскольку вы можете загружать много файлов (просто создайте новую строку с приращением числа):

echo $this->Form->file('CarImage.0.image_path');

Для проверки и загрузки файлов проще и последовательнее сделать это в модели CarImage(Я не уверен, что вам нужен car_id в переменной $ validate, если не работает, попробуйте удалить car_id из $ validate):

public $validate = array(
    'image_path' => array(
        'uploadFile' => array(
            'rule' => array('uploadFile'),
            'message' => 'Invalid file',
        ),
    ),
);

public function uploadFile($params) {
    if ($params['image_path']['error'] == 0) {
        $file = pathinfo($params['image_path']['name']);

        if (in_array($file['extension'], array('jpeg', 'jpg', 'png', 'gif'))) {
            $tmp_file = new File($params['image_path']['tmp_name']);
            if ($tmp_file->copy('folder_inside_webroot' . DS . $file['basename'])) {
                return true;
            }
        }
    }

    return false;
}

А вашему контроллеру нужно saveAll вместо save:

if ($this->Car->saveAll($this->data)) {
    // success
} else {
    // failure
}

Надеюсь, это поможет.

...