Servicios
Utilidades
Las utilidades están en core/tools/ y core/network/. Casi todas son clases con métodos estáticos que se incluyen con Koshkil::Uses().
Koshkil::Uses('sys.tools.utils.stringUtils');
echo stringUtils::makeURL('Oferta de Invierno 2026'); // oferta-de-invierno-2026
Cadenas: stringUtils
| Método | Uso |
|---|---|
makeURL($texto) |
Texto apto para URL (slug). |
makeExcerpt($texto, $largo = 200, $fin = '...') |
Resumen sin cortar palabras. |
makePlainText($texto) / removeTags($html) / strip_tags_attributes($html) |
Limpieza de HTML. |
makeClickableLinks($texto) |
Convierte URLs en enlaces. |
safeName($nombre, $ruta = null) |
Nombre de archivo seguro y único. |
isEmail($texto) |
Valida un email. |
countWords($texto), stringOccurrence($aguja, $pajar) |
Conteos. |
getMonthName($mes, $corto = true) |
Nombre del mes en español. |
padString($texto, $relleno, $veces, $lado = 'left') |
Relleno. |
number_unformat($numero, $decimales, $miles, $decimal) |
Convierte "1.234,50" en número. |
replace_all($buscar, $reemplazo, $texto) |
Reemplazo repetido hasta que no queden coincidencias. |
Fechas: datesUtils
Koshkil::Uses('sys.tools.utils.datesUtils');
datesUtils::formatDateTime('22/09/2026', 'dd/mm/yy', 'yyyy-mm-dd'); // '2026-09-22'
datesUtils::elapsed('2026-09-22 10:00:00'); // tiempo transcurrido, en español
datesUtils::timeLeft('2026-12-31 23:59:59');
$fecha = new datesUtils('22/09/2026 10:00:00');
$fecha = $fecha->addDays(7)->addHours(2); // cada operación devuelve una fecha nueva
echo $fecha->format('Y-m-d H:i:s');
$fecha->dayOfWeek(); $fecha->month(); $fecha->year();
Archivos: fileUtils
| Método | Uso |
|---|---|
mkdir($carpeta) / createDirectory($ruta) |
Crea carpetas (recursivo). |
deleteFiles($carpeta, '*.cache') / removeFolder($ruta) |
Borrado. |
getTempDir() |
Carpeta temporal del proyecto. |
processSingleUpload($campo, $registro, $grupo, $tipo, $uso) |
Guarda una subida en la galería asociada a un registro. |
processMultipleUpload($campo, $registro, $grupo) |
Varias subidas. |
uploadedFileIsValid($campo, $requisitos) |
Valida tipo y tamaño. |
getFileIcon($archivo, $fontawesome = false) |
Ícono según la extensión. |
rotateFile($archivo, $maxHistorial) |
Rotación (la usan los logs). |
Imágenes: imagesUtils
Koshkil::Uses('sys.tools.utils.imagesUtils');
imagesUtils::resizePicture($origen, $destino, 1200, 800); // mantiene la proporción
imagesUtils::loadAndLimitDiskSize($ruta, 300 * 1024); // recomprime hasta ~300 KB
imagesUtils::getRemoteImage($url, $archivoLocal, 800, 600);
Otras utilidades
| Clase | Métodos principales |
|---|---|
arrayUtils |
deepMerge($a, $b), sanitizeStrings($arreglo), buildQueryForCurl($arreglo) |
numberUtils |
stringToNumber('1M') → 1048576, numberToString($n, $factor) |
encodingUtils |
Conversión UTF-8 / ISO-8859-1 (utf8_encode, utf8_decode) |
htmlUtils |
parseTag($html), getTagParameters($atributos) |
passwordUtils |
createHash($clave, $hashGuardado = null) |
totpUtils |
Códigos de un solo uso (TOTP) para segundo factor: secretKey(), verifyKey() |
Inflector |
camelize(), deCamelize(), pluralize(), singularize() |
Sanitize |
mask($datos, $opciones) enmascara contraseñas y tarjetas (lo usa el log) |
TCollection |
Colección iterable (ver Modelos) |
Correo
emailUtils envuelve PHPMailer y toma la configuración SMTP de config/email.php:
<?php
$CONFIG = [
'Email' => [
'Smtp' => ['host' => 'smtp.misitio.com', 'port' => 587, 'secure' => true, 'username' => '…', 'password' => '…'],
'Options' => [
'Sender' => ['name' => 'Mi sitio', 'address' => 'no-responder@misitio.com'],
'useRealAddress' => true, // false: todo se envía a sendTo (útil en desarrollo)
'sendTo' => ['name' => 'Pruebas', 'address' => 'pruebas@misitio.com'],
],
],
];
Koshkil::Uses('sys.tools.utils.emailUtils');
$mail = new emailUtils();
$mail->sendTextMailByAddress('cliente@correo.com', 'Tu pedido', '<p>¡Gracias por tu compra!</p>');
$mail->sendTextMailByAddresses(['a@correo.com', 'b@correo.com'], 'Aviso', $html, [$rutaAdjunto]);
Los métodos sendMailByAddress(), sendMailByUser() y sendMailByRules() usan plantillas guardadas en la base (modelo email_template: tmp_nombre, tmp_titulo, tmp_contenido) y reemplazan [variable] con los valores de setVariable(). sendMailByRules('noticias') escribe a todos los usuarios que tienen esa regla.
Red
Koshkil::Uses('sys.network.clients.curl');
$http = new curl('https://api.ejemplo.com/v1/precios');
$http->setOptions([CURLOPT_TIMEOUT => 10]);
$json = $http->post(['producto' => 15], ['Accept: application/json']);
Koshkil::Uses('sys.network.clients.ftp');
$ftp = new FTPClient('ftp.misitio.com', 'usuario', 'clave', '/public_html');
$ftp->connect();
$ftp->login();
$ftp->put($archivoLocal, 'imagenes/foto.jpg');
$ftp->close();
Extensions.Ftp.PassiveMode (en config/extensions.php) activa el modo pasivo. Las subidas de la galería pueden replicarse por FTP con los datos usr_ftp_* del usuario.