Mamadum
Mamadum

Reputation: 540

Yii uploading pictures

I'm a new to yii, so I was following this tutorial.

when I try to upload picture it reports empty field even if it is not.

my _form view:

<div class="form">

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'picture-form',
    'enableAjaxValidation'=>false,
    'htmlOptions' => array('enctype' => 'multipart/form-data'),
     )); 
?>
...
<div class="row">
  <?php echo $form->labelEx($model,'path_to'); ?>
  <?php echo $form->fileField($model,'path_to'); ?>
  <?php echo $form->error($model,'path_to'); ?>
</div>
...
  <?php $this->endWidget(); ?>
</div><!-- form -->

and here is my action method:

public function actionCreate()
{
  $model=new Picture;
  if(isset($_POST['Picture']))
  {
    $model->attributes=$_POST['Picture'];

    $model->picture=CUploadedFile::getInstance($model,'path_to');
    if($model->save()){
      $log->lwrite('in save'.$model->picture);
      $model->picture->saveAs(Yii::app()->basePath.'/../images/'.$model->picture);
      $this->redirect(array('view','id'=>$model->id));
      $log->lclose();
    }
  }
$this->render('create',array('model'=>$model,));
}

when I print_r($_FILES) everything what should be there is there when I print_r($_POST) the field 'path_to' is empty and the validator probably is picking that one.

I'm probably missing something here and I'm clueless.

update1: I've noticed yii is using hidden field with the same name as file input, than attributes are read from $_POST, which is causing the engine reading empty hidden field. I understand that the hidden field is there for update when user is not entering new picture. Can anyone advice what is the best way of doing picture upload?

update2: model code: class Picture extends CActiveRecord {

    public $picture;
... 
    public function rules()
    {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            array('path_to, page_id', 'required'),
            array('page_id', 'numerical', 'integerOnly'=>true),
            array('alt_text', 'safe'),
            // The following rule is used by search().
            // Please remove those attributes that should not be searched.
            array('id, alt_text, path_to, page_id', 'safe', 'on'=>'search'),
            //array('path_to', 'file','types'=>'jpg, gif, png', 'allowEmpty'=>true, 'on'=>'update'),
            //array('path_to', 'length', 'max'=>255, 'on'=>'insert,update'),
            array('path_to', 'unsafe'),
        );
    }
...

Best!

Upvotes: 3

Views: 6974

Answers (2)

Lal
Lal

Reputation: 1628

_form code for file upload field :

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'post-form',
    'enableAjaxValidation'=>false,
    'htmlOptions' => array('enctype' => 'multipart/form-data'),
)); ?>


        <div class="row">
        <?php echo $form->labelEx($model, 'image');?>
        <?php echo $form->fileField($model, 'image'); ?>
        <?php echo $form->error($model, 'image'); ?>
    </div>

<?php $this->endWidget(); ?>

Controller Code:

public function actionCreate()
    {
        $model=new Post;

        if(isset($_POST['Post']))
        {
            $model->attributes=$_POST['Post'];
                        $uploadedFile=CUploadedFile::getInstance($model,'image');
                        $fileName = $uploadedFile;
                        $model->image = $fileName;

            if($model->save()){
         $uploadedFile->saveAs('C:/Program Files/Apache Group/Apache2/htdocs'.Yii::app()->baseUrl.'/images/thumbnails/'.$fileName);
                $this->redirect(array('view','id'=>$model->id)); 
                        }
        }

        $this->render('create',array(
            'model'=>$model,
        ));
    }

diplay view code :

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$model->search(),
    'ajaxUpdate' => false,
    'columns'=>array(
        array(
            'name'=>'Thumbnail',
            'value'=>array($model,'showThumbnail'), // function in model 
            'type'=>'html',            
            'htmlOptions'=>array('class'=>'thumbnail'),
        ),

    )
));
?>

model code :

place this function in ur model :

public function showThumbnail($data){
    $path = $data->image;
 return CHtml::image(Yii::app()->baseUrl.'/images/thumbnails/'.$path); // same path as ur uploaded file path
}

Upvotes: 1

ernie
ernie

Reputation: 6356

I think because you've declared 'path_to' to be unsafe in your rules, the massive assignment line:

$model->attributes=$_POST['Picture'];

Will fail, which will then cause the rule validation to fail. Change your rules to allow for path_to to be safe, and you should be good to go . . .

It also appears you're requiring a page_id, which I'm not seeing in your form.

Upvotes: 3

Related Questions