7-Gestor de Tareas Sencillo con Layout en Blade
Gestor de Tareas Sencillo con Layout en Blade
Aquí tienes una versión organizada con un layout principal que heredan todas las vistas:
1. Layout Principal (resources/views/layouts/app.blade.php)
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@yield('titulo') - Gestor de Tareas</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
max-width: 800px;
margin: 0 auto;
padding: 20px;
color: #333;
}
header {
background: #f5f5f5;
padding: 20px;
margin-bottom: 20px;
border-radius: 5px;
}
nav a {
margin-right: 15px;
text-decoration: none;
color: #333;
}
nav a:hover {
color: #666;
}
.tarea {
border: 1px solid #ddd;
padding: 15px;
margin-bottom: 15px;
border-radius: 5px;
}
.completada {
background-color: #e6ffe6;
border-left: 4px solid #4CAF50;
}
.pendiente {
background-color: #fff9e6;
border-left: 4px solid #FFC107;
}
.btn {
display: inline-block;
padding: 8px 15px;
background: #333;
color: white;
border-radius: 4px;
text-decoration: none;
margin-right: 10px;
}
.btn:hover {
background: #666;
}
form div {
margin-bottom: 15px;
}
label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
input[type="text"], textarea {
width: 100%;
padding: 8px;
border: 1px solid #ddd;
border-radius: 4px;
}
textarea {
height: 100px;
}
</style>
</head>
<body>
<header>
<h1>Gestor de Tareas</h1>
<nav>
<a href="{{ route('tareas.index') }}">Inicio</a>
<a href="{{ route('tareas.crear') }}">Crear Tarea</a>
<a href="{{ route('salir') }}">Salir</a>
</nav>
</header>
<main>
@yield('contenido')
</main>
<footer style="margin-top: 30px; text-align: center; color: #666;">
<p>Sistema de Gestión de Tareas © {{ date('Y') }}</p>
</footer>
</body>
</html>2. Vista de Listado (resources/views/tareas/index.blade.php)
@extends('layouts.app')
@section('titulo', 'Lista de Tareas')
@section('contenido')
<h2>Lista de Tareas</h2>
@if(count($tareas) > 0)
@foreach($tareas as $tarea)
<div class="tarea {{ $tarea['completada'] ? 'completada' : 'pendiente' }}">
<h3>{{ $tarea['titulo'] }}</h3>
<p>{{ $tarea['descripcion'] }}</p>
<p>
<a href="{{ route('tareas.mostrar', $tarea['id']) }}" class="btn">Ver</a>
<a href="{{ route('tareas.eliminar', $tarea['id']) }}" class="btn"
style="background: #f44336;">Eliminar</a>
</p>
</div>
@endforeach
@else
<div class="tarea">
<p>No hay tareas registradas.</p>
</div>
@endif
@endsection3. Vista para Crear Tarea (resources/views/tareas/crear.blade.php)
@extends('layouts.app')
@section('titulo', 'Crear Nueva Tarea')
@section('contenido')
<h2>Crear Nueva Tarea</h2>
<form action="{{ route('tareas.guardar') }}" method="POST">
@csrf
<div>
<label for="titulo">Título:</label>
<input type="text" id="titulo" name="titulo" required>
</div>
<div>
<label for="descripcion">Descripción:</label>
<textarea id="descripcion" name="descripcion"></textarea>
</div>
<div>
<button type="submit" class="btn">Guardar Tarea</button>
<a href="{{ route('tareas.index') }}" class="btn" style="background: #666;">Cancelar</a>
</div>
</form>
@endsection4. Vista para Mostrar Tarea (resources/views/tareas/mostrar.blade.php)
@extends('layouts.app')
@section('titulo', 'Detalles de Tarea')
@section('contenido')
<div class="tarea {{ $tarea['completada'] ? 'completada' : 'pendiente' }}">
<h2>{{ $tarea['titulo'] }}</h2>
<p>{{ $tarea['descripcion'] }}</p>
<p>Estado: {{ $tarea['completada'] ? 'Completada' : 'Pendiente' }}</p>
<p>
<a href="{{ route('tareas.index') }}" class="btn">Volver al Listado</a>
</p>
</div>
@endsection5. Controlador (app/Http/Controllers/TareaController.php)
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TareaController extends Controller
{
private $tareas = [];
private $ultimoId = 1;
public function __construct()
{
// Tareas de ejemplo
$this->tareas = [
[
'id' => $this->ultimoId++,
'titulo' => 'Aprender Laravel',
'descripcion' => 'Estudiar los conceptos básicos de Laravel y Blade',
'completada' => false
],
[
'id' => $this->ultimoId++,
'titulo' => 'Crear proyecto práctico',
'descripcion' => 'Implementar un CRUD completo con Laravel',
'completada' => true
]
];
}
public function index()
{
return view('tareas.index', ['tareas' => $this->tareas]);
}
public function crear()
{
return view('tareas.crear');
}
public function guardar(Request $request)
{
$nuevaTarea = [
'id' => $this->ultimoId++,
'titulo' => $request->input('titulo'),
'descripcion' => $request->input('descripcion'),
'completada' => false
];
$this->tareas[] = $nuevaTarea;
return redirect()->route('tareas.index');
}
public function mostrar($id)
{
$tarea = collect($this->tareas)->firstWhere('id', $id);
if (!$tarea) {
abort(404);
}
return view('tareas.mostrar', ['tarea' => $tarea]);
}
public function eliminar($id)
{
$this->tareas = array_filter($this->tareas, function($tarea) use ($id) {
return $tarea['id'] != $id;
});
return redirect()->route('tareas.index');
}
}6. Rutas (routes/web.php)
<?php
use App\Http\Controllers\TareaController;
use Illuminate\Support\Facades\Route;
Route::get('/', [TareaController::class, 'index'])->name('tareas.index');
Route::get('/tareas/crear', [TareaController::class, 'crear'])->name('tareas.crear');
Route::post('/tareas/guardar', [TareaController::class, 'guardar'])->name('tareas.guardar');
Route::get('/tareas/{id}', [TareaController::class, 'mostrar'])->name('tareas.mostrar');
Route::get('/tareas/eliminar/{id}', [TareaController::class, 'eliminar'])->name('tareas.eliminar');
Route::get('/salir', function() {
return redirect('/');
})->name('salir');Características de esta implementación:
Layout principal: Todas las vistas heredan de
layouts/app.blade.phpSistema de plantillas: Uso de
@extends,@sectiony@yieldDiseño consistente: Mismo header, navegación y footer en todas las páginas
CSS interno: Estilos básicos en el layout para mantenerlo simple
Estructura organizada:
Layout en
resources/views/layouts/Vistas de tareas en
resources/views/tareas/
Ventajas de este enfoque:
Reutilización de código: El layout se usa en todas las vistas
Mantenimiento fácil: Cambios en el layout se aplican a toda la aplicación
Consistencia visual: Todas las páginas tienen el mismo diseño base
Organización clara: Separación lógica entre layout y contenido específico
Esta versión mantiene la simplicidad del arreglo en el controlador pero añade una estructura más profesional con el sistema de layouts de Blade
Comentarios
Publicar un comentario