Ahora veremos como crear el CRUD de pacientes en el framework CodeIgniter 4.0 con los siguientes datos, Nombres, Apellidos, DNI, Correo Electrónico, para ello creamos la siguiente tabla.
Leer Mas: CI 4.0 MedicalSoft CRUD Para Pacientes-- phpMyAdmin SQL Dump
-- version 5.0.4
-- https://www.phpmyadmin.net/
--
-- Servidor: 127.0.0.1
-- Tiempo de generación: 04-01-2023 a las 18:20:08
-- Versión del servidor: 10.4.17-MariaDB
-- Versión de PHP: 7.4.15
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Base de datos: `medicalsoft`
--
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `pacientes`
--
CREATE TABLE `pacientes` (
`id` int(11) NOT NULL,
`nombres` varchar(256) COLLATE utf8_spanish2_ci DEFAULT NULL,
`apellidos` varchar(256) COLLATE utf8_spanish2_ci DEFAULT NULL,
`dni` varchar(32) COLLATE utf8_spanish2_ci DEFAULT NULL,
`telefono` varchar(16) COLLATE utf8_spanish2_ci DEFAULT NULL,
`correoElectronico` varchar(64) COLLATE utf8_spanish2_ci DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci;
--
-- Índices para tablas volcadas
--
--
-- Indices de la tabla `pacientes`
--
ALTER TABLE `pacientes`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT de las tablas volcadas
--
--
-- AUTO_INCREMENT de la tabla `pacientes`
--
ALTER TABLE `pacientes`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Creamos el archivo PacientesModel.php en la carpeta model para el acceso a la tabla de la base de datos
<?php
namespace App\Models;
use CodeIgniter\Model;
class PacientesModel extends Model
{
protected $table = 'pacientes';
protected $primaryKey = 'id';
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $useSoftDeletes = true;
protected $allowedFields = ['id','nombres', 'apellidos','dni','telefono','correoElectronico','created_at','updated_at'];
protected $useTimestamps = true;
protected $createdField = 'created_at';
protected $deletedField = 'deleted_at';
protected $validationRules = [
'nombres' => 'required|alpha_numeric_space|min_length[3]',
'apellidos' => 'required|alpha_numeric_space|min_length[5]',
'correoElectronico' => 'required|valid_email|is_unique[users.email]'
];
protected $validationMessages = [];
protected $skipValidation = false;
}
Creamos el archivo PacientesController.php alli tendremos la funciones para guardar, leer y modificar, creo que no falta decir que va en la carpeta controller
<?php
namespace App\Controllers;
use App\Controllers\BaseController;
use \App\Models\PacientesModel;
use \App\Models\BitacoraModel;
use CodeIgniter\API\ResponseTrait;
class PacientesController extends BaseController {
use ResponseTrait;
protected $bitacora;
protected $pacientes;
public function __construct() {
$this->pacientes = new PacientesModel();
$this->bitacora = new BitacoraModel();
helper('menu');
}
public function index() {
if ($this->request->isAJAX()) {
/*
$start = $this->request->getGet('start');
$length = $this->request->getGet('length');
$search = $this->request->getGet('search[value]');
$order = BitacoraModel::ORDERABLE[$this->request->getGet('order[0][column]')];
$dir = $this->request->getGet('order[0][dir]');
*/
$datos = $this->pacientes->select('id,nombres,apellidos,dni,telefono,correoElectronico,created_at,updated_at')->where('deleted_at', null);
// $resultado = $this->bitacora->findAll();
// $this->bitacora->getResource()->countAllResults(),
// $this->bitacora->getResource($search)->countAllResults()
// var_dump($datos);
return \Hermawan\DataTables\DataTable::of($datos)->add('action', function ($row) {
return " <div class=\"btn-group\">
<button class=\"btn btn-warning btnEditarPaciente\" data-toggle=\"modal\" idPaciente=\"$row->id\" data-target=\"#modalAgregarPaciente\"> <i class=\" fa fa-edit \"></i></button>
<button class=\"btn btn-danger btnEliminarPaciente\" idPaciente=\"$row->id\"><i class=\"fa fa-times\"></i></button></div>";
}, 'last')
->toJson();
}
$titulos["title"] = lang('patients.title');
$titulos["subtitle"] = lang('patients.subtitle');
//$data["data"] = $datos;
return view('pacientes', $titulos);
}
/*
* Lee paciente
*/
public function traePaciente() {
$idPaciente = $this->request->getPost("idPaciente");
$datosPaciente = $this->pacientes->find($idPaciente);
echo json_encode($datosPaciente);
}
/*
* Guarda o actualiza paciente
*/
public function guardar() {
helper('auth');
$userName = user()->username;
$idUser = user()->id;
$datos = $this->request->getPost();
if ($datos["idPaciente"] == 0) {
try {
if ($this->pacientes->save($datos) === false) {
$errores = $this->pacientes->errors();
foreach ($errores as $field => $error) {
echo $error . " ";
}
return;
}
$datosBitacora["descripcion"] = "Se guardo el paciente con los siguientes datos: " . json_encode($datos);
$datosBitacora["usuario"] = $userName;
$this->bitacora->save($datosBitacora);
echo "Guardado Correctamente";
} catch (\PHPUnit\Framework\Exception $ex) {
echo "Error al guardar " . $ex->getMessage();
}
} else {
if ($this->pacientes->update($datos["idPaciente"], $datos) == false) {
$errores = $this->pacientes->errors();
foreach ($errores as $field => $error) {
echo $error . " ";
}
return;
} else {
$datosBitacora["descripcion"] = "Se actualizo el paciente con los siguientes datos: " . json_encode($datos);
$datosBitacora["usuario"] = $userName;
$this->bitacora->save($datosBitacora);
echo "Actualizado Correctamente";
return;
}
}
return;
}
public function delete($id) {
if (!$found = $this->pacientes->delete($id)) {
return $this->failNotFound(lang('patients.msg.msg_get_fail'));
}
$infoPaciente = $this->pacientes->find($id);
$datosBitacora["descripcion"] = "Se elimino el paciente que contenia los siguientes datos " . json_encode($infoPaciente);
$this->bitacora->save($datosBitacora);
return $this->respondDeleted($found, lang('patients.msg.msg_delete'));
}
/**
* Trae en formato JSON los pacientes para el select2
* @return type
*/
public function traerPacientesAjax() {
$request = service('request');
$postData = $request->getPost();
$response = array();
// Read new token and assign in $response['token']
$response['token'] = csrf_hash();
if (!isset($postData['searchTerm'])) {
// Fetch record
$pacientes = new PacientesModel();
$listaPacientes = $pacientes->select('id,nombres,apellidos')
->orderBy('nombres')
->findAll(10);
} else {
$searchTerm = $postData['searchTerm'];
// Fetch record
$pacientes = new PacientesModel();
$listaPacientes = $pacientes->select('id,nombres,apellidos')
->where("deleted_at",null)
->like('nombres', $searchTerm)
->orLike('apellidos', $searchTerm)
->orderBy('nombres')
->findAll(10);
}
$data = array();
foreach ($listaPacientes as $paciente) {
$data[] = array(
"id" => $paciente['id'],
"text" => $paciente['nombres'].' '.$paciente['apellidos'],
);
}
$response['data'] = $data;
return $this->response->setJSON($response);
}
}
En Views creamos el archivo de la vista
<?= $this->include('agungsugiarto\boilerplate\Views\load\select2') ?>
<?= $this->include('agungsugiarto\boilerplate\Views\load\datatables') ?>
<?= $this->include('agungsugiarto\boilerplate\Views\load\nestable') ?>
<!-- Extend from layout index -->
<?= $this->extend('agungsugiarto\boilerplate\Views\layout\index') ?>
<!-- Section content -->
<?= $this->section('content') ?>
<?= $this->include('pacientesModulos\modalCaptura') ?>
<!-- SELECT2 EXAMPLE -->
<div class="card card-default">
<div class="card-header">
<div class="float-right">
<div class="btn-group">
<button class="btn btn-primary btnAgregarPaciente" data-toggle="modal" data-target="#modalAgregarPaciente"><i class="fa fa-plus"></i>
<?= lang('patients.add') ?>
</button>
</div>
</div>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-12">
<div class="table-responsive">
<table id="tablaPacientes" class="table table-striped table-hover va-middle tablaPacientes">
<thead>
<tr>
<th>#</th>
<th><?= lang('patients.names') ?></th>
<th><?= lang('patients.lastName') ?></th>
<th><?= lang('patients.dni') ?></th>
<th><?= lang('patients.phone') ?></th>
<th><?= lang('patients.email') ?></th>
<th><?= lang('patients.createdAt') ?></th>
<th><?= lang('patients.updateAt') ?></th>
<th>Acciones </th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- /.card -->
<?= $this->endSection() ?>
<?= $this->section('js') ?>
<script>
/**
* Cargamos la tabla
*/
function cargaTabla() {
$('.tablaPacientes').DataTable({
"ajax": "<?= route_to('admin/pacientes') ?>",
"deferRender": true,
"serverSide": true,
"retrieve": true,
"processing": true
});
}
cargaTabla();
/**
* Carga datos actualizar
*/
/*=============================================
EDITAR PACIENTE
=============================================*/
$(".tablaPacientes").on("click", ".btnEditarPaciente", function () {
var idPaciente = $(this).attr("idPaciente");
console.log("paciente ", idPaciente);
var datos = new FormData();
datos.append("idPaciente", idPaciente);
$.ajax({
url: "<?= route_to('admin/pacientes/traerPaciente') ?>",
method: "POST",
data: datos,
cache: false,
contentType: false,
processData: false,
dataType: "json",
success: function (respuesta) {
console.log(respuesta);
$("#idPaciente").val(respuesta["id"]);
$("#nombres").val(respuesta["nombres"]);
$("#apellidos").val(respuesta["apellidos"]);
$("#correoElectronico").val(respuesta["correoElectronico"]);
$("#telefono").val(respuesta["telefono"]);
$("#dni").val(respuesta["dni"]);
}
})
})
/*=============================================
ELIMINAR PACIENTE
=============================================*/
$(".tablaPacientes").on("click", ".btnEliminarPaciente", function () {
var idPaciente = $(this).attr("idPaciente");
console.log("eliminar");
Swal.fire({
title: '<?= lang('boilerplate.global.sweet.title') ?>',
text: "<?= lang('boilerplate.global.sweet.text') ?>",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: '<?= lang('boilerplate.global.sweet.confirm_delete') ?>'
})
.then((result) => {
if (result.value) {
$.ajax({
url: `<?= route_to('admin/pacientes') ?>/` + idPaciente,
method: 'DELETE',
}).done((data, textStatus, jqXHR) => {
Toast.fire({
icon: 'success',
title: jqXHR.statusText,
});
$(".tablaPacientes").DataTable().destroy();
cargaTabla();
//tableUser.ajax.reload();
}).fail((error) => {
Toast.fire({
icon: 'error',
title: error.responseJSON.messages.error,
});
})
}
})
})
</script>
<?= $this->endSection() ?>
En views creamos la carpeta pacientesModulos y dentro de esa capeta creamos el archivo modalCaptura.php con la siguiente código
<!-- Modal Pacientes -->
<div class="modal fade" id="modalAgregarPaciente" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><?= lang('patients.createEdit') ?></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<form id="form-paciente" class="form-horizontal">
<input type="hidden" id="idPaciente" name="idPaciente" value="0">
<div class="form-group row">
<label for="inputName" class="col-sm-2 col-form-label"><?= lang('patients.names') ?></label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-pencil-alt"></i></span>
</div>
<input type="text" name="nombres" id="nombres" class="form-control <?= session('error.nombres') ? 'is-invalid' : '' ?>" value="<?= old('nombres') ?>" placeholder="<?= lang('patients.names') ?>" autocomplete="off">
</div>
</div>
</div>
<div class="form-group row">
<label for="inputName" class="col-sm-2 col-form-label"><?= lang('patients.lastName') ?></label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-pencil-alt"></i></span>
</div>
<input type="text" name="apellidos" id="apellidos"class="form-control <?= session('error.apellidos') ? 'is-invalid' : '' ?>" value="<?= old('apellidos') ?>" placeholder="<?= lang('patients.lastName') ?>" autocomplete="off">
</div>
</div>
</div>
<div class="form-group row">
<label for="dni" class="col-sm-2 col-form-label"><?= lang('patients.dni') ?></label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-credit-card"></i></span>
</div>
<input type="text" name="dni" id="dni" class="form-control <?= session('error.dni') ? 'is-invalid' : '' ?>" value="<?= old('dni') ?>" placeholder="<?= lang('patients.dni') ?>" autocomplete="off">
</div>
</div>
</div>
<div class="form-group row">
<label for="phone" class="col-sm-2 col-form-label"><?= lang('patients.phone') ?></label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-mobile"></i></span>
</div>
<input type="text" name="telefono" id="telefono" class="form-control <?= session('error.phone') ? 'is-invalid' : '' ?>" value="<?= old('telefono') ?>" placeholder="<?= lang('patients.phone') ?>" autocomplete="off">
</div>
</div>
</div>
<div class="form-group row">
<label for="correoElectronico" class="col-sm-2 col-form-label"><?= lang('patients.email') ?></label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-envelope"></i></span>
</div>
<input type="text" name="correoElectronico" id="correoElectronico" class="form-control <?= session('error.correoElectronico') ? 'is-invalid' : '' ?>" value="<?= old('correoElectronico') ?>" placeholder="<?= lang('patients.email') ?>" autocomplete="off">
</div>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal"><?= lang('boilerplate.global.close') ?></button>
<button type="button" class="btn btn-primary btn-sm" id="btnGuardarPaciente"><?= lang('boilerplate.global.save') ?></button>
</div>
</div>
</div>
</div>
<?= $this->section('js') ?>
<script>
$(document).on('click', '.btnAgregarPaciente', function (e) {
console.log("asdasd");
$(".form-control").val("");
$("#idPaciente").val("0");
$("#btnGuardarPaciente").removeAttr("disabled");
})
/*
* AL hacer click al editar
*/
$(document).on('click', '.btnEditarPaciente', function (e) {
var idPaciente = $(this).attr("idPaciente");
//LIMPIAMOS CONTROLES
$(".form-control").val("");
$("#idPaciente").val(idPaciente);
$("#btnGuardarPaciente").removeAttr("disabled");
})
/**
* Guardar paciente
*/
$(document).on('click', '#btnGuardarPaciente', function (e) {
var idPaciente = $("#idPaciente").val();
var nombres = $("#nombres").val();
var apellidos = $("#apellidos").val();
var telefono = $("#telefono").val();
var dni = $("#dni").val();
var correoElectronico = $("#correoElectronico").val();
var ajaxPaciente = "ajaxPaciente";
$("#btnGuardarPaciente").attr("disabled", true);
var datos = new FormData();
datos.append("idPaciente", idPaciente);
datos.append("nombres", nombres);
datos.append("apellidos", apellidos);
datos.append("telefono", telefono);
datos.append("dni", dni);
datos.append("correoElectronico", correoElectronico);
$.ajax({
url: "<?= route_to('admin/pacientes/guardar') ?>",
method: "POST",
data: datos,
cache: false,
contentType: false,
processData: false,
//dataType:"json",
success: function (respuesta) {
if (respuesta.match(/Correctamente.*/)) {
Toast.fire({
icon: 'success',
title: "Guardado Correctamente"
});
$('.tablaPacientes').DataTable().destroy();
cargaTabla();
$("#btnGuardarPaciente").removeAttr("disabled");
$('#modalAgregarPaciente').modal('hide');
} else {
Toast.fire({
icon: 'error',
title: respuesta
});
$("#btnGuardarPaciente").removeAttr("disabled");
// $('#modalAgregarPaciente').modal('hide');
}
}
}
)
});
</script>
<?= $this->endSection() ?>
Ahora configuramos las rutas en app/config/routes.php
$routes->resource('pacientes', [
'filter' => 'permission:pacientes-permiso',
'controller' => 'PacientesController',
'except' => 'show'
]);
$routes->post('pacientes/guardar', 'PacientesController::guardar');
$routes->post('pacientes/traerPaciente', 'PacientesController::traePaciente');
$routes->post('pacientes/traerPacientesAjax', 'PacientesController::traerPacientesAjax');
En languaje en la carpeta es creamos el archivo patients con el siguiente codigo
<?php
$patients["names"] = "Firs Name";
$patients["lastName"] = "Last Name";
$patients["dni"] = "CARD ID";
$patients["phone"] = "Phone";
$patients["email"] = "E-Mail";
$patients["createdAt"] = "Date Creation";
$patients["updateAt"] = "Date Update";
$patients["add"] = "Add Patient";
$patients["actions"] = "Actions";
$patients["createEdit"] = "Create / Edit Patient";
$patients["title"] = "Patient";
$patients["subtitle"] = "List of Patients";
$patients["msg_delete"] = "Patient has deleted .";
$patients["msg_get_fail"] = "The patient not exist or has deleted.";
return $patients;
Y en la carpeta es de español creamos el archivo patients con el siguiente código
<?php
$patients["names"] = "Nombres";
$patients["lastName"] = "Apellidos";
$patients["dni"] = "INE";
$patients["phone"] = "Telefono";
$patients["email"] = "Correo Electronico";
$patients["add"] = "Agregar Paciente";
$patients["updateAt"] = "Fecha Modificacion";
$patients["actions"] = "Acciones";
$patients["createEdit"] = "Crear / Editar Paciente";
$patients["title"] = "Pacientes";
$patients["subtitle"] = "Lista de Pacientes";
$patients["msg_delete"] = "El paciente ha sido eliminado correctamente.";
$patients["msg_get_fail"] = "El paciente no existe o fue eliminado.";
return $patients;

Deja un comentario