El framework PHP detrás de SitioYa

Documentación de Koshkil

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.