En este caso vamos a requerir tres campos mas que son los siguientes

  • tipoFigura
  • RFCFigura
  • numLicencia

Primero seria crear el archivo de migración con los comandos que mostramos en la publicación anterior, el archivo seria el siguiente App/Database/Migrations/2023-12-06-191246_CamposCartaPorteChoferes.php con el siguiente código

<?php

namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class CamposCartaPorteChoferes extends Migration
{
    public function up()
    {
         $campos = [
            'tipoFigura' => [
                'type' => 'varchar',
                'constraint' => 8,
                'null' => true,
            ],
            'RFCFigura' => [
                'type' => 'varchar',
                'constraint' => 16,
                'null' => true,
            ],
            'numLicencia' => [
                'type' => 'varchar',
                'constraint' => 32,
                'null' => true,
            ],
        ];

        $this->forge->addColumn('choferes', $campos);
    }

    public function down()
    {
        //
    }
}

Modificamos el archivo modelo App/Models/ChoferesModel.php con el siguiente código

<?php

namespace App\Models;

use CodeIgniter\Model;

class ChoferesModel extends Model {

    protected $table = 'choferes';
    protected $primaryKey = 'id';
    protected $useAutoIncrement = true;
    protected $returnType = 'array';
    protected $useSoftDeletes = true;
    protected $allowedFields = ['id'
        , 'idEmpresa'
        , 'nombre'
        , 'Apellido'
        , 'tipoFigura'
        , 'RFCFigura'
        , 'numLicencia'
        , 'created_at'
        , 'updated_at'
        , 'deleted_at'];
    protected $useTimestamps = true;
    protected $createdField = 'created_at';
    protected $deletedField = 'deleted_at';
    protected $validationRules = [
    ];
    protected $validationMessages = [];
    protected $skipValidation = false;

    public function mdlGetChoferes($idEmpresas) {

        $result = $this->db->table('choferes a, empresas b')
                ->select('a.id
                         ,a.idEmpresa
                         ,a.nombre
                         ,a.Apellido
                         ,a.tipoFigura
                         ,a.RFCFigura
                         ,a.numLicencia
                         ,a.created_at
                         ,a.updated_at
                         ,a.deleted_at 
                         ,b.nombre as nombreEmpresa')
                ->where('a.idEmpresa', 'b.id', FALSE)
                ->whereIn('a.idEmpresa', $idEmpresas);

        return $result;
    }

}

En el archivo ChoferesController.php no hay cambios

Modificamos el archivo App/Views/choferes.php dejando el siguiente código

<?= $this->include('julio101290\boilerplate\Views\load\select2') ?>
<?= $this->include('julio101290\boilerplate\Views\load\datatables') ?>
<?= $this->include('julio101290\boilerplate\Views\load\nestable') ?>
<!-- Extend from layout index -->
<?= $this->extend('julio101290\boilerplate\Views\layout\index') ?>

<!-- Section content -->
<?= $this->section('content') ?>

<?= $this->include('modulesChoferes/modalCaptureChoferes') ?>

<!-- SELECT2 EXAMPLE -->
<div class="card card-default">
    <div class="card-header">
        <div class="float-right">
            <div class="btn-group">

                <button class="btn btn-primary btnAddChoferes" data-toggle="modal" data-target="#modalAddChoferes"><i class="fa fa-plus"></i>

                    <?= lang('choferes.add') ?>

                </button>

            </div>
        </div>
    </div>
    <div class="card-body">
        <div class="row">
            <div class="col-md-12">
                <div class="table-responsive">
                    <table id="tableChoferes" class="table table-striped table-hover va-middle tableChoferes">
                        <thead>
                            <tr>

                                <th>#</th>
                                <th><?= lang('choferes.fields.idEmpresa') ?></th>
                                <th><?= lang('choferes.fields.nombre') ?></th>
                                <th><?= lang('choferes.fields.Apellido') ?></th>
                                <th><?= lang('choferes.fields.created_at') ?></th>
                                <th><?= lang('choferes.fields.updated_at') ?></th>
                                <th><?= lang('choferes.fields.deleted_at') ?></th>

                                <th><?= lang('choferes.fields.actions') ?> </th>

                            </tr>
                        </thead>
                        <tbody>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
</div>
<!-- /.card -->

<?= $this->endSection() ?>


<?= $this->section('js') ?>
<script>

    /**
     * Cargamos la tabla
     */

    var tableChoferes = $('#tableChoferes').DataTable({
        processing: true,
        serverSide: true,
        responsive: true,
        autoWidth: false,
        order: [[1, 'asc']],

        ajax: {
            url: '<?= base_url('admin/choferes') ?>',
            method: 'GET',
            dataType: "json"
        },
        columnDefs: [{
                orderable: false,
                targets: [7],
                searchable: false,
                targets: [7]

            }],
        columns: [{
                'data': 'id'
            },

            {
                'data': 'nombreEmpresa'
            },

            {
                'data': 'nombre'
            },

            {
                'data': 'Apellido'
            },

            {
                'data': 'created_at'
            },

            {
                'data': 'updated_at'
            },

            {
                'data': 'deleted_at'
            },

            {
                "data": function (data) {
                    return `<td class="text-right py-0 align-middle">
                         <div class="btn-group btn-group-sm">
                             <button class="btn btn-warning btnEditChoferes" data-toggle="modal" idChoferes="${data.id}" data-target="#modalAddChoferes">  <i class=" fa fa-edit"></i></button>
                             <button class="btn btn-danger btn-delete" data-id="${data.id}"><i class="fas fa-trash"></i></button>
                         </div>
                         </td>`
                }
            }
        ]
    });



    $(document).on('click', '#btnSaveChoferes', function (e) {


        var idChoferes = $("#idChoferes").val();
        var idEmpresa = $("#idEmpresaChoferes").val();
        var nombre = $("#nombre").val();
        var Apellido = $("#Apellido").val();
        var tipoFigura = $("#tipoFigura").val();
        var RFCFigura = $("#RFCFigura").val();
        var numLicencia = $("#numLicencia").val();

        if (idEmpresa == 0 || idEmpresa == null) {

            Toast.fire({
                icon: 'error',
                title: "Tiene que seleccionar la empresa"
            });
            return;
        }

        $("#btnSaveChoferes").attr("disabled", true);

        var datos = new FormData();
        datos.append("idChoferes", idChoferes);
        datos.append("idEmpresa", idEmpresa);
        datos.append("nombre", nombre);
        datos.append("Apellido", Apellido);
        datos.append("tipoFigura", tipoFigura);
        datos.append("RFCFigura", RFCFigura);
        datos.append("numLicencia", numLicencia);


        $.ajax({

            url: "<?= base_url('admin/choferes/save') ?>",
            method: "POST",
            data: datos,
            cache: false,
            contentType: false,
            processData: false,
            success: function (respuesta) {
                if (respuesta.match(/Correctamente.*/)) {

                    Toast.fire({
                        icon: 'success',
                        title: "Guardado Correctamente"
                    });

                    tableChoferes.ajax.reload();
                    $("#btnSaveChoferes").removeAttr("disabled");


                    $('#modalAddChoferes').modal('hide');
                } else {

                    Toast.fire({
                        icon: 'error',
                        title: respuesta
                    });

                    $("#btnSaveChoferes").removeAttr("disabled");


                }

            }

        }

        )

    });



    /**
     * Carga datos actualizar
     */


    /*=============================================
     EDITAR Choferes
     =============================================*/
    $(".tableChoferes").on("click", ".btnEditChoferes", function () {

        var idChoferes = $(this).attr("idChoferes");

        var datos = new FormData();
        datos.append("idChoferes", idChoferes);

        $.ajax({

            url: "<?= base_url('admin/choferes/getChoferes') ?>",
            method: "POST",
            data: datos,
            cache: false,
            contentType: false,
            processData: false,
            dataType: "json",
            success: function (respuesta) {
                $("#idChoferes").val(respuesta["id"]);

                $("#idEmpresaChoferes").val(respuesta["idEmpresa"]);
                $("#idEmpresaChoferes").trigger("change");
                $("#nombre").val(respuesta["nombre"]);
                $("#Apellido").val(respuesta["Apellido"]);
                $("#tipoFigura").val(respuesta["tipoFigura"]);
                $("#tipoFigura").trigger("change");
                $("#RFCFigura").val(respuesta["RFCFigura"]);
                $("#numLicencia").val(respuesta["numLicencia"]);


            }

        })

    })


    /*=============================================
     ELIMINAR choferes
     =============================================*/
    $(".tableChoferes").on("click", ".btn-delete", function () {

        var idChoferes = $(this).attr("data-id");

        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: `<?= base_url('admin/choferes') ?>/` + idChoferes,
                            method: 'DELETE',
                        }).done((data, textStatus, jqXHR) => {
                            Toast.fire({
                                icon: 'success',
                                title: jqXHR.statusText,
                            });


                            tableChoferes.ajax.reload();
                        }).fail((error) => {
                            Toast.fire({
                                icon: 'error',
                                title: error.responseJSON.messages.error,
                            });
                        })
                    }
                })
    })

    $(function () {
        $("#modalAddChoferes").draggable();

    });


</script>
<?= $this->endSection() ?>
        

Modificamos el archivo App/Views/modulesChoferes/modalCaptureChoferes.php dejando el siguiente código

<!-- Modal Choferes -->
<div class="modal fade" id="modalAddChoferes" tabindex="-1" role="dialog" aria-labelledby="modalAddChoferes" aria-hidden="true">
    <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title"><?= lang('choferes.createEdit') ?></h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body">
                <form id="form-choferes" class="form-horizontal">
                    <input type="hidden" id="idChoferes" name="idChoferes" value="0">


                    <div class="form-group row">
                        <label for="idEmpresa" class="col-sm-2 col-form-label">Empresa</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>

                                <select class="form-control idEmpresaChoferes form-controlVehiculos" name="idEmpresaChoferes" id="idEmpresaChoferes" style="width:80%;">
                                    <option value="0">Seleccione empresa</option>
                                    <?php
                                    foreach ($empresas as $key => $value) {

                                        echo "<option value='$value[id]'>$value[id] - $value[nombre] </option>  ";
                                    }
                                    ?>

                                </select>

                            </div>
                        </div>
                    </div>


                    <div class="form-group row">
                        <label for="nombre" class="col-sm-2 col-form-label"><?= lang('choferes.fields.nombre') ?></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="nombre" id="nombre" class="form-control datosChoferes <?= session('error.nombre') ? 'is-invalid' : '' ?>" value="<?= old('nombre') ?>" placeholder="<?= lang('choferes.fields.nombre') ?>" autocomplete="off">
                            </div>
                        </div>
                    </div>
                    <div class="form-group row">
                        <label for="Apellido" class="col-sm-2 col-form-label"><?= lang('choferes.fields.Apellido') ?></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="Apellido" id="Apellido" class="form-control datosChoferes <?= session('error.Apellido') ? 'is-invalid' : '' ?>" value="<?= old('Apellido') ?>" placeholder="<?= lang('choferes.fields.Apellido') ?>" autocomplete="off">
                            </div>
                        </div>
                    </div>

                    <div class="form-group row">
                        <label for="tipoFigura" class="col-sm-2 col-form-label"><?= lang('choferes.fields.tipoFigura') ?></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>

                                <select class="form-control tipoFigura form-controlVehiculos" name="tipoFigura" id="tipoFigura" style="width:80%;">
                                    <option value="0">Seleccione tipo figura</option>


                                    <option value="01">01 - Operador</option>
                                    <option value="02">02 - Propietario</option>
                                    <option value="03">03 - Arrendador</option>
                                    <option value="04">04 - Notificado</option>

                                </select>

                            </div>
                        </div>
                    </div>

                    <div class="form-group row">
                        <label for="RFCFigura" class="col-sm-2 col-form-label"><?= lang('choferes.fields.RFCFigura') ?></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="RFCFigura" id="RFCFigura" class="form-control datosChoferes <?= session('error.Apellido') ? 'is-invalid' : '' ?> RFCFigura" value="<?= old('RFCFigura') ?>" placeholder="<?= lang('choferes.fields.RFCFigura') ?>" autocomplete="off">
                            </div>
                        </div>
                    </div>

                    <div class="form-group row">
                        <label for="numLicencia" class="col-sm-2 col-form-label"><?= lang('choferes.fields.numLicencia') ?></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="numLicencia" id="numLicencia" class="form-control datosChoferes <?= session('error.numLicencia') ? 'is-invalid' : '' ?> numLicencia" value="<?= old('numLicencia') ?>" placeholder="<?= lang('choferes.fields.numLicencia') ?>" 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="btnSaveChoferes"><?= lang('boilerplate.global.save') ?></button>
            </div>
        </div>
    </div>
</div>

<?= $this->section('js') ?>


<script>

    $(document).on('click', '.btnAddChoferes', function (e) {




        $("#idChoferes").val("0");

        $(".datosChoferes").val("");

        $("#idEmpresaChoferes").val("0");



        $("#idEmpresaChoferes").trigger("change");

        $("#btnSaveChoferes").removeAttr("disabled");

    });

    /* 
     * AL hacer click al editar
     */



    $(document).on('click', '.btnEditChoferes', function (e) {


        var idChoferes = $(this).attr("idChoferes");

        //LIMPIAMOS CONTROLES
        $(".form-control").val("");

        $("#idChoferes").val(idChoferes);
        $("#btnGuardarChoferes").removeAttr("disabled");

    });


    $("#idEmpresaChoferes").select2();
    $("#tipoFigura").select2();
</script>


<?= $this->endSection() ?>
        

Y listo ya tenemos nuestros campos nuevos