Estoy tratando de guardar un archivo de tipo de imagen usando jquery para activar el envío. Encontré un problema en el que se activa incluso cuando el evento de cambio no se realiza.
Ver crear.php:
<?php \yii\bootstrap4\ActiveForm::begin([ 'options' => [ 'enctype' => 'multipart/form-data', 'id' => 'dynamic-form' ] ]) ?> <button class="btn btn-primary btn-file"> Select Thumbnail <input type="file" id="recipeThumbnail" name="recipe"> </button> <?php \yii\bootstrap4\ActiveForm::end() ?>En esta vista, especifico el id para llamarlo en el archivo javascipt.
Js aplicación.js:
$(function () { 'use strict'; $('#recipeThumbnail').change(ev => { $(ev.target).closest('form').trigger('submit'); }) });Según tengo entendido aquí, el activador ('enviar') solo debe ejecutarse cuando hay un cambio que, en este caso, se selecciona un archivo de imagen. Sin embargo, sospecho que el evento se activa y provocó un error de intento de leer la propiedad "nombre" en nulo del modelo a continuación en la línea $this->name = $this->receta->name; . Mi otra sospecha sería un error en el modelo, pero no puedo entender dónde o cómo podría ser.
Modelo receta.php:
public function save($runValidaiton = true, $attributeNames = null) { $isInsert = $this->isNewRecord; if ($isInsert) { $this->recipe_id = Yii::$app->security->generateRandomString(16); $this->name = $this->recipe->name; } $saved = parent::save($runValidaiton, $attributeNames); if (!$saved) { return false; } if ($isInsert) { $recipePath = Yii::getAlias('@frontend/web/storage/thumbnail/' . $this->recipe_id . '.jpg'); if (!is_dir(dirname($recipePath))) { FileHelper::createDirectory(dirname($recipePath)); } $this->recipe->saveAs($recipePath); } return true; }Controlador RecetaController.php:
public function actionCreate() { $model = new Recipe(); $model->recipe = UploadedFile::getInstanceByName('recipe'); if ($this->request->isPost) { if (Yii::$app->request->isPost && $model->save()) { return $this->redirect(['view', 'recipe_id' => $model->recipe_id]); } } else { $model->loadDefaultValues(); } return $this->render('create', [ 'model' => $model, ]); }Espero haberme explicado bien. ¿Este error es realmente causado por el js o por alguna otra cosa? Cualquier idea sobre este problema es muy apreciada: D
Perspectivas de @ChrisG y @CBroe,
El problema era envolver la etiqueta de entrada en una etiqueta de botón que haría clic en el botón y en la entrada al mismo tiempo, lo que provocaría el error. Una solución fácil sería agregar type="button" en la etiqueta del botón.
Pero esto es en realidad un HTML roto, ya que un elemento interactivo no debe anidarse entre sí. La solución a esto sería usar formularios y etiquetas con el botón para que sea un html decente.