Posteriormente vamos a necesitar el catalogo de tipo de vehículos y vehículos en esta publicación dejaremos la forma para crear el CRUD de tipos de vehículos con los siguientes datos.

- Empresa
- Codigo
- Descripción
Creamos el archivo de migración en App/Database/Migrations
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class Tipovehiculo extends Migration {
public function up() {
// Tipovehiculo
$this->forge->addField([
'id' => ['type' => 'int', 'constraint' => 11, 'unsigned' => true, 'auto_increment' => true],
'idEmpresa' => ['type' => 'bigint', 'constraint' => 20, 'null' => false],
'codigo' => ['type' => 'varchar', 'constraint' => 16, 'null' => true],
'descripcion' => ['type' => 'varchar', 'constraint' => 512, 'null' => true],
'created_at' => ['type' => 'datetime', 'null' => true],
'updated_at' => ['type' => 'datetime', 'null' => true],
'deleted_at' => ['type' => 'datetime', 'null' => true],
]);
$this->forge->addKey('id', true);
$this->forge->createTable('tipovehiculo', true);
}
public function down() {
$this->forge->dropTable('tipovehiculo', true);
}
}
Creamos el archivo modelo en App/Models/TipovehiculoModel.php con el siguiente código
<?php
namespace App\Models;
use CodeIgniter\Model;
class TipovehiculoModel extends Model {
protected $table = 'tipovehiculo';
protected $primaryKey = 'id';
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $useSoftDeletes = true;
protected $allowedFields = ['id', 'idEmpresa', 'codigo', 'descripcion', '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 mdlGetTipovehiculo($idEmpresas) {
$result = $this->db->table('tipovehiculo a, empresas b')
->select('a.id,a.idEmpresa,a.codigo,a.descripcion,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;
}
public function mdlGetTipovehiculoArray($idEmpresas) {
$result = $this->db->table('tipovehiculo a, empresas b')
->select('a.id,a.idEmpresa,a.codigo,a.descripcion,a.created_at,a.updated_at,a.deleted_at ,b.nombre as nombreEmpresa')
->where('a.idEmpresa', 'b.id', FALSE)
->whereIn('a.idEmpresa', $idEmpresas)->get()->getResultArray();
return $result;
}
}
Creamos el archivo controlador en App/Controllers/TipovehiculoController.php con el siguiente código
<?php
namespace App\Controllers;
use App\Controllers\BaseController;
use \App\Models\{
TipovehiculoModel
};
use App\Models\LogModel;
use CodeIgniter\API\ResponseTrait;
use App\Models\EmpresasModel;
class TipovehiculoController extends BaseController {
use ResponseTrait;
protected $log;
protected $tipovehiculo;
public function __construct() {
$this->tipovehiculo = new TipovehiculoModel();
$this->log = new LogModel();
$this->empresa = new EmpresasModel();
helper('menu');
helper('utilerias');
}
public function index() {
helper('auth');
$idUser = user()->id;
$titulos["empresas"] = $this->empresa->mdlEmpresasPorUsuario($idUser);
if (count($titulos["empresas"]) == "0") {
$empresasID[0] = "0";
} else {
$empresasID = array_column($titulos["empresas"], "id");
}
if ($this->request->isAJAX()) {
$datos = $this->tipovehiculo->mdlGetTipovehiculo($empresasID);
return \Hermawan\DataTables\DataTable::of($datos)->toJson(true);
}
$titulos["title"] = lang('tipovehiculo.title');
$titulos["subtitle"] = lang('tipovehiculo.subtitle');
return view('tipovehiculo', $titulos);
}
/**
* Read Tipovehiculo
*/
public function getTipovehiculo() {
helper('auth');
$idUser = user()->id;
$titulos["empresas"] = $this->empresa->mdlEmpresasPorUsuario($idUser);
if (count($titulos["empresas"]) == "0") {
$empresasID[0] = "0";
} else {
$empresasID = array_column($titulos["empresas"], "id");
}
$idTipovehiculo = $this->request->getPost("idTipovehiculo");
$datosTipovehiculo = $this->tipovehiculo->whereIn('idEmpresa', $empresasID)
->where("id", $idTipovehiculo)->first();
echo json_encode($datosTipovehiculo);
}
/**
* Save or update Tipovehiculo
*/
public function save() {
helper('auth');
$userName = user()->username;
$idUser = user()->id;
$datos = $this->request->getPost();
if ($datos["idTipovehiculo"] == 0) {
try {
if ($this->tipovehiculo->save($datos) === false) {
$errores = $this->tipovehiculo->errors();
foreach ($errores as $field => $error) {
echo $error . " ";
}
return;
}
$dateLog["description"] = lang("vehicles.logDescription") . json_encode($datos);
$dateLog["user"] = $userName;
$this->log->save($dateLog);
echo "Guardado Correctamente";
} catch (\PHPUnit\Framework\Exception $ex) {
echo "Error al guardar " . $ex->getMessage();
}
} else {
if ($this->tipovehiculo->update($datos["idTipovehiculo"], $datos) == false) {
$errores = $this->tipovehiculo->errors();
foreach ($errores as $field => $error) {
echo $error . " ";
}
return;
} else {
$dateLog["description"] = lang("tipovehiculo.logUpdated") . json_encode($datos);
$dateLog["user"] = $userName;
$this->log->save($dateLog);
echo "Actualizado Correctamente";
return;
}
}
return;
}
/**
* Delete Tipovehiculo
* @param type $id
* @return type
*/
public function delete($id) {
$infoTipovehiculo = $this->tipovehiculo->find($id);
helper('auth');
$userName = user()->username;
if (!$found = $this->tipovehiculo->delete($id)) {
return $this->failNotFound(lang('tipovehiculo.msg.msg_get_fail'));
}
$this->tipovehiculo->purgeDeleted();
$logData["description"] = lang("tipovehiculo.logDeleted") . json_encode($infoTipovehiculo);
$logData["user"] = $userName;
$this->log->save($logData);
return $this->respondDeleted($found, lang('tipovehiculo.msg_delete'));
}
/**
* Obtiene los de vehiculos via AJax
*/
public function getTipoVehiculosAjax() {
$request = service('request');
$postData = $request->getPost();
$response = array();
// Read new token and assign in $response['token']
$response['token'] = csrf_hash();
$idEmpresa = $postData['idEmpresa'];
if (!isset($postData['searchTerm'])) {
// Fetch record
$listTipeVehicles = $this->tipovehiculo->select('id,idEmpresa,codigo,descripcion')->where("deleted_at", null)
->where('idEmpresa', $idEmpresa)
->orderBy('id')
->orderBy('idEmpresa')
->orderBy('codigo')
->orderBy('descripcion')
->findAll(1000);
} else {
$searchTerm = $postData['searchTerm'];
// Fetch record
$listTipeVehicles = $this->tipovehiculo->select('id,idEmpresa,codigo,descripcion')->where("deleted_at", null)
->where('idEmpresa', $idEmpresa)
->groupStart()
->like('codigo', $searchTerm)
->orLike('descripcion', $searchTerm)
->orLike('id', $searchTerm)
->groupEnd()
->findAll(1000);
}
$data = array();
foreach ($listTipeVehicles as $tipeVehicle) {
$data[] = array(
"id" => $tipeVehicle['id'],
"text" => $tipeVehicle['id'] . ' ' . $tipeVehicle['codigo'] . ' ' . $tipeVehicle['descripcion'],
);
}
$response['data'] = $data;
return $this->response->setJSON($response);
}
}
Creamos la vista para ver la lista de tipos vehículos en App/Views/tipovehiculo.php con 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('modulesTipovehiculo/modalCaptureTipovehiculo') ?>
<!-- SELECT2 EXAMPLE -->
<div class="card card-default">
<div class="card-header">
<div class="float-right">
<div class="btn-group">
<button class="btn btn-primary btnAddTipovehiculo" data-toggle="modal" data-target="#modalAddTipovehiculo"><i class="fa fa-plus"></i>
<?= lang('tipovehiculo.add') ?>
</button>
</div>
</div>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-12">
<div class="table-responsive">
<table id="tableTipovehiculo" class="table table-striped table-hover va-middle tableTipovehiculo">
<thead>
<tr>
<th>#</th>
<th><?= lang('tipovehiculo.fields.idEmpresa') ?></th>
<th><?= lang('tipovehiculo.fields.codigo') ?></th>
<th><?= lang('tipovehiculo.fields.descripcion') ?></th>
<th><?= lang('tipovehiculo.fields.created_at') ?></th>
<th><?= lang('tipovehiculo.fields.updated_at') ?></th>
<th><?= lang('tipovehiculo.fields.deleted_at') ?></th>
<th><?= lang('tipovehiculo.fields.actions') ?> </th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- /.card -->
<?= $this->endSection() ?>
<?= $this->section('js') ?>
<script>
/**
* Cargamos la tabla
*/
var tableTipovehiculo = $('#tableTipovehiculo').DataTable({
processing: true,
serverSide: true,
responsive: true,
autoWidth: false,
order: [[1, 'asc']],
ajax: {
url: '<?= base_url('admin/tipovehiculo') ?>',
method: 'GET',
dataType: "json"
},
columnDefs: [{
orderable: false,
targets: [7],
searchable: false,
targets: [7]
}],
columns: [{
'data': 'id'
},
{
'data': 'idEmpresa'
},
{
'data': 'codigo'
},
{
'data': 'descripcion'
},
{
'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 btnEditTipovehiculo" data-toggle="modal" idTipovehiculo="${data.id}" data-target="#modalAddTipovehiculo"> <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', '#btnSaveTipovehiculo', function (e) {
var idTipovehiculo = $("#idTipovehiculo").val();
var idEmpresa = $("#idEmpresa").val();
var codigo = $("#codigo").val();
var descripcion = $("#descripcion").val();
if (idEmpresa == 0 || idEmpresa == null) {
Toast.fire({
icon: 'error',
title: "Tiene que seleccionar la empresa"
});
return;
}
$("#btnSaveTipovehiculo").attr("disabled", true);
var datos = new FormData();
datos.append("idTipovehiculo", idTipovehiculo);
datos.append("idEmpresa", idEmpresa);
datos.append("codigo", codigo);
datos.append("descripcion", descripcion);
$.ajax({
url: "<?= base_url('admin/tipovehiculo/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"
});
tableTipovehiculo.ajax.reload();
$("#btnSaveTipovehiculo").removeAttr("disabled");
$('#modalAddTipovehiculo').modal('hide');
} else {
Toast.fire({
icon: 'error',
title: respuesta
});
$("#btnSaveTipovehiculo").removeAttr("disabled");
}
}
}
)
});
/**
* Carga datos actualizar
*/
/*=============================================
EDITAR Tipovehiculo
=============================================*/
$(".tableTipovehiculo").on("click", ".btnEditTipovehiculo", function () {
var idTipovehiculo = $(this).attr("idTipovehiculo");
var datos = new FormData();
datos.append("idTipovehiculo", idTipovehiculo);
$.ajax({
url: "<?= base_url('admin/tipovehiculo/getTipovehiculo') ?>",
method: "POST",
data: datos,
cache: false,
contentType: false,
processData: false,
dataType: "json",
success: function (respuesta) {
$("#idTipovehiculo").val(respuesta["id"]);
$("#idEmpresa").val(respuesta["idEmpresa"]);
$("#idEmpresa").trigger("change");
$("#codigo").val(respuesta["codigo"]);
$("#descripcion").val(respuesta["descripcion"]);
}
})
})
/*=============================================
ELIMINAR tipovehiculo
=============================================*/
$(".tableTipovehiculo").on("click", ".btn-delete", function () {
var idTipovehiculo = $(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/tipovehiculo') ?>/` + idTipovehiculo,
method: 'DELETE',
}).done((data, textStatus, jqXHR) => {
Toast.fire({
icon: 'success',
title: jqXHR.statusText,
});
tableTipovehiculo.ajax.reload();
}).fail((error) => {
Toast.fire({
icon: 'error',
title: error.responseJSON.messages.error,
});
})
}
})
})
$(function () {
$("#modalAddTipovehiculo").draggable();
});
</script>
<?= $this->endSection() ?>
Agregamos el modal para la captura de tipos vehículos App/Views/modulesTipovehiculo/modalCaptureTipovehiculo.php con el siguiente código
<!-- Modal Tipovehiculo -->
<div class="modal fade" id="modalAddTipovehiculo" tabindex="-1" role="dialog" aria-labelledby="modalAddTipovehiculo" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><?= lang('tipovehiculo.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-tipovehiculo" class="form-horizontal">
<input type="hidden" id="idTipovehiculo" name="idTipovehiculo" 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 idEmpresa form-controlCustumers" name="idEmpresa" id="idEmpresa" 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="codigo" class="col-sm-2 col-form-label"><?= lang('tipovehiculo.fields.codigo') ?></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="codigo" id="codigo" class="form-control <?= session('error.codigo') ? 'is-invalid' : '' ?>" value="<?= old('codigo') ?>" placeholder="<?= lang('tipovehiculo.fields.codigo') ?>" autocomplete="off">
</div>
</div>
</div>
<div class="form-group row">
<label for="descripcion" class="col-sm-2 col-form-label"><?= lang('tipovehiculo.fields.descripcion') ?></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="descripcion" id="descripcion" class="form-control <?= session('error.descripcion') ? 'is-invalid' : '' ?>" value="<?= old('descripcion') ?>" placeholder="<?= lang('tipovehiculo.fields.descripcion') ?>" 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="btnSaveTipovehiculo"><?= lang('boilerplate.global.save') ?></button>
</div>
</div>
</div>
</div>
<?= $this->section('js') ?>
<script>
$("#idEmpresa").select2();
$(document).on('click', '.btnAddTipovehiculo', function (e) {
$(".form-control").val("");
$("#idTipovehiculo").val("0");
$("#idEmpresa").val("0");
$("#idEmpresa").trigger("change");
$("#btnSaveTipovehiculo").removeAttr("disabled");
});
/*
* AL hacer click al editar
*/
$(document).on('click', '.btnEditTipovehiculo', function (e) {
var idTipovehiculo = $(this).attr("idTipovehiculo");
//LIMPIAMOS CONTROLES
$(".form-control").val("");
$("#idTipovehiculo").val(idTipovehiculo);
$("#btnGuardarTipovehiculo").removeAttr("disabled");
});
</script>
<?= $this->endSection() ?>
Agregamos la ruta en App/Config/Routes.php en grupo admin
$routes->resource('tipovehiculo', [
'filter' => 'permission:tipovehiculo-permission',
'controller' => 'tipovehiculoController',
'except' => 'show'
]);
$routes->post('tipovehiculo/save', 'TipovehiculoController::save');
$routes->post('tipovehiculo/getTipovehiculo', 'TipovehiculoController::getTipovehiculo');
$routes->post('vehiculos/getTipoVehiculoAjax', 'TipovehiculoController::getTipoVehiculosAjax');
Agregamos el el menú con los siguientes datos

Agregamos el Permiso

Y listo ya tenemos nuestro CRUD de tipos de vehiculos

1 pingback