php yii yii-extensions yii-xupload

php - yii ajax xupload formulario enviar no funciona



yii-extensions yii-xupload (5)

Q1: el envío de formularios no funciona.

Q2: cómo limitar la carga de archivos (por ejemplo, 1 - 5 archivos solamente)

estado: crea un formulario con ajax carga xupload

Mi modelo (fadepreciation.php)

public function afterSave( ) { $this->addImages( ); parent::afterSave( ); } public function addImages( ) { //If we have pending images if( Yii::app( )->user->hasState( ''images'' ) ) { $userImages = Yii::app( )->user->getState( ''images'' ); //Resolve the final path for our images $path = Yii::app( )->getBasePath( )."/../images/uploads/{$this->id}/"; //Create the folder and give permissions if it doesnt exists if( !is_dir( $path ) ) { mkdir( $path ); chmod( $path, 0777 ); } //Now lets create the corresponding models and move the files foreach( $userImages as $image ) { if( is_file( $image["path"] ) ) { if( rename( $image["path"], $path.$image["filename"] ) ) { chmod( $path.$image["filename"], 0777 ); $img = new Image( ); $img->size = $image["size"]; $img->mime = $image["mime"]; $img->name = $image["name"]; $img->source = "/images/uploads/{$this->id}/".$image["filename"]; $img->somemodel_id = $this->id; if( !$img->save( ) ) { //Its always good to log something Yii::log( "Could not save Image:/n".CVarDumper::dumpAsString( $img->getErrors( ) ), CLogger::LEVEL_ERROR ); //this exception will rollback the transaction throw new Exception( ''Could not save Image''); } } } else { //You can also throw an execption here to rollback the transaction Yii::log( $image["path"]." is not a file", CLogger::LEVEL_WARNING ); } } //Clear the user''s session Yii::app( )->user->setState( ''images'', null ); } }

Mi vista (_form.php)

<?php $form=$this->beginWidget(''CActiveForm'', array( ''id''=>''fa-depreciation-form'', ''enableAjaxValidation''=>false, ''htmlOptions'' => array(''enctype'' => ''multipart/form-data''), )); ?> <p class="note">Fields with <span class="required">*</span> are required.</p> <?php echo $form->errorSummary($model); ?> <!-- Other Fields... --> <div class="row"> <?php echo $form->labelEx($model,''photos''); ?> <?php $this->widget( ''xupload.XUpload'', array( ''url'' => Yii::app( )->createUrl( "/fadepreciation/upload"), //our XUploadForm ''model'' => $photos, //We set this for the widget to be able to target our own form ''htmlOptions'' => array(''id''=>''fa-depreciation-form''), ''attribute'' => ''file'', ''multiple'' => true, //Note that we are using a custom view for our widget //Thats becase the default widget includes the ''form'' //which we don''t want here //''formView'' => ''application.views.faDepreciation._form'', ) ); ?> </div> <div class="row buttons"> <?php echo CHtml::submitButton($model->isNewRecord ? ''Create'' : ''Save''); ?> </div> <?php $this->endWidget(); ?> </div><!-- form -->

Mi controlador (fadepreciation.php)

public function actionCreate() { $model=new FaDepreciation; Yii::import( "xupload.models.XUploadForm" ); $photos = new XUploadForm; // Uncomment the following line if AJAX validation is needed // $this->performAjaxValidation($model); if(isset($_POST[''FaDepreciation''])) { //Assign our safe attributes $model->attributes=$_POST[''FaDepreciation'']; //Start a transaction in case something goes wrong $transaction = Yii::app( )->db->beginTransaction( ); try { //Save the model to the database if($model->save()){ $transaction->commit(); $this->redirect(array(''view'',''id''=>$model->id)); } } catch(Exception $e) { $transaction->rollback( ); Yii::app( )->handleException( $e ); } if($model->save()) $this->redirect(array(''view'',''id''=>$model->id)); } Yii::import( "xupload.models.XUploadForm" ); $photos = new XUploadForm; $this->render(''create'',array( ''model''=>$model, ''photos''=>$photos, )); } public function actionUpload( ) // From xupload nothing change



Lo que debe hacer es crear un formulario personalizado. Copie el contenido de xupload _form y péguelo, eliminando el formulario begin form - end. Agregue a su widget ''formView'' la referencia en el formulario personalizado.


Q1: la submición de formulario no funciona, porque el widget XUpload genera su propia etiqueta de formulario. para que su HTML generado tenga un formulario embebido en otra forma, debe usar la opción formView del widget para apuntar a una vista que no tenga etiquetas de formulario, como se describe en la wiki del flujo de trabajo xupload

Q2: debe usar la opción maxNumberOfFiles en la configuración del widget

Todo debería verse así:

<?php $this->widget( ''xupload.XUpload'', array( ''url'' => Yii::app( )->createUrl( "/fadepreciation/upload"), //our XUploadForm ''model'' => $photos, //We set this for the widget to be able to target our own form ''htmlOptions'' => array(''id''=>''fa-depreciation-form''), ''attribute'' => ''file'', ''multiple'' => true, //Note that we are using a custom view for our widget //Thats becase the default widget includes the ''form'' //which we don''t want here ''formView'' => ''application.views.faDepreciation._form'', ''options'' => array(''maxNumberOfFiles'' => 5) ) ); ?>


Simplemente use el parámetro ''showForm'' de la siguiente manera:

<?php $this->widget( ''xupload.XUpload'', array( ... ''showForm'' => false, ... )); ?>

Tal vez, esta opción se haya agregado en las próximas versiones de xupload.


Sé que es una publicación anterior, pero tal vez esta respuesta ayude a alguien a resolver este problema.

Descubrí que es causado por la última línea del archivo /xupload/views/form.php (con la configuración predeterminada). Parece que la sentencia if de alguna manera funciona de manera opuesta ... en la minería, por un valor falso se está renderizando el código. Por ejemplo:

<?php echo $this->showForm; if($this->showForm) echo CHtml::endForm(); echo $this->showForm; ?>

devoluciones:

Tal vez me estoy perdiendo algo, pero se ve raro ... ¿no?