Request y Mensajes flahs
This commit is contained in:
parent
6f36f73ec4
commit
62dd676416
|
|
@ -3,88 +3,99 @@
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Http\RedirectResponse;
|
||||||
use App\Models\Persona;
|
use App\Models\Persona;
|
||||||
|
use App\Http\Requests\UpdatedPersonaRequest;
|
||||||
|
|
||||||
class PersonaController extends Controller
|
class PersonaController extends Controller
|
||||||
{
|
{
|
||||||
public function index(Request $request)
|
public function index(Request $request){
|
||||||
{
|
|
||||||
$personas = Persona::withTrashed()->get();
|
$personas = Persona::withTrashed()->get();
|
||||||
|
|
||||||
return view('personas.index', [
|
// $personas = Persona::findOrFail(13);
|
||||||
"personas" => $personas
|
//$per = Persona::where('id', 1)->first();
|
||||||
]);
|
//$personas = Persona::where('apellido', 'Cursos, capacitaciones y formación')->get();
|
||||||
|
//$personas = Persona::where('apellido', 'like', '%Prod%')->get();
|
||||||
|
|
||||||
|
//$personas = Persona::orderBy('nombre', 'desc')->get();
|
||||||
|
|
||||||
|
//$personas = Persona::first();
|
||||||
|
//$personas = Persona::last();
|
||||||
|
/*Persona::count();*/
|
||||||
|
|
||||||
|
|
||||||
|
return view('personas.index', ["personas"=>$personas]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function show($id)
|
public function show($id){
|
||||||
{
|
$persona = Persona::findOrfail($id);
|
||||||
$persona = Persona::findOrFail($id);
|
return view('personas.show', ["per"=>$persona]);
|
||||||
|
|
||||||
return view('personas.show', [
|
|
||||||
"persona" => $persona
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function create()
|
public function destroy(Request $request, $id){
|
||||||
{
|
$personas = Persona::findOrfail($id);
|
||||||
|
$personas->delete();
|
||||||
|
$request->session()->flash('mensaje-success', 'La persona fue eliminada.');
|
||||||
|
return redirect('/personas');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function create(){
|
||||||
return view('personas.new');
|
return view('personas.new');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function store(Request $request)
|
public function store(Request $request){
|
||||||
{
|
|
||||||
$persona = new Persona();
|
$request->validate([
|
||||||
|
'apellido' => 'required|max:100',
|
||||||
|
'nombre' => 'required|unique:personas,nombre|regex:/^[a-zA-ZáéíóúñÁÉÍÓÚ]+( [a-zA-ZáéíóúñÁÉÍÓÚ]+)*$/|max:100',
|
||||||
|
//'dni' => 'required|numeric|digits_between:7,8',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'apellido.required' => 'el campo apellido debe ser requerido',
|
||||||
|
'apellido.max' => 'el campo apellido debe contener maximo 100 caracteres',
|
||||||
|
'nombre.required' => 'el campo nombre es requerido',
|
||||||
|
'nombre.unique' => 'el campo nombre no se puede repetir',
|
||||||
|
'nombre.regex' => 'el campo nombre solo debe contener letras',
|
||||||
|
'nombre.max' => 'el campo nombre debe contener un maximo de 100 caracteres',
|
||||||
|
|
||||||
$persona->fill([
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
$personas = new Persona();
|
||||||
|
$personas->fill([
|
||||||
'nombre' => $request->input('nombre'),
|
'nombre' => $request->input('nombre'),
|
||||||
'apellido' => $request->input('apellido'),
|
'apellido' => $request->input('apellido'),
|
||||||
'dni' => $request->input('dni'),
|
]);
|
||||||
]);
|
$personas->save();
|
||||||
|
$request->session()->flash('mensaje-success', 'La persona fue agregada.');
|
||||||
$persona->save();
|
|
||||||
|
|
||||||
return redirect('/personas');
|
return redirect('/personas');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function edit($id)
|
public function edit($id){
|
||||||
{
|
$persona = Persona::findOrfail($id);
|
||||||
$persona = Persona::findOrFail($id);
|
//$persona = Persona::where('id',$id)->first();
|
||||||
|
return view('personas.edit', ["per"=>$persona]);
|
||||||
return view('personas.edit', [
|
|
||||||
"persona" => $persona
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function update(Request $request, $id)
|
public function update(UpdatedPersonaRequest $request, $id){
|
||||||
{
|
$personas = Persona::findOrfail($id);
|
||||||
$persona = Persona::findOrFail($id);
|
$personas->fill([
|
||||||
|
|
||||||
$persona->fill([
|
|
||||||
'nombre' => $request->input('nombre'),
|
'nombre' => $request->input('nombre'),
|
||||||
'apellido' => $request->input('apellido'),
|
'apellido' => $request->input('apellido'),
|
||||||
'dni' => $request->input('dni'),
|
|
||||||
]);
|
]);
|
||||||
|
$personas->update();
|
||||||
$persona->update();
|
$request->session()->flash('mensaje-success', 'La persona fue modificada.');
|
||||||
|
return redirect('/personas');
|
||||||
return redirect('/personas');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function destroy($id)
|
public function restaurar(Request $request, $id){
|
||||||
{
|
$personas = Persona::withTrashed()->findOrfail($id);
|
||||||
$persona = Persona::findOrFail($id);
|
$personas->restore();
|
||||||
|
$request->session()->flash('mensaje-success', 'La persona fue restaurada.');
|
||||||
$persona->delete();
|
|
||||||
|
|
||||||
return redirect('/personas');
|
return redirect('/personas');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public function restaurar(Request $request, $id)
|
}
|
||||||
{
|
|
||||||
$persona = Persona::withTrashed()->findOrFail($id);
|
|
||||||
|
|
||||||
$persona->restore();
|
|
||||||
|
|
||||||
return redirect('/personas');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
42
app/Http/Requests/UpdatedPersonaRequest.php
Normal file
42
app/Http/Requests/UpdatedPersonaRequest.php
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class UpdatedPersonaRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'nombre' => 'required|regex:/^[a-zA-ZáéíóúñÁÉÍÓÚ]+( [a-zA-ZáéíóúñÁÉÍÓÚ]+)*$/|max:100|unique:personas,nombre,' . $this->route('persona') . ',id',
|
||||||
|
'apellido' => 'required',
|
||||||
|
'dni' => 'required'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function messages() {
|
||||||
|
|
||||||
|
return [
|
||||||
|
'nombre.required' => 'el campo nombre es requerido',
|
||||||
|
'nombre.regex' => 'el campo nombre solo debe contener letras',
|
||||||
|
'nombre.max' => 'el campo nombre debe contener un maximo de 100 caracteres',
|
||||||
|
'nombre.unique' => 'ya existe una persona con este nombre',
|
||||||
|
'apellido.required' => 'el campo apellido es requerido',
|
||||||
|
'dni.required' => 'el campo dni es requerido'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -13,7 +13,7 @@ class Persona extends Model
|
||||||
|
|
||||||
protected $table = 'personas';
|
protected $table = 'personas';
|
||||||
|
|
||||||
protected $primaryKey = 'id';
|
public $primaryKey = 'id';
|
||||||
|
|
||||||
public $timestamps = true;
|
public $timestamps = true;
|
||||||
|
|
||||||
|
|
@ -22,5 +22,4 @@ class Persona extends Model
|
||||||
'apellido',
|
'apellido',
|
||||||
'dni',
|
'dni',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
55
personas.sql
Normal file
55
personas.sql
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
-- phpMyAdmin SQL Dump
|
||||||
|
-- version 5.2.1
|
||||||
|
-- https://www.phpmyadmin.net/
|
||||||
|
--
|
||||||
|
-- Servidor: 127.0.0.1:3306
|
||||||
|
-- Tiempo de generación: 10-06-2026 a las 03:54:18
|
||||||
|
-- Versión del servidor: 8.3.0
|
||||||
|
-- Versión de PHP: 8.2.18
|
||||||
|
|
||||||
|
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
||||||
|
START TRANSACTION;
|
||||||
|
SET time_zone = "+00:00";
|
||||||
|
|
||||||
|
|
||||||
|
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||||
|
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
||||||
|
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
||||||
|
/*!40101 SET NAMES utf8mb4 */;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Base de datos: `mis_turnos`
|
||||||
|
--
|
||||||
|
|
||||||
|
-- --------------------------------------------------------
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Estructura de tabla para la tabla `personas`
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `personas`;
|
||||||
|
CREATE TABLE IF NOT EXISTS `personas` (
|
||||||
|
`id` int NOT NULL AUTO_INCREMENT,
|
||||||
|
`nombre` varchar(100) NOT NULL,
|
||||||
|
`apellido` varchar(100) NOT NULL,
|
||||||
|
`dni` varchar(20) NOT NULL,
|
||||||
|
`created_at` timestamp NULL DEFAULT NULL,
|
||||||
|
`updated_at` timestamp NULL DEFAULT NULL,
|
||||||
|
`deleted_at` timestamp NULL DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Volcado de datos para la tabla `personas`
|
||||||
|
--
|
||||||
|
|
||||||
|
INSERT INTO `personas` (`id`, `nombre`, `apellido`, `dni`, `created_at`, `updated_at`, `deleted_at`) VALUES
|
||||||
|
(3, 'Adrian', 'Tejeda', '36782848', NULL, NULL, NULL),
|
||||||
|
(4, 'Elena', 'Paz', '40687678', NULL, '2026-06-05 07:29:03', NULL),
|
||||||
|
(5, 'Raul', 'Garcia', '34562767', '2026-05-27 03:00:47', '2026-06-03 01:10:55', NULL),
|
||||||
|
(6, 'Maia', 'Torres', '43897909', '2026-06-05 07:25:35', '2026-06-05 07:29:23', NULL);
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||||
|
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
||||||
|
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||||
9
resources/views/compartido/errores.blade.php
Normal file
9
resources/views/compartido/errores.blade.php
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
@if ($errors->any())
|
||||||
|
<div class="alert alert-danger">
|
||||||
|
<ul>
|
||||||
|
@foreach ($errors->all() as $error)
|
||||||
|
<li>{{ $error }}</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
3
resources/views/compartido/mensajes.blade.php
Normal file
3
resources/views/compartido/mensajes.blade.php
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
@if (session('mensaje-success'))
|
||||||
|
<p class="alert alert-success">{{ session('mensaje-success') }}</p>
|
||||||
|
@endif
|
||||||
126
resources/views/layouts/admin.blade.php
Normal file
126
resources/views/layouts/admin.blade.php
Normal file
|
|
@ -0,0 +1,126 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="es">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<!-- viewport => hace que el sitio sea responsive en móviles -->
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<!-- Token CSRF de Laravel para proteger formularios -->
|
||||||
|
<meta name="csrf-token" content="{{ csrf_token() }}">
|
||||||
|
<!-- yield => permite que cada vista defina su título; si no lo define, se usa "MiApp" -->
|
||||||
|
<title>@yield('title','Sistema Taller')</title>
|
||||||
|
|
||||||
|
<!-- Bootstrap CSS v4.6.2:
|
||||||
|
- framework que da estilos listos para botones, formularios, grillas, etc. -->
|
||||||
|
<link rel="stylesheet"
|
||||||
|
href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
|
||||||
|
|
||||||
|
<!-- FontAwesome:
|
||||||
|
- librería de íconos (ej: fa-eye, fa-pencil, fa-remove, etc.). -->
|
||||||
|
<link rel="stylesheet"
|
||||||
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">
|
||||||
|
<!-- DataTables: -->
|
||||||
|
<link rel="stylesheet" href="https://cdn.datatables.net/1.13.8/css/dataTables.bootstrap4.min.css">
|
||||||
|
<link rel="stylesheet" href="https://cdn.datatables.net/buttons/2.4.2/css/buttons.bootstrap4.min.css">
|
||||||
|
<!-- @stack('styles') => permite que otras vistas agreguen CSS extra en esta sección -->
|
||||||
|
@stack('styles')
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- navbar => barra de navegación de Bootstrap -->
|
||||||
|
<!-- navbar-expand-lg => se expande en pantallas grandes (LG) -->
|
||||||
|
<!-- navbar-light => estilo de texto oscuro sobre fondo claro -->
|
||||||
|
<!-- bg-light => fondo gris claro -->
|
||||||
|
|
||||||
|
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||||
|
|
||||||
|
<!-- Nombre de la aplicación -->
|
||||||
|
<a class="navbar-brand" href="{{ url('/') }}">
|
||||||
|
MiApp
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<!-- Menú principal -->
|
||||||
|
<ul class="navbar-nav">
|
||||||
|
|
||||||
|
<!-- Personas -->
|
||||||
|
<li class="nav-item dropdown">
|
||||||
|
|
||||||
|
<a class="nav-link dropdown-toggle"
|
||||||
|
href="#"
|
||||||
|
data-toggle="dropdown">
|
||||||
|
|
||||||
|
Personas
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="dropdown-menu">
|
||||||
|
|
||||||
|
<a class="dropdown-item"
|
||||||
|
href="{{ route('personas.index') }}">
|
||||||
|
|
||||||
|
Listado
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a class="dropdown-item"
|
||||||
|
href="{{ route('personas.create') }}">
|
||||||
|
|
||||||
|
Nueva Persona
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<!-- Usuarios -->
|
||||||
|
<li class="nav-item dropdown">
|
||||||
|
|
||||||
|
<a class="nav-link dropdown-toggle"
|
||||||
|
href="#"
|
||||||
|
data-toggle="dropdown">
|
||||||
|
|
||||||
|
Usuarios
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="dropdown-menu">
|
||||||
|
|
||||||
|
<a class="dropdown-item" href="#">
|
||||||
|
Listado
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<a class="dropdown-item" href="#">
|
||||||
|
Nuevo Usuario
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
<!-- container => centra el contenido y le da márgenes automáticos laterales -->
|
||||||
|
<!-- py-4 => padding vertical (arriba y abajo) de 1.5rem (~24px) -->
|
||||||
|
<div class="container py-4">
|
||||||
|
<!-- yield('contenido') => espacio donde cada vista Blade inyecta su propio contenido -->
|
||||||
|
@yield('contenido')
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Dependencias JS -->
|
||||||
|
<!-- jQuery => requerido por Bootstrap 4 -->
|
||||||
|
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
|
||||||
|
<!-- Popper.js => requerido para tooltips, dropdowns y menús flotantes -->
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
|
||||||
|
<!-- Bootstrap JS => activa componentes interactivos como modales, menús, tooltips -->
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.min.js"></script>
|
||||||
|
|
||||||
|
<!-- DataTables -->
|
||||||
|
<script src="https://cdn.datatables.net/1.13.8/js/jquery.dataTables.min.js"></script>
|
||||||
|
<script src="https://cdn.datatables.net/1.13.8/js/dataTables.bootstrap4.min.js"></script>
|
||||||
|
|
||||||
|
<script src="https://cdn.datatables.net/buttons/2.4.2/js/dataTables.buttons.min.js"></script>
|
||||||
|
<script src="https://cdn.datatables.net/buttons/2.4.2/js/buttons.bootstrap4.min.js"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
|
||||||
|
<script src="https://cdn.datatables.net/buttons/2.4.2/js/buttons.html5.min.js"></script>
|
||||||
|
|
||||||
|
<!-- stack('scripts') => permite que otras vistas agreguen scripts extra -->
|
||||||
|
@stack('scripts')
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -1,48 +1,105 @@
|
||||||
<!doctype html>
|
@extends('layouts.admin')
|
||||||
<html lang="es">
|
@section('contenido')
|
||||||
|
|
||||||
<head>
|
<!-- row => fila del sistema de grillas de Bootstrap
|
||||||
<meta charset="utf-8">
|
justify-content-center => centra horizontalmente el contenido dentro de la fila
|
||||||
<title>Editar Persona</title>
|
align-items-center => alinea verticalmente los elementos de la fila -->
|
||||||
</head>
|
<div class="row justify-content-center align-items-center">
|
||||||
|
<!-- col-lg-11 col-md-11 col-sm-11 col-xs-11 =>
|
||||||
|
la columna ocupa 11/12 partes en todos los tamaños de pantalla -->
|
||||||
|
<div class="col-lg-11 col-md-11 col-sm-11 col-xs-11">
|
||||||
|
<h3>Editar Persona</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<body>
|
<div class="row">
|
||||||
|
<div class="col-md-10">
|
||||||
|
|
||||||
<h1>Editar Persona</h1>
|
<!-- Includes de Blade para mensajes de éxito y errores -->
|
||||||
|
@include('compartido.mensajes')
|
||||||
|
@include('compartido.errores')
|
||||||
|
|
||||||
<form method="POST"
|
</div>
|
||||||
action="{{ route('personas.update', $persona->id) }}">
|
</div>
|
||||||
|
|
||||||
@csrf
|
<br>
|
||||||
@method('PUT')
|
|
||||||
|
|
||||||
<p>
|
<!-- Formulario de edición de persona -->
|
||||||
Nombre:
|
<form method="POST"
|
||||||
<input type="text"
|
action="{{ route('personas.update', $per->id) }}"
|
||||||
name="nombre"
|
enctype="multipart/form-data">
|
||||||
value="{{ $persona->nombre }}">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
@csrf
|
||||||
Apellido:
|
@method('PUT') <!-- Indica a Laravel que el método real es PUT -->
|
||||||
<input type="text"
|
|
||||||
name="apellido"
|
|
||||||
value="{{ $persona->apellido }}">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
<!-- row => agrupa los campos en una fila -->
|
||||||
DNI:
|
<div class="row">
|
||||||
<input type="text"
|
|
||||||
name="dni"
|
|
||||||
value="{{ $persona->dni }}">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<button type="submit">
|
<!-- form-group => añade márgenes y separación entre los campos -->
|
||||||
Guardar Cambios
|
<!-- col-md-3 => cada campo ocupa 3/12 columnas en pantallas medianas o más grandes -->
|
||||||
</button>
|
<div class="form-group col-md-3">
|
||||||
|
|
||||||
</form>
|
<!-- form-check-label => estilo Bootstrap para etiquetas de formulario -->
|
||||||
|
<label for="nombre" class="form-check-label">Nombre (*)</label>
|
||||||
|
|
||||||
</body>
|
<!-- form-control => da estilo uniforme al input -->
|
||||||
|
<input type="text"
|
||||||
|
name="nombre"
|
||||||
|
id="nombre"
|
||||||
|
class="form-control"
|
||||||
|
value="{{ old('nombre', $per->nombre) }}">
|
||||||
|
</div>
|
||||||
|
|
||||||
</html>
|
<div class="form-group col-md-3">
|
||||||
|
<label for="apellido" class="form-check-label">Apellido (*)</label>
|
||||||
|
|
||||||
|
<input type="text"
|
||||||
|
name="apellido"
|
||||||
|
id="apellido"
|
||||||
|
class="form-control"
|
||||||
|
value="{{ old('apellido', $per->apellido) }}">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group col-md-3">
|
||||||
|
<label for="dni" class="form-check-label">DNI (*)</label>
|
||||||
|
|
||||||
|
<input type="text"
|
||||||
|
name="dni"
|
||||||
|
id="dni"
|
||||||
|
class="form-control"
|
||||||
|
value="{{ old('dni', $per->dni) }}">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- row justify-content-center align-items-center =>
|
||||||
|
fila que centra horizontal y verticalmente los botones -->
|
||||||
|
<div class="row justify-content-center align-items-center">
|
||||||
|
|
||||||
|
<div class="col-md-2">
|
||||||
|
<!-- btn => clase base de Bootstrap para botones
|
||||||
|
btn-success => verde (acción positiva)
|
||||||
|
btn-block => ocupa todo el ancho de la columna
|
||||||
|
btn-lg => tamaño grande -->
|
||||||
|
<button class="btn btn-success btn-block btn-lg">Guardar</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-2">
|
||||||
|
<!-- btn-primary => azul (acción principal)
|
||||||
|
title="Salir" => tooltip al pasar el mouse -->
|
||||||
|
<a href="{{ route('personas.index') }}"
|
||||||
|
class="btn btn-primary btn-block btn-lg"
|
||||||
|
title="Salir">Salir</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script>
|
||||||
|
//Aquí se pueden agregar scripts específicos de esta vista -->
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
|
|
|
||||||
|
|
@ -1,83 +1,130 @@
|
||||||
<!doctype html>
|
@extends('layouts.admin')
|
||||||
<html lang="es">
|
@section('contenido')
|
||||||
|
|
||||||
<head>
|
<!-- row => fila del sistema de grillas Bootstrap
|
||||||
<meta charset="utf-8">
|
justify-content-center => centra horizontalmente los contenidos
|
||||||
<title>Personas</title>
|
align-items-center => centra verticalmente
|
||||||
</head>
|
no centran el texto, centran las columnas dentro de la fila
|
||||||
|
-->
|
||||||
|
|
||||||
<body>
|
<div class="row justify-content-center align-items-center">
|
||||||
|
<!-- col-12 => ocupa todo el ancho en pantallas pequeñas
|
||||||
|
col-md-11 => ocupa 11/12 del ancho en pantallas medianas o mayores -->
|
||||||
|
<div class="col-12 col-md-11">
|
||||||
|
<h3>Listado de Personas</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<h1>Listado de Personas</h1>
|
<div class="row justify-content-center align-items-center">
|
||||||
|
<div class="col-md-2">
|
||||||
|
<!-- btn => estilo de botón Bootstrap
|
||||||
|
btn-success => verde (acción positiva)
|
||||||
|
btn-block => ocupa todo el ancho de la columna
|
||||||
|
btn-lg => tamaño grande -->
|
||||||
|
<a href="{{ route('personas.create') }}"
|
||||||
|
class="btn btn-success btn-block btn-lg"
|
||||||
|
title="Nueva Persona">
|
||||||
|
Nuevo
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<p>
|
<br>
|
||||||
<a href="{{ route('personas.create') }}">
|
|
||||||
Nueva Persona
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul>
|
<div class="row justify-content-center align-items-center">
|
||||||
|
<div class="col-12 col-md-11">
|
||||||
|
|
||||||
@foreach($personas as $cat)
|
<!-- Includes de Blade para mensajes de éxito y errores -->
|
||||||
|
@include('compartido.mensajes')
|
||||||
|
@include('compartido.errores')
|
||||||
|
|
||||||
<li>
|
<!-- table-responsive => hace que la tabla sea "scrollable" en pantallas pequeñas -->
|
||||||
|
<div class="table-responsive">
|
||||||
|
|
||||||
<strong>{{ $cat->nombre }}</strong>
|
<!-- table => tabla con estilos básicos
|
||||||
|
table-striped => filas alternadas con fondo gris
|
||||||
|
table-bordered => agrega bordes a todas las celdas
|
||||||
|
table-hover => resalta la fila al pasar el mouse -->
|
||||||
|
<table class="table table-striped table-bordered table-hover" id="example">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Id</th>
|
||||||
|
<th>Nombre</th>
|
||||||
|
<th>Apellido</th>
|
||||||
|
<th>DNI</th>
|
||||||
|
<th>Acciones</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($personas as $per)
|
||||||
|
<tr>
|
||||||
|
<td>{{ $per->id }}</td>
|
||||||
|
<td>{{ $per->nombre }}</td>
|
||||||
|
<td>{{ $per->apellido }}</td>
|
||||||
|
<td>{{ $per->dni }}</td>
|
||||||
|
<td align="center">
|
||||||
|
|
||||||
- {{ $cat->apellido }}
|
@if($per->deleted_at == null)
|
||||||
|
<form method="POST" action="{{ route('personas.destroy', $per->id) }}" style="display:inline;">
|
||||||
|
@csrf
|
||||||
|
@method('DELETE')
|
||||||
|
|
||||||
- {{ $cat->dni }}
|
<!-- btn-info => azul claro (información) -->
|
||||||
|
<a class="btn btn-info"
|
||||||
|
href="{{ route('personas.show', $per->id) }}"
|
||||||
|
title="Ver más">
|
||||||
|
<i class="fa fa-eye"></i>
|
||||||
|
</a>
|
||||||
|
|
||||||
(ID: {{ $cat->id }})
|
<!-- btn-warning => amarillo (advertencia / editar) -->
|
||||||
|
<a class="btn btn-warning"
|
||||||
|
|
href="{{ route('personas.edit', $per->id) }}"
|
||||||
@if($cat->deleted_at == null)
|
title="Editar">
|
||||||
<a href="{{ route('personas.show', $cat->id) }}">
|
<i class="fa fa-pencil"></i>
|
||||||
Ver Más
|
</a>
|
||||||
</a>
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
||||||
<a href="{{ route('personas.edit', $cat->id) }}">
|
|
||||||
Editar
|
|
||||||
</a>
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
||||||
<form action="{{ route('personas.destroy', $cat->id) }}"
|
|
||||||
method="POST"
|
|
||||||
style="display:inline;">
|
|
||||||
|
|
||||||
@csrf
|
|
||||||
@method('DELETE')
|
|
||||||
|
|
||||||
<button type="submit">
|
|
||||||
Eliminar
|
|
||||||
</button>
|
|
||||||
|
|
||||||
|
<!-- btn-danger => rojo (acción destructiva como eliminar) -->
|
||||||
|
<button class="btn btn-danger"
|
||||||
|
onclick="return confirm('¿Está seguro de eliminar la persona?');"
|
||||||
|
title="Eliminar">
|
||||||
|
<i class="fa fa-remove"></i>
|
||||||
|
</button>
|
||||||
</form>
|
</form>
|
||||||
@else
|
@else
|
||||||
|
<form method="POST" action="{{ route('personas.restaurar', $per->id) }}" style="display:inline;">
|
||||||
<form action="{{ route('personas.restaurar', $cat->id) }}"
|
@csrf
|
||||||
method="POST"
|
@method('PUT')
|
||||||
style="display:inline;">
|
|
||||||
|
|
||||||
@csrf
|
|
||||||
@method('PUT')
|
|
||||||
|
|
||||||
<button type="submit">
|
|
||||||
RESTAURAR
|
|
||||||
</button>
|
|
||||||
|
|
||||||
|
<!-- btn-danger => rojo (acción destructiva como eliminar) -->
|
||||||
|
<button class="btn btn-success"
|
||||||
|
onclick="return confirm('¿Está seguro de Restaurar la persona?');"
|
||||||
|
title="Restaurar">
|
||||||
|
<i class="fa fa-undo"></i>
|
||||||
|
</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
@endif
|
@endif
|
||||||
</li>
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
@endforeach
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</ul>
|
@endsection
|
||||||
|
@push('styles')
|
||||||
|
|
||||||
</body>
|
@endpush
|
||||||
|
@push('scripts')
|
||||||
</html>
|
<script>
|
||||||
|
// DataTables (plugin JS para mejorar tablas: búsqueda, paginación, exportación)
|
||||||
|
$('#example').DataTable({
|
||||||
|
dom: 'Bfrtip',
|
||||||
|
buttons: ['excel'],
|
||||||
|
pageLength: 5,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
|
|
@ -1,58 +1,92 @@
|
||||||
<!doctype html>
|
@extends('layouts.admin')
|
||||||
<html lang="es">
|
@section ('contenido')
|
||||||
|
|
||||||
<head>
|
<!-- row => fila del sistema de grillas de Bootstrap
|
||||||
<meta charset="utf-8">
|
justify-content-center => centra horizontalmente el contenido dentro de la fila
|
||||||
<title>Nueva Persona</title>
|
align-items-center => centra verticalmente los elementos dentro de la fila -->
|
||||||
</head>
|
<div class="row justify-content-center align-items-center">
|
||||||
|
<!-- col-lg-11 col-md-11 col-sm-11 col-xs-11 =>
|
||||||
|
la columna ocupa 11/12 partes del ancho en todos los tamaños de pantalla -->
|
||||||
|
<div class="col-lg-11 col-md-11 col-sm-11 col-xs-11">
|
||||||
|
<h3>Nueva Persona</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<body>
|
<div class="row">
|
||||||
|
<div class="col-md-10">
|
||||||
|
|
||||||
<h1>Nueva Persona</h1>
|
<!-- Includes de Blade para mensajes de éxito y errores -->
|
||||||
|
@include('compartido.mensajes')
|
||||||
|
@include('compartido.errores')
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<form method="POST"
|
</br>
|
||||||
action="{{ route('personas.store') }}">
|
|
||||||
|
|
||||||
|
<!-- Formulario para crear nueva persona -->
|
||||||
|
<form method="post" action="{{ route('personas.store') }}" enctype=multipart/form-data>
|
||||||
@csrf
|
@csrf
|
||||||
|
|
||||||
|
<!-- row => agrupa los campos en una fila -->
|
||||||
|
<div class="row">
|
||||||
|
|
||||||
<div>
|
<!-- form-group => separa cada campo del formulario con márgenes
|
||||||
<label>Nombre</label><br>
|
col-md-3 => ocupa 3/12 columnas en pantallas medianas hacia arriba -->
|
||||||
|
<div class="form-group col-md-3">
|
||||||
|
<!-- form-check-label => clase de Bootstrap que estiliza etiquetas de formulario -->
|
||||||
|
<label for="nombre" class="form-check-label">Nombre (*)</label>
|
||||||
|
|
||||||
<input type="text"
|
<!-- form-control => aplica estilos consistentes al input-->
|
||||||
name="nombre"
|
<input type="text"
|
||||||
required>
|
name="nombre"
|
||||||
|
id="nombre"
|
||||||
|
value="{{ old('nombre') }}"
|
||||||
|
class="form-control">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group col-md-3">
|
||||||
|
<label for="apellido" class="form-check-label">Apellido (*)</label>
|
||||||
|
<input type="text"
|
||||||
|
name="apellido"
|
||||||
|
id="apellido"
|
||||||
|
value="{{ old('apellido') }}"
|
||||||
|
class="form-control">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group col-md-3">
|
||||||
|
<label for="dni" class="form-check-label">DNI (*)</label>
|
||||||
|
<input type="text"
|
||||||
|
name="dni"
|
||||||
|
id="dni"
|
||||||
|
value="{{ old('dni') }}"
|
||||||
|
class="form-control">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="margin-top:10px;">
|
<!-- row justify-content-center align-items-center =>
|
||||||
<label>Apellido</label><br>
|
crea una fila y centra horizontal y verticalmente los botones -->
|
||||||
|
<div class="row justify-content-center align-items-center">
|
||||||
<input type="text"
|
<div class="col-md-2">
|
||||||
name="apellido"
|
<!-- btn => botón base de Bootstrap
|
||||||
required>
|
btn-success => color verde
|
||||||
</div>
|
btn-block => ocupa todo el ancho de la columna
|
||||||
|
btn-lg => tamaño grande -->
|
||||||
<div style="margin-top:10px;">
|
<button class="btn btn-success btn-block btn-lg">Guardar</button>
|
||||||
<label>DNI</label><br>
|
</div>
|
||||||
|
|
||||||
<input type="text"
|
|
||||||
name="dni"
|
|
||||||
required>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="margin-top:15px;">
|
|
||||||
|
|
||||||
<button type="submit">
|
|
||||||
Guardar
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<a href="{{ route('personas.index') }}">
|
|
||||||
Volver
|
|
||||||
</a>
|
|
||||||
|
|
||||||
|
<div class="col-md-2">
|
||||||
|
<!-- btn-primary => color azul
|
||||||
|
title="Salir" => muestra tooltip al pasar el mouse -->
|
||||||
|
<a href="{{ route('personas.index') }}" class="btn btn-primary btn-block btn-lg" title="Salir">Salir</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
</body>
|
@endsection
|
||||||
</html>
|
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script>
|
||||||
|
//Aquí podrías agregar código JavaScript específico para esta vista
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
|
|
|
||||||
|
|
@ -1,47 +1,36 @@
|
||||||
<!doctype html>
|
@extends('layouts.admin')
|
||||||
<html lang="es">
|
@section ('contenido')
|
||||||
|
<div class="row justify-content-center align-items-center">
|
||||||
|
<div class="col-lg-11 col-md-11 col-sm-11 col-xs-11">
|
||||||
|
<h3>Ver Persona</h3>
|
||||||
|
<div class="progress" style="height: 2px;"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</br>
|
||||||
|
|
||||||
<head>
|
<div class="row">
|
||||||
<meta charset="utf-8">
|
<div class="form-group col-md-3">
|
||||||
<title>Ver Persona</title>
|
<label for="nombre" class="form-check-label">Nombre (*)</label>
|
||||||
</head>
|
<input type="text" name="nombre" id="nombre" class="form-control" value="{{$per->nombre}}" readonly>
|
||||||
|
</div>
|
||||||
|
|
||||||
<body>
|
<div class="form-group col-md-3">
|
||||||
|
<label for="apellido" class="form-check-label">Apellido (*)</label>
|
||||||
|
<input type="text" name="apellido" id="apellido" class="form-control" value="{{$per->apellido}}" readonly>
|
||||||
|
</div>
|
||||||
|
|
||||||
<h1>Ver Persona</h1>
|
<div class="form-group col-md-3">
|
||||||
|
<label for="dni" class="form-check-label">DNI (*)</label>
|
||||||
<div>
|
<input type="text" name="dni" id="dni" class="form-control" value="{{$per->dni}}" readonly>
|
||||||
<label>Nombre</label><br>
|
</div>
|
||||||
|
|
||||||
<input type="text"
|
|
||||||
readonly
|
|
||||||
value="{{ $persona->nombre }}">
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="margin-top:10px;">
|
<legend></legend>
|
||||||
<label>Apellido</label><br>
|
|
||||||
|
|
||||||
<input type="text"
|
<div class="row justify-content-center align-items-center">
|
||||||
readonly
|
<div class="col-md-2">
|
||||||
value="{{ $persona->apellido }}">
|
<a href="{{ route('personas.index') }}" class="btn btn-primary btn-block btn-lg" title="Salir">Salir</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="margin-top:10px;">
|
@endsection
|
||||||
<label>DNI</label><br>
|
|
||||||
|
|
||||||
<input type="text"
|
|
||||||
readonly
|
|
||||||
value="{{ $persona->dni }}">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="margin-top:15px;">
|
|
||||||
|
|
||||||
<a href="{{ route('personas.index') }}">
|
|
||||||
Volver
|
|
||||||
</a>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,27 +2,30 @@
|
||||||
|
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
use App\Http\Controllers\PersonaController;
|
use App\Http\Controllers\PersonaController;
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Web Routes
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Here is where you can register web routes for your application. These
|
||||||
|
| routes are loaded by the RouteServiceProvider and all of them will
|
||||||
|
| be assigned to the "web" middleware group. Make something great!
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
/*Route::get('personas', [PersonaController::class, 'index'])
|
Route::get('/', function () {
|
||||||
->name('personas.index');
|
return view('welcome');
|
||||||
|
});
|
||||||
|
|
||||||
Route::get('personas/create', [PersonaController::class, 'create'])
|
/*Route::get('personas', [PersonaController::class, 'index'])->name('personas.index');
|
||||||
->name('personas.create');
|
Route::post('personas', [PersonaController::class, 'store'])->name('personas.store');
|
||||||
|
Route::get('personas/create', [PersonaController::class, 'create'])->name('personas.create');
|
||||||
|
Route::get('personas/{persona}', [PersonaController::class, 'show'])->name('personas.show');
|
||||||
|
Route::delete('personas/{persona}', [PersonaController::class, 'destroy'])->name('personas.destroy');
|
||||||
|
Route::get('personas/{persona}/edit', [PersonaController::class, 'edit'])->name('personas.edit');
|
||||||
|
Route::put('personas/{persona}', [PersonaController::class, 'update'])->name('personas.update');*/
|
||||||
|
|
||||||
Route::post('personas', [PersonaController::class, 'store'])
|
|
||||||
->name('personas.store');
|
|
||||||
|
|
||||||
Route::get('personas/{persona}', [PersonaController::class, 'show'])
|
|
||||||
->name('personas.show');
|
|
||||||
|
|
||||||
Route::get('personas/edit/{persona}', [PersonaController::class, 'edit'])
|
|
||||||
->name('personas.edit');
|
|
||||||
|
|
||||||
Route::put('personas/update/{persona}', [PersonaController::class, 'update'])
|
|
||||||
->name('personas.update');
|
|
||||||
|
|
||||||
Route::delete('personas/{persona}', [PersonaController::class, 'destroy'])
|
|
||||||
->name('personas.destroy'); */
|
|
||||||
|
|
||||||
|
Route::resource('personas', PersonaController::class);
|
||||||
Route::put('personas/restaurar/{persona}', [PersonaController::class, 'restaurar'])->name('personas.restaurar');
|
Route::put('personas/restaurar/{persona}', [PersonaController::class, 'restaurar'])->name('personas.restaurar');
|
||||||
Route::resource('personas', PersonaController::class);
|
|
||||||
Loading…
Reference in New Issue
Block a user