2 diciembre, 2020
Para implementar select dependientes en Laravel necesitamos tres modelos, la API nativa Fetch de Javascript para realizar la peticiones mediante promesas.
Suscríbete a nuestro canal en Youtube
SuscríbirseEn este caso programaremos un ejemplo de Selects dependientes de tres niveles con la API Fetch de JS y Laravel. Para ello, antes se usaba comunmente Jquery, hoy en dia contamos con una solución nativa que requiere de menos líneas de código y la mayoría de navegadores modernos ya lo soportan. Entonces:
Inicialmente; vamos a usar un proyecto en Laravel 8, debidamente instalado, con la conexión a la base de datos correctamente sobre XAMPP y VisuAL Studio Code y un navegador para ver lo resultados. Veamos entonces :
Tres tablas debidamente relacionadas, aunque no vayamos a emplear la relaciones para este tutorial.
En el archivo routes/web.php
<?php
use Illuminate\Support\Facades\Route;
Route::get('/pruebas', [App\Http\Controllers\PruebasController::class, 'index']);
Route::post('/subcategorias', [App\Http\Controllers\PruebasController::class, 'subcategorias']);
Route::post('/empresas', [App\Http\Controllers\PruebasController::class, 'empresas']);
Instaciamos los modelos y los métodos y consultas para extraer registros de acuerdo a cada petición http. Veamos el código:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Categoria;
use App\Models\Subcategoria;
use App\Models\Empresa;
class PruebasController extends Controller
{
public function index(){
$categorias = Categoria::all();
return view("welcome",compact("categorias"));
}
public function subcategorias(Request $request){
if(isset($request->texto)){
$subcategorias = Subcategoria::whereCategoria_id($request->texto)->get();
return response()->json(
[
'lista' => $subcategorias,
'success' => true
]
);
}else{
return response()->json(
[
'success' => false
]
);
}
}
public function empresas(Request $request){
if(isset($request->texto)){
$empresas = Empresa::whereSubcategoria_id($request->texto)->get();
return response()->json(
[
'lista' => $empresas,
'success' => true
]
);
}else{
return response()->json(
[
'success' => false
]
);
}
}
}
En la única vista codeamos html básico con los respectivos select html para cada modelo identificados con su id correspondiente.
Implementamos la API fetch para cada evento change del select de categorias y subcategorias. Veamos el código html y javascript.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="csrf-token" content="{{ csrf_token() }}">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>SELECT DEPENDIENTES DE TRES NIVELES</title>
</head>
<body>
<div>
<select name="" id="_categoria">
@foreach ($categorias as $item)
<option value="{{$item->id}}">{{$item->nombre}}</option>
@endforeach
</select>
<select name="" id="_subcategoria"></select>
<select name="" id="_empresa"></select>
</div>
<script>
const csrfToken = document.head.querySelector("[name~=csrf-token][content]").content;
document.getElementById('_categoria').addEventListener('change',(e)=>{
fetch('subcategorias',{
method : 'POST',
body: JSON.stringify({texto : e.target.value}),
headers:{
'Content-Type': 'application/json',
"X-CSRF-Token": csrfToken
}
}).then(response =>{
return response.json()
}).then( data =>{
var opciones ="<option value=''>Elegir</option>";
for (let i in data.lista) {
opciones+= '<option value="'+data.lista[i].id+'">'+data.lista[i].nombre+'</option>';
}
document.getElementById("_subcategoria").innerHTML = opciones;
}).catch(error =>console.error(error));
})
document.getElementById('_subcategoria').addEventListener('change',(e)=>{
fetch('empresas',{
method : 'POST',
body: JSON.stringify({texto : e.target.value}),
headers:{
'Content-Type': 'application/json',
"X-CSRF-Token": csrfToken
}
}).then(response =>{
return response.json()
}).then( data =>{
var opciones ="<option value=''>Elegir</option>";
for (let i in data.lista) {
opciones+= '<option value="'+data.lista[i].id+'">'+data.lista[i].nombre+'</option>';
}
document.getElementById("_empresa").innerHTML = opciones;
}).catch(error =>console.error(error));
})
</script>
</body>
</html>
Leido 16780 veces | 6 usuarios
95 descargas
Para descargar el código crea una cuenta
Crear cuenta© Copyright Codea::App Cursos de Programación Online | LATAM | 2020 - 2024