Librería

Funciones para mostrar nombres combinados de 3 tablas relacionadas; se puede utiliza en cualquier controlador, para generar vistas y formularios legibles.

Aunque contenga "Helper" en el nombre, es realmente una Librería porque encapsula lógica y maneja instancias de modelos.

app/Libraries/AsignacionHelper.php

<?php
namespace App\Libraries;
use App\Models\AsignacionModel;
use App\Models\GrupoModel;
use App\Models\MateriaModel;

class AsignacionHelper {
    protected $asignacionModel;
    protected $grupoModel;
    protected $materiaModel;

    public function __construct() {
        // Instanciar los modelos
        $this->asignacionModel = new AsignacionModel();
        $this->grupoModel = new GrupoModel();
        $this->materiaModel = new MateriaModel();
    }

    /**
     * Concatenar nombres de Grupo y Materia.
     *
     * @param int $asignacionId
     * @return string
     */
    public function getGrupoMateriaNombre($asignacionId) {
        // Obtener la asignación usando el asignacion_id
        $asignacion = $this->asignacionModel->find($asignacionId);

        if ($asignacion) {
            // Obtener el nombre del grupo usando grupo_id de la asignación
            $grupo = $this->grupoModel->find($asignacion['grupo_id']);
            $grupoNombre = $grupo ? $grupo['nombre'] : 'N/A';

            // Obtener el nombre de la materia usando materia_id de la asignación
            $materia = $this->materiaModel->find($asignacion['materia_id']);
            $materiaNombre = $materia ? $materia['nombre'] : 'N/A';

            // Concatenar y devolver los nombres
            return $grupoNombre . ' - ' . $materiaNombre;
        }

        // Si no se encuentra la asignación, devuelve N/A
        return 'N/A';
    }

    /**
     * Generar un select HTML para los formularios.
     *
     * @param string $selectedValue
     * @return string
     */
    public function generateGrupoMateriaSelect($selectedValue = null) {
        // Obtener todas las asignaciones
        $asignaciones = $this->asignacionModel->findAll();
        $options = '<select name="asignacion_id" class="form-control">';
        $options .= '<option value="">Seleccione Grupo - Materia</option>';

        // Construir las opciones concatenadas de Grupo - Materia
        foreach ($asignaciones as $asignacion) {
            $grupo = $this->grupoModel->find($asignacion['grupo_id']);
            $materia = $this->materiaModel->find($asignacion['materia_id']);
            $grupoNombre = $grupo ? $grupo['nombre'] : 'N/A';
            $materiaNombre = $materia ? $materia['nombre'] : 'N/A';

            // Marcar la opción seleccionada
            $selected = $asignacion['id_asignacion'] == $selectedValue ? 'selected' : '';
            $options .= '<option value="' . $asignacion['id_asignacion'] . '" ' . $selected . '>' . $grupoNombre . ' - ' . $materiaNombre . '</option>';
        }

        $options .= '</select>';
        return $options;
    }
}

Modelos

app/Models/AsignacionModel.php

<?php
namespace App\Models;
use CodeIgniter\Model;

class AsignacionModel extends Model {
    protected $table = 'Asignaciones';
    protected $primaryKey = 'id_asignacion';

    protected $useAutoIncrement = true;
    protected $returnType = 'array';
    protected $useSoftDeletes = false;

    protected $allowedFields = ['grupo_id', 'materia_id'];
}

app/Models/GrupoModel.php

<?php
namespace App\Models;
use CodeIgniter\Model;

class GrupoModel extends Model {
    protected $table = 'Grupos';
    protected $primaryKey = 'id_grupo';

    protected $useAutoIncrement = true;
    protected $returnType = 'array';
    protected $useSoftDeletes = false;

    protected $allowedFields = ['nombre'];
}

app/Models/MateriaModel.php

<?php
namespace App\Models;
use CodeIgniter\Model;

class MateriaModel extends Model {
    protected $table = 'Materias';
    protected $primaryKey = 'id_materia';

    protected $useAutoIncrement = true;
    protected $returnType = 'array';
    protected $useSoftDeletes = false;

    protected $allowedFields = ['nombre'];
}

Controlador de Grocery CRUD

// Cargar la librería AsignacionHelper
$asignacionHelper = new \App\Libraries\AsignacionHelper();

// Usa callbackColumn para mostrar los nombres concatenados de grupo y materia en la lista
$crud->callbackColumn('asignacion_id', function ($value, $row) use ($asignacionHelper) {
   return $asignacionHelper->getGrupoMateriaNombre($row->asignacion_id);
});

// Callback para personalizar la visualización del campo en el formulario de añadir
$crud->callbackAddField('asignacion_id', function () use ($asignacionHelper) {
   return $asignacionHelper->generateGrupoMateriaSelect();
});

// Callback para personalizar la visualización del campo en el formulario de edición
$crud->callbackEditField('asignacion_id', function ($value, $primaryKey) use ($asignacionHelper) {
   return $asignacionHelper->generateGrupoMateriaSelect($value);
});