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
¿Cuál es el problema con el formulario de envío?
sí límite de archivos se puede hacer. Por favor, asegúrese de seguir estos http://www.yiiframework.com/wiki/348/xupload-workflow/
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?