Codeigniter - Menu dinamico

 
Vista:
sin imagen de perfil
Val: 1
Ha mantenido su posición en Codeigniter (en relación al último mes)
Gráfica de Codeigniter

Menu dinamico

Publicado por Martin (1 intervención) el 03/06/2020 21:22:36
Hola estoy desarrollando un sistema de ventas usando el framework CodeIgniter 4 y me tope con un problema, necesito hacer que el menú se construya diatónicamente leyendo desde una tabla las opciones hasta ahi todo bien pero al momento de pasarlo a la vista noto que debo hacerlo desde cada controlador de la siguiente forma:

return view('home/index.php', $opciones);

Pero quiero evitar tener que hacer eso cada vez que llamo a la vista, es decir hay alguna forma de hacer una sola vez la carga en la vista y que se visualice el menú en el resto de las pantallas?

yo estoy trabajando con templates por lo que cada vista extend de una plantilla donde incluyo las diferentes partes.

Pense en hacerlo usando librerias pero no supe como cargarla desde la plantilla padre, o crear una subclase de BaseController y usar esta subclase y sobrecargarla con dicha funcionalidad pero tampoco pude.

Espero se entienda lo que necesito.

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Cómo cargar menú en plantilla

Publicado por Alejandro (44 intervenciones) el 04/09/2023 16:13:35
Puedes resolver este problema en CodeIgniter 4 cargando el menú en una variable global que esté disponible en todas las vistas sin tener que pasarla explícitamente desde cada controlador. Aquí tienes una forma de hacerlo:

1. En tu archivo `app/Config/Events.php`, puedes usar el evento `beforeController` para cargar las opciones del menú desde la base de datos y luego almacenarlas en una variable global que esté disponible en todas las vistas. Debes crear un archivo de eventos personalizado si aún no lo tienes:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// app/Config/Events.php
 
use App\Controllers\BaseController;
use CodeIgniter\Events\Events;
 
Events::on('beforeController', function () {
    // Carga las opciones del menú desde la base de datos o cualquier otra fuente
    $menuOptions = cargarMenuDesdeLaTabla(); // Reemplaza esto con tu lógica real
 
    // Accede a la instancia actual del controlador
    $controller = BaseController::getSharedInstance();
 
    // Almacena las opciones del menú en una variable global
    $controller->menuOptions = $menuOptions;
});

2. Asegúrate de tener un método en tu controlador base (`BaseController`) para cargar las opciones del menú desde la base de datos o cualquier otra fuente que desees:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// app/Controllers/BaseController.php
 
namespace App\Controllers;
 
use CodeIgniter\Controller;
 
class BaseController extends Controller
{
    // Otras configuraciones de BaseController
 
    public function cargarMenuDesdeLaTabla()
    {
        // Aquí coloca tu lógica para cargar el menú desde la tabla
        return $menuOptions;
    }
}

3. En tu plantilla base, que todas tus vistas extienden, puedes acceder a la variable global `$menuOptions` para generar el menú en la vista:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- app/Views/templates/base.php -->
 
<!DOCTYPE html>
<html>
<head>
    <!-- Otras etiquetas head -->
</head>
<body>
    <!-- Tu código HTML común de la plantilla -->
 
    <!-- Genera el menú utilizando las opciones almacenadas en $menuOptions -->
    <ul>
        <?php foreach ($menuOptions as $opcion): ?>
            <li><?= esc($opcion); ?></li>
        <?php endforeach; ?>
    </ul>
 
    <!-- Contenido de la vista hija -->
    <?= $this->renderSection('content'); ?>
 
    <!-- Otras etiquetas footer y scripts -->
</body>
</html>

4. En tus vistas hijas, simplemente extiende la plantilla base y define el contenido específico de cada página:

1
2
3
4
5
6
7
8
9
<!-- app/Views/home/index.php -->
 
<?= $this->extend('templates/base'); ?>
 
<?= $this->section('content'); ?>
<!-- Contenido específico de la página de inicio -->
<h1>Bienvenido a la página de inicio</h1>
<!-- Otros elementos de la página -->
<?= $this->endSection(); ?>

Con estos pasos, el menú se cargará una vez en el evento `beforeController` y estará disponible en todas tus vistas sin necesidad de pasar las opciones del menú explícitamente desde cada controlador.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar