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