Nuevo cambio en el cual se podrán mover cn el mouse los modales
Modal Draggable se refiere a la capacidad de arrastrar y mover un cuadro de diálogo modal (o ventana emergente) en una interfaz de usuario. Una ventana modal es un tipo de ventana emergente que requiere que el usuario realice una acción antes de poder interactuar con el resto de la aplicación o sitio web. A menudo se utilizan para solicitar información importante o para mostrar mensajes críticos al usuario.
La función Modal Draggable permite que el usuario arrastre la ventana modal a cualquier lugar en la pantalla para evitar que obstruya información importante o para hacer más fácil su uso en pantallas pequeñas. Esta función se implementa en algunos frameworks y librerías de JavaScript para la creación de interfaces de usuario, como Bootstrap, Materialize y jQuery UI.
Para activarlo en modales ya hechos solo basta con poner el siguiente código, ejemplo
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.
-- 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
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);
}
}
Para respaldar información importante como base de datos, documentos ETC, en muchos lugares se opta por las nubes como Google Drive, Dropbox ETC
Pero en ocasiones simplemente se opta por comprimir y pasarlo a otro equipo de computo
Para ello normalmente se usa cobian pero en una ocasión en nuestro caso falló y no alcanzaba a copiarse el archivo completo
Así que mostraremos como hacer el comando para que comprima y copie el archivo aunque exista problemas de intermitencia en la red
Para comprimir es necesario tener instalado winRar, ya instalado para comprimir usamos el siguiente comando, en este caso copiamos el respaldo de la base de datos de SQL Server
Una vez comprimido se procede a realizar la copia en el otro equipo para ello usamos el siguiente comando, con robocopy en caso de que se caiga la red vuelve a intentar a copiarlo hasta que lo copia bien y completamente
robocopy "C:\respaldoDB" "\\IPDELOTROEQUIPO\Respaldo de prueba\carpetadestino"
Y procedemos a borrar el archivo creado en el equipo local
DEL /F /A C:\respaldoDB\Respaldo_%date:~-4,4%-%date:~-7,2%-%date:~-10,2%.rar
al final el archivo bat quedaría de la siguiente forma
"C:\Program Files"\WinRAR\rar a -r -rr -v4700M "C:\respaldoDB\Respaldo%date:~-4,4%-%date:~-7,2%-%date:~-10,2%.rar" "C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Backup\"
robocopy "C:\respaldoDB" "\\IPDELOTROEQUIPO\Respaldo de prueba\carpetadestino"
DEL /F /A C:\respaldoDB\Respaldo_%date:~-4,4%-%date:~-7,2%-%date:~-10,2%.rar
Ya listo para ejecutarlo a la hora que sea automáticamente con el programador de tareas de windows
En este tutorial lo que haremos sera instalar Laravel 9 con Login y la plantilla AdminLTE3 para ello solo necesitamos ya tener instalado la versión mas reciente de composer
Primero instalamos la carpeta de trabajo de Laravel 9
Bien ahora para seguir avanzando haremos las altas bajas y cambios del catalogo de empresas ya que actualmente solo tenemos para meter datos de una empresa.
Aprovechando meteremos varios campos extras como el logo, contraseña (Por si se tiene que ingresar por empresa), archivo .cer y .key y contraseña del certificado, por si en un futuro se mete la facturación electronica.
Uno de los cambios que no han estado solicitando es que no todos los usuario puedan ver el stock, si no que si no tiene derecho que solo vea el color por si esta bajo en existencia así que empezando
Primero que nada empezamos agregando el cambio del derecho en la base de datos para ello ejecutamos el siguiente comando en la base de datos
alter table perfiles add permiteVerStockVentas varchar(5) null
Que tal amigos, les voy a dejar esta herramienta con la cual podrán crear catalogo en tiempo récord, solo es necesario crear la tabla en MySQL con la columna id Primeria y con los demás campos que se necesite.
Esta herramienta es muy útil para reducir el tiempo de desarrollo ya que las actividades repetitivas las haremos muy rápido sin tanto esfuerzo
A continuación les dejo el manual
Primero creamos la tabla, en este ejemplo crearemos la tabla tiposGasto con la columna id como llave primeria, y las columnas descripcion, cuentaContable,subCuentaContrable les dejo el código SQL
Descomprimimos y en mi caso son las que están en la carpeta x64Ponemos las librerías en la carpeta EXT en donde están los archivos de PHP en mi caso la ruta es la que se ve en la imagenEn el archivo de configuracion que normalmente se llama php.ini agregamos las siguientes lineas extension=php_pdo_sqlsrv_81_nts extension=php_sqlsrv_81_nts.dll
Renombramos la carpeta a PHP
Si corremos el PHPINFO debe salir activo el modulo de pdo_sqlsrv
Esta utilidad sirve para guardar configuraciones de sistema, configuraciones que solo son por equipo y se quedan guardadas en la maquina y aun si se cierra el programa al volverlo abrir mostrara la información guardada
Para activar esta función nos vamos a propiedades del proyecto seleccionamos componentes y activamos el componente gb.settings
Ahora vamos a crear el formulario para guardar las configuraciones de la conexión a la base de datos pero antes de eso debemos de asegurarlos de tener el fuente bien organizado en carpetas para ello crearemos una carpeta llamada formularios y otra llamada módulos
Claro esta que en la carpeta llamada formularios se va a meter todos los formularios
En la carpeta módulos estarán los archivos con las funciones que se van a necesitar
Quedarían de la siguiente forma
Posteriormente le damos click derecho a la carpeta formularios no vamos a nuevo y seleccionamos formulario, le activamos la gestión de cuadro de dialogo y le damos aceptar
Nos quedaría de la siguiente forma dentro de la carpeta formularios
Ahora tenemos que agregar los controles necesarios para capturar la información necesaria que es el servidor, la base de datos el usuario y el password, se hara de la misma forma que se agregaron los controles en la publicación anterior
Quedaría de esta forma, también en los atributos del formulario le podemos poner que siempre aparezca en el medio
Ahora para que aparezca cuando demos click en el submenu configuración es muy fácil, le damos doble click al submenu y nos creara la siguiente función
Este es el evento y al darle click se va ejecutar toda instrucción que este escrito dentro de ella
Entonces escribimos la siguiente instrucción
frmFormulario.show
Es muy simple, queda de esta forma
Ahora cuando se le de click en Archivo -> Configuración mostrara la siguiente ventana
En la siguiente publicación mostraremos como guardar los datos de conexión de la base de datos en los registros, y estos siempre estarán guardados aunque se abra y cierre el programa
Usamos cookies en nuestro sitio web para brindarle la experiencia más relevante recordando sus preferencias y visitas repetidas. Al hacer clic en "Aceptar", acepta el uso de TODAS las cookies.
This website uses cookies to improve your experience while you navigate through the website. Out of these cookies, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may have an effect on your browsing experience.
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.