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
archivo _form.php
Código 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:
solo es necesario agregar una linea en el metodo rules() en el Modelo, de la siguiente manera:
Código PHP:
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)
Código PHP:
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.-
En el controlador Create subiremos la imagen con nombre aleatorio y guardamos la entrada en la base de datos.-
Código PHP:
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
Código PHP:
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
Hola , antes que todo muchas gracias por compartir esta info, estuve siguiendo tus instrucciones, pero tengo un problema, resulta que al crear un registro con imagen, crea 4 registros mas en la base de datos, todos con los mismos datos , excepto los 3 últimos que los deja sin imagen
ResponderEliminar