Con esto podremos subir una imagen a una carpeta de nuestro sitio y guardar el path en la base datos, incluyendo la posibilidad de realizar una actualizacion.-
Para esto deberemos modificar la Vista, el Modelo y el Controlador.
Vista:
archivo _form.php
..
//array de opciones del form...
'htmlOptions' => array(
'enctype' => 'multipart/form-data',
),
...
..
//Otros Elementos
..
..
<div class="row">
<?php echo $form->labelEx($model,'imagen'); ?>
<?php echo CHtml::activeFileField($model, 'imagen'); ?> //con esto levantamos la imagen
<?php echo $form->error($model,'imagen'); ?>
</div>
<?php if($model->isNewRecord!='1'){ ?>
<div class="row">
<?php echo CHtml::image(Yii::app()->request->baseUrl.'/banner/'.$model->imagen,"imagen",array("width"=>200)); ?> // La Imagen se muestra aquí si la página es la página de actualización
</div>
..
..
Otros elementos
..
..
Modelo:
solo es necesario agregar una linea en el metodo rules() en el Modelo, de la siguiente manera:
array('imagen', 'file','types'=>'jpg, gif, png', 'allowEmpty'=>true, 'on'=>'update'),
para todas las demás normas que le tiene que dar un escenario para insertar y actualizar, según la regla se aplicará tanto en la página (Insert y Update)
array('titulo, imagen', 'length', 'max'=>255, 'on'=>'insert,update'),
.. .. ahora viene la parte principal,
Controlador:
En el controlador Create subiremos la imagen con nombre aleatorio y guardamos la entrada en la base de datos.-
public function actionCreate()
{
$model=new Banner; // este es el modelo relacionado a la tabla
if(isset($_POST['Banner']))
{
$rnd = rand(0,9999); // Generamos un numero aleatorio entre 0-9999
$model->attributes=$_POST['Banner'];
$uploadedFile=CUploadedFile::getInstance($model,'imagen');
$fileName = "{$rnd}-{$uploadedFile}"; // numero aleatorio + nombre de archivo
$model->imagen = $fileName;
if($model->save())
{
$uploadedFile->saveAs(Yii::app()->basePath.'/../banner/'.$fileName); // la imagen se subirá a la carpeta raiz /banner/
$this->redirect(array('admin'));
}
}
$this->render('create',array(
'model'=>$model,
));
}
Ahora viene la parte de la accion de actualizar
public function actionUpdate($id)
{
$model=$this->loadModel($id);
if(isset($_POST['Banner']))
{
$_POST['Banner']['imagen'] = $model->imagen;
$model->attributes=$_POST['Banner'];
$uploadedFile=CUploadedFile::getInstance($model,'imagen');
if($model->save())
{
if(!empty($uploadedFile)) // checkeamos si el archivo subido esta seteado o no
{
$uploadedFile->saveAs(Yii::app()->basePath.'/../banner/'.$model->imagen);
}
$this->redirect(array('admin'));
}
if($model->save())
$this->redirect(array('admin'));
}
$this->render('update',array(
'model'=>$model,
));
}
En este ejemplo subimos una imagen a una carpeta especifica e introducimos la entrada en la base de datos. En la actualizacion sobreescribimos la imagen en la carpeta y actualizamos los datos.-
Archivo original desde aqui