Manejo de formularios en varios tabs en laravel 8

 Llevo poco tiempo utilizando lavavel como framework de desarrollo de aplicaciones con lenguaje Php, actualmente estoy usando la version de laravel 8. En lo personal es muy intuitivo , lo recomiendo.

Me encontré con una situación, en mi aplicación tengo un pagina para la edición de usuarios, esta cuenta con un tab de 3 pestañas, Formulario, Roles y Permisos.














Cuento con 3 formularios, uno en cada pestaña . El problema radica que al enviar cualquiera de los 3 formularios, siempre se va a mostrar el tab 1 del formulario de usuarios. Esto no daría una buena experiencia para le usuario. Para tratar de solucionarlo, intente usar variables de sesión pero obtuve al 100 el resultado que esperaba, por lo tanto opté por el caché.

En primer instancia creo una  variable de cache "tabusuario" con el valor de 1 cada vez que llamo al método update del controlador UserController.php.

public function update(User $user,UpdateUserRequest $request){
        $user->update($request->validated());
        Cache::put('tabusuario'1);
        return back()->with('status',  'El usuario '.$request->name.' se ha actualizado satisfactoriamente');
    }

Por otra parte asigno el valor de 2 a la variable de cache "tabusuario" cuando llamo al metodo store del controlador UserRolesController.php

public function store(User $user,Request $request){
        $validacion = $request->validateWithBag('erolesusers',[
            'role' => 'bail|required',
        ]);
        Cache::put('tabusuario'2);
        $user->syncRoles($validacion);
        return back()->withInput();
    }

Y de la misma forma para el 3 formulario.

En la vista userEdit.blade.php en el nav de las tab hice la siguiente validación utilizando los el motor de plantilla blade de laravel.

Primero valide si existe una variable de cache "tabusuario", si es correcto en cada uno de los elementos li , en la clase de las etiquetas a , agregue la validación según el numero de formulario,

@if (cache()->has('tabusuario') == true)
                <li class="nav-item"><a class="nav-link @if(cache()->get('tabusuario') == 1{{'active'}} @endif" href="#formulario" data-toggle="tab"> Formulario de usuarios</a></li>
                <li class="nav-item"><a class="nav-link @if(cache()->get('tabusuario') == 2{{'active'}} @endif" href="#rolesypermisos" data-toggle="tab"> Roles y permiso</a></li>
                <li class="nav-item"><a class="nav-link @if(cache()->get('tabusuario') == 3{{'active'}} @endif" href="#permissions" data-toggle="tab">Permisos especiales</a></li>
            @else
                <li class="nav-item"><a class="nav-link active" href="#formulario" data-toggle="tab"> Formulario de usuarios</a></li>
                <li class="nav-item"><a class="nav-link" href="#rolesypermisos" data-toggle="tab"> Roles y permiso</a></li>
                <li class="nav-item"><a class="nav-link" href="#permissions" data-toggle="tab">Permisos especiales</a></li>
            @endif

En la parte de los tabs realicé la misma validación. Si no existe ninguna variable se agregara el active a la primera tab.

<div class="tab-content">
        @if (cache()->has('tabusuario') == true)
            @if(cache()->get('tabusuario') == 1)
                <div class="active tab-pane" id="formulario">
            @else
                <div class="tab-pane" id="formulario">
            @endif
        @else
            <div class="active tab-pane" id="formulario">
        @endif

Luego realizamos la misma validación para los n tabs que tengamos.

@if(cache()->has('tabusuario') == true and cache()->get('tabusuario') == 2)
            <div class="active tab-pane" id="rolesypermisos">
        @else
            <div class="tab-pane" id="rolesypermisos">
        @endif

Espero les haya servido, la verdad no se si sea una de las mejores practicas para este tipo de cosas la memoria en caché. Si tienen algún problema, alguna novedad o alguna recomendación, me la dejan en los comentarios.

Comentarios

Entradas más populares de este blog

USO DE DBLINK EN FUNCIONES DE POSTGRESQL(PARTE UNO)

PASAR UN ARRAY COMO PARAMETRO A UNA FUNCION DE POSTGRESQL (PARTE UNO)

Codeigniter solucion de :A PHP Error was encountered