Problemas al Editar - campo donde se subió archivo

Estoy haciendo un sistema sencillo donde se debe subir el curriculum vitae a cada persona en un formato de archivo (el mismo acepta formato Doc, PDF) donde tengo 3 tablas con los siguientes campos:

h**p://www.tiemponline.com/wp-content/uploads/2012/06/tablasdb.jpg

Cuando creo un registro con una persona nueva puedo cargar correctamente el archivo, pero cuando quiero actualizarlo no me sale el nombre del archivo en el campo "cv" dentro del formulario de actualización, por lo que al guardar (por ejemplo cambie el nombre solamente) me guarda el campo,donde va el curriculum (cv), vacío en la base de datos.

h**p://www.tiemponline.com/wp-content/uploads/2012/06/pantallaupdate.jpg

en personaController.php tengo las acciones Create y update con el siguiente codigo.




public function actionCreate()

	{

		$model=new Persona;


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['Persona']))

		{

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

                        $model->cv=CUploadedFile::getInstance($model,'cv');

			if($model->save())

                        {

                            

                                $model->cv->saveAs(Yii::getPathOfAlias('webroot').'/doc/'.$model->cv);

				$this->redirect(array('view','id'=>$model->id));

                        }        

		}


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

	}


	/**

	 * Updates a particular model.

	 * If update is successful, the browser will be redirected to the 'view' page.

	 * @param integer $id the ID of the model to be updated

	 */

	public function actionUpdate($id)

	{

		$model=$this->loadModel($id);


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['Persona']))

		{

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

                         $model->cv=CUploadedFile::getInstance($model,'cv');

			if($model->save())

                             $model->cv->saveAs(Yii::getPathOfAlias('webroot').'/doc/'.$model->cv);

				$this->redirect(array('view','id'=>$model->id));

		}


		$this->render('update',array(

			'model'=>$model,

		));

	}







en el modelo (Personas.php) tengo las siguientes rules:




public function rules()

	{

		// NOTE: you should only define rules for those attributes that

		// will receive user inputs.

		return array(

			array('provincia_id, areaconocimiento_id', 'required'),

			array('nombre', 'length', 'max'=>200),

			array('dni, domicilio, cv', 'length', 'max'=>255),

			array('localidad, conocimiento', 'length', 'max'=>45),

			array('provincia_id, areaconocimiento_id', 'length', 'max'=>10),

			// The following rule is used by search().

			// Please remove those attributes that should not be searched.

			array('id, nombre, dni, localidad, domicilio, cv, conocimiento, provincia_id, areaconocimiento_id', 'safe', 'on'=>'search'),

                        array('cv','file','types'=>'pdf,doc,docx','allowEmpty' => true,'on'=>'update'),

                        array('cv','file','types'=>'pdf,doc,docx','allowEmpty' => false,'on'=>'insert'),

		);

	}



y en la vista /personas/_Form.php tengo lo siguiente.




<div class="form">


<?php $form=$this->beginWidget('CActiveForm', array(

	'id'=>'persona-form',

	'enableAjaxValidation'=>false,

    'htmlOptions' => array('enctype' => 'multipart/form-data'),

        

));?>

       

....


<div class="row">

                <?php echo $form->labelEx($model,'cv');   ?>

                 <?php echo $form->fileField($model,'cv');?> 

 </div>

          




Agradecere cualquier ayuda, si es posible solucionar esto que ya tengo empezado he probado con plugins pero como soy nuevo en yii se me complica bastante.

adjunto lo que llevo hecho (en la carpeta DB esta el archivo para importar la base de datos).

muchas gracias por la ayuda!! alexis!

h**p://www.tiemponline.com/wp-content/uploads/2012/06/cv.zip

te recomiendo el uso de esta extensión: http://www.yiiframework.com/extension/fileimagearbehavior/

normalmente no guardo el nombre del archivo en la bd, pero igual si lo requieres, esa extensión te va a facilitar las cosas

a ver … lo voy a probar ojala pueda hacerlo andar.

muchas gracias!!

Vale, igual si no sirve asi, entonces hacemos eso desde la base de datos, que no es nada complicado, pero me pareció que con esta extensión puedes obtener mejores resultados

Hola Disculpame pero soy completamente novato en esto de yii, pude instalar correctamente el plugin y lo estoy usando. Ahora me carga correctamente cuando es un registro nuevo, pero nuevamente cuando trato de actualizar me dice que el campo CV no puede estar en blanco.

en el controlador Persona, action create tengo el siguiente codigo:




public function actionCreate()

	{

		$model=new Persona;


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['Persona']))

		{

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

                        $model->cv=CUploadedFile::getInstance($model,'cv');

			if($model->save())

                        {

                            

                                $model->cv->saveAs(Yii::getPathOfAlias('webroot').'/doc/'.$model->cv);

				$this->redirect(array('view','id'=>$model->id));

                        }        

		}


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

	}



ahora no se que poner en la acción update para que funcione correctamente:




public function actionUpdate($id)

	{

		$model=$this->loadModel($id);


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['Persona']))

		{

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

                         //$model->cv=CUploadedFile::getInstance($model,'cv');

			if($model->save())

                             //$model->cv->saveAs(Yii::getPathOfAlias('webroot').'/doc/'.$model->cv);

				$this->redirect(array('view','id'=>$model->id));

		}


		$this->render('update',array(

			'model'=>$model,

		));

	}






agradezco mucho tu ayuda!

saludos!

alexis

Hola!!! te cuento que a mi tambien me ha pasado lo mismo cuando cargo imagenes, asi que opte por 2 alternativas:

1.- El archivo no tiene la opcion de update, solo sus atributos. Para eso, uso el siguiente código en mi form:




<?php 

if($model->isNewRecord){

?>

	<div class="row">

		<?php echo $form->labelEx($model,'file'); ?>

		<?php echo $form->fileField($model,'file'); ?>

		<?php echo $form->error($model,'file'); ?>

	</div>

<?php 

} 

?>



2.- El campo del archivo solo es required en la actionCreate, con el siguiente código en el model:




public function rules()

	{

		return array(

			//...

                        array('file', 'required', 'on'=>'create'),

			//...

		);

	}



Espero que esto te sea de ayuda, saludos!