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);
});