Ya sabemos como subir y almacenar imágenes pero siempre es útil crear pequeñas imágenes o «thumbnails», ya sea para mostrar productos, fotos de perfil, álbum de fotos, entre otros. hoy aprenderemos como crear un simple thumbnail.
Primero la base de datos, vamos a crear el modelo y la migración.
php artisan make:model Thumbnail
Nota: cuando creamos nuestro modelo con artisan automáticamente Laravel nos crea la migración.
El modelo quedaría:
protected $table = 'thumbnails'; protected $fillable = ['name', 'image'];
Y la migración «create_thumbnails_table» quedaría:
/** * Run the migrations. * * @return void */ public function up() { Schema::create('thumbnails', function(Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('image'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('thumbnails'); }
Recuerda instalar tu migración:
php artisan migrate:install
Ahora, vamos a crear el controlador ThumbnailController
php artisan make:controller ThumbnailController
Creamos la ruta que apunte al Controlador:
Route::resource('thumbnail', 'ThumbnailController');
Creamos la vista thumbnailForm con el formulario:
@extends('app') @section('content') <div class="container"> <div class="row"> <div class="col-md-10 col-md-offset-1"> <div class="panel panel-default"> <div class="panel-heading">Crear Banner</div> <div class="panel-body"> {!! Form::open(['route' => 'thumbnail.store', 'method' => 'POST', 'files' => 'true']) !!} <div class="form-group"> {!! form::label('name','Nombre')!!} {!! form::text('name',null,['class' => 'form-control']) !!} </div> <div class="form-group"> {!! form::label('image','Imagen')!!} {!! form::file('image',null,['class' => 'form-control']) !!} </div> <button type="submit" class="btn btn-default">Guardar Banner</button> {!! Form::close() !!} </div> </div> </div> </div> </div> @endsection
Luego colocamos el llamado a la vista en la función create del controlador:
public function create() { return view('thumbnailForm'); }
Puedes ir viendo que la aplicación va bien, dirígete a la url: nombre_de_tu_aplicacion/thumbnail/create donde se mostrará el siguiente formulario:
Ahora bien, ya tenemos el formulario y la base de datos está perfecta, ahora vamos a subir las imágenes, pero antes que nada sería buenos instalar la librería Intervention.image que nos permite cambiarles el tamaño. Para ello debemos:
En la consola:
composer require intervention/image
Agregar a los Providers en ‘config/app.php‘:
'Intervention\Image\ImageServiceProvider'
Agregar el alias:
//Intervention image 'Image' => 'Intervention\Image\Facades\Image',
Y por último de nuevo en la consola:
php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5"
Listo, ahora podemos utilizar todas las funciones que nos ofrece, por ahora vamos a usar los métodos save() y resize(). La función store de nuestro controlador, quedaría:
public function store(){ $file = Input::file('image'); //Creamos una instancia de la libreria instalada $image = \Image::make(\Input::file('image')); //Ruta donde queremos guardar las imagenes $path = public_path().'/thumbnails/'; // Guardar Original $image->save($path.$file->getClientOriginalName()); // Cambiar de tamaño $image->resize(240,200); // Guardar $image->save($path.'thumb_'.$file->getClientOriginalName()); //Guardamos nombre y nombreOriginal en la BD $thumbnail = new Thumbnail(); $thumbnail->name = Input::get('name'); $thumbnail->image = $file->getClientOriginalName(); $thumbnail->save(); return redirect()->route('thumbnail.index'); }
Perfecto, ya podemos guardarlas, ahora vamos a pasar toda la información a la vista, la función index del controlador quedaría de la siguiente manera:
<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Input; use App\Http\Requests; use App\Thumbnail; class ThumbnailController extends Controller { /** * Display a listing of the resource. * * @return Response */ public function index() { $thumbnails = Thumbnail::all(); return view('thumbnails', compact('thumbnails')); }
Excelente, ahora a crear la vista donde mostraremos el thumbnail. Para ello utilizaremos uno de los componentes que nos ofrece bootstrap, bootstrap-thumbnail:
@extends('app') @section('content') <div class="container"> <div class="row"> <div class="col-md-10 col-md-offset-1"> <div class="panel panel-default"> <div class="panel-heading">Listado <a href="{{url('thumbnail/create')}}" class="btn-xs btn-primary pull-right" role="button">Agregar</a> </div> <div class="panel-body"> <div class="row"> @foreach($thumbnails as $thumbnail) <div class="col-sm-6 col-md-4"> <div class="thumbnail"> <img src="thumbnails/{{$thumbnail->image}}" alt="{{$thumbnail->name}}"> <div class="caption"> <h3>{{$thumbnail->name}}</h3> </div> </div> </div> @endforeach </div> </div> </div> </div> </div> </div> @endsection
Nota: la plantilla extiende de nuestra vista «app» que viene por defecto.
Listo, luego de cargar varias imágenes veremos nuestro resultado. Url: nombre_de_tu_aplicacion/thumbnail/
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.
Lección anterior Envio de correos con Mailgun en laravel 5 Lección siguiente Restaurar registros borrados con Eloquent en Laravel 5