buenas
en español no encuentro mucho material sobre yiiframework2 y el que encuentro esta incompleto porque solo hacen upload y no registran en base de datos o estan redactados para programadores avanzados que no necesitan leer tutoriales para hacer las cosas … vamos al turron
Esto está programado sobr eun ejemplo sencillo, una tabla que se llama ejemplos con un campo nombre y otro “imagen” que es donde guardaremos ruta y nombre de archivo
- creamos la vista upload.php en la carpeta views y dentro en este caso en la carpeta ejemplos y le metemos este codigo:
<?php use yii\helpers\Html; use yii\widgets\ActiveForm; ?> <?= $msg ?> <h3>Subir archivos</h3> <?php $form = ActiveForm::begin([ "method" => "post", "enableClientValidation" => true, "options" => ["enctype" => "multipart/form-data"], ]); ?> <?= $form->field($model, "file[]")->fileInput(['multiple' => true]) ?> <?= Html::submitButton("Subir", ["class" => "btn btn-primary"]) ?> <?php $form->end() ?>
- creamos el modelo de validación FormUpload.php en la carpeta models y le metemos este codigo:
<?php namespace app\models; use yii\base\Model; class FormUpload extends Model{ public $file; public function rules() { return [ ['file', 'file', 'skipOnEmpty' => false, 'uploadRequired' => 'No has seleccionado ningún archivo', //Error 'maxSize' => 1024*1024*1, //1 MB 'tooBig' => 'El tamaño máximo permitido es 1MB', //Error 'minSize' => 10, //10 Bytes 'tooSmall' => 'El tamaño mínimo permitido son 10 BYTES', //Error 'extensions' => 'jpg', 'wrongExtension' => 'El archivo {file} no contiene una extensión permitida {extensions}', //Error 'maxFiles' => 4, 'tooMany' => 'El máximo de archivos permitidos son {limit}', //Error ], ]; } public function attributeLabels() { return [ 'file' => 'Seleccionar archivos:', ]; } }
- agregamos las clases FormUpload y UploadedFile al controlador, en este caso el nuestro es controllers/EjemplosController.php:
use app\models\FormUpload; use yii\web\UploadedFile;
- y creamos la acción Upload en el controlador controllers/EjemplosController.php:
public function actionUpload($id) { $model = new FormUpload; $msg = null; if ($model->load(Yii::$app->request->post())) { $model->file = UploadedFile::getInstances($model, 'file'); if ($model->file && $model->validate()) { foreach ($model->file as $file) { if ($file->saveAs('archivos/' . $file->baseName . '.' . $file->extension)){ $msg = " <strong class='label label-info'>Enhorabuena, subida realizada con éxito</strong> "; $modele = $this->findModel($id); $modele->imagen=$file->baseName . '.' . $file->extension; $modele->save(); } } } } return $this->render("upload", ["model" => $model, "msg" => $msg]); }
- descargamos en la carpeta web la clase UploadedFile.php http://www.yiiframework.com/doc-2.0/yii-web-uploadedfile.html
- creamos en web donde vamos a guardar los archivos, en este caso archivos
con esto ya tenemos la subida de archivos desde el panel de control, ahora solo tenemos que modificar la vista de cada registro para ver la foto de marras
- en views/ejemplos/view.php añadimos esta linea al final para poder ver la foto relacionada con cada registro del a base de datos : <?= Html::img(Url::base().’/archivos/’.$model->imagen,[‘height’=>’200px’]);?> y añadimos esta otra donde tenemos los botones update y delete para poder llamar al formulario de subida de imagenes <?= Html::a(Yii::t(‘app’, ‘Upload’), [‘upload’, ‘id’ => $model->id], [‘class’ => ‘btn btn-primary’]) ?>
y si no he bebido mucho vino creo que no me olvido de nada
espero que esto le sirva de ayuda a alguien mas aparte de a mi mismo xDD
Genial! Muchas gracias por tu post, me resultó muy útil.
¿sabrías decirme como hacer para que en la vista ejemplos/index.php se muestre la imagen en una columna de la GridView?
Gracias.