Formulario Para Varias Instancias Del Mismo Modelo

Hola a todos mi problema es el siguiente necesito poder manejar varias instancias de un modelo en un mismo formulario por ejemplo con estos campos




<div class="row" id="entrada" style="float:left; width:50%;">

        <?php echo $form->labelEx($modelCasoPrueba,'nombre_archivo_entrada',array('label'=>'Archivo de entrada')); ?>

        <?php echo $form->fileField($modelCasoPrueba,'nombre_archivo_entrada',array('size'=>60,'maxlength'=>256,"class"=>"lolcat","title"=>"Debe indicar la ubicacion del archivo de entrada")); ?>

        <?php echo $form->error($modelCasoPrueba,'nombre_archivo_entrada'); ?>


    </div>

<div class="row" id="entrada" style="float:left; width:50%;">

        <?php echo $form->labelEx($modelCasoPrueba,'nombre_archivo_entrada',array('label'=>'Archivo de entrada')); ?>

        <?php echo $form->fileField($modelCasoPrueba,'nombre_archivo_entrada',array('size'=>60,'maxlength'=>256,"class"=>"lolcat","title"=>"Debe indicar la ubicacion del archivo de entrada")); ?>

        <?php echo $form->error($modelCasoPrueba,'nombre_archivo_entrada'); ?>


    </div>



Se puede ver a ambos div tiene los mismos campos fileField y q referencian al mismo atributo de modelo asi q kisiera q en el mismo formulario se guarde esta informacion en dos modelos q se instancien al mismo tiempo

un pekeño ejemplo xfa xfa xfa

Buff,… y tiene que ser con el tipo fileField?

Este tipo es especial y para subir múltiples ficheros yo utilizo extensiones.

Lo de clonar campos de formulario va bien con los demás controles el de tipo file no se maneja igual.

Esto es por seguridad, tú no puedes poner un valor en el campo de un file, lo hace exclusivamente el navegador a través del usuario. Se hace para que nadie coloque la cadena de un archivo por javascript ni por HTML y se coja un archivo sin que el usuario se de cuenta, tiene que ser obligatoriamente el usuario con el navegador el que seleccione el fichero.

No hay otro remedio q el utilizar extensiones? ayyy q mal xq ya solo eso me faltaba tienes alguna otra idea? y sino tendre q hacerlo obligadamente con extensiones pero no los entiendo bien.

Uno muy simple es el utilizado en la aplicacion Playground, enlace

Te resumo aquí lo que hace.

en protected/config/main.php




'params'=>array(

	// this is used in contact page

	'adminEmail'=>'webmaster@example.com',

	'uploadDir'=>'uploads/',

),



uploadDir es el directorio donde subirás los ficheros, esta a nivel de la carpeta protected y el navegador tiene que poder escribir, La barra / al final del nombre de directorio es requerida.

Crea en site/controller las siguientes acciones: (o en el controlador que quieras)




/**

 * Uploads files submitted via CMultiFileUpload widget

 * Deletes all old files before uploading new files

 */

public function actionUpload()	{

	if(isset($_FILES['files']))	{

		// delete old files

		foreach($this->findFiles() as $filename)

			unlink(Yii::app()->params['uploadDir'].$filename);


		//upload new files

		foreach($_FILES['files']['name'] as $key=>$filename)

			move_uploaded_file($_FILES['files']['tmp_name'][$key],Yii::app()->params['uploadDir'].$filename);

	}

	$this->redirect(array('site/files'));

}	

/**

 * @return array filename

 */

public function findFiles() {

	return array_diff(scandir(Yii::app()->params['uploadDir']), array('.', '..'));

}



Agrega un enlace en la barra de menus para poder ir a la vista correspondiente donde estará el formulario.

Y agrega la vista:




<?php $this->pageTitle=Yii::app()->name . ' - Multiple file upload';?>


<h2>Multiple file upload</h2>


<?php echo CHtml::form($this->createUrl('upload'),'post',array('enctype'=>'multipart/form-data')); 


$this->widget('CMultiFileUpload',array(

	'name'=>'files',

	'accept'=>'jpg|png',

	'max'=>3,

	//'denied'=>'', message that is displayed when a file type is not allowed

	//'duplicate'=>'', message that is displayed when a file appears twice

	'htmlOptions'=>array('size'=>25),

)); ?>

<br />

<?php echo CHtml::submitButton('Upload'); 

echo 'NB! Access restricted by IP';

echo CHtml::endForm(); ?>


<ul>

<?php foreach($this->findFiles() as $filename): ?>

	<li><?php echo CHtml::link($filename, Yii::app()->baseUrl.'/'.Yii::app()->params['uploadDir'].$filename, array('rel'=>'external'));?></li>

<?php endforeach; ?>

</ul>

<br />


<a target="_blank" href="http://www.fyneworks.com/jquery/multiple-file-upload/">http://www.fyneworks.com/jquery/multiple-file-upload/</a>



Yo solo he copiado el ejemplo de playground, quitando traducciones pero el resto esta igual.

Este ejemplo es muy básico y archivos con nombres iguales no puede haber porque se borra el anterior y se sube el nuevo, aquí tendrías que hacer cambios quiza carpetas por secciones, modificar el nombre , guardar en BBDD nombre archivo y donde esta … Pero la parte de validar número de ficheros a subir, tipo de fichero y tamaño lo puede hacer el widget.