Yii Framework en Español - Foro

Versión completa: Como subir una imagen, y guardar el path en la base de datos
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.

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


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:


Código PHP:
array('imagen''file','types'=>'jpg, gif, png''allowEmpty'=>true'on'=>'update'), 
esto permitirá campo vacío cuando la página es la actualización


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.-


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 una pregunta, como puedo adaptar el codigo del controller a un controller que esta ocupando cjuidialog?

URLs de referencia