O framework PHP por trás do SitioYa

Documentação do Koshkil

Serviços

Utilitários

Os utilitários ficam em core/tools/ e core/network/. Quase todos são classes com métodos estáticos incluídas com Koshkil::Uses().

Koshkil::Uses('sys.tools.utils.stringUtils');
echo stringUtils::makeURL('Promoção de Inverno 2026');   // promocao-de-inverno-2026

Strings: stringUtils

Método Uso
makeURL($texto) Texto próprio para URL (slug).
makeExcerpt($texto, $tamanho = 200, $fim = '...') Resumo sem cortar palavras.
makePlainText($texto) / removeTags($html) / strip_tags_attributes($html) Limpeza de HTML.
makeClickableLinks($texto) Transforma URLs em links.
safeName($nome, $caminho = null) Nome de arquivo seguro e único.
isEmail($texto) Valida um e-mail.
countWords($texto), stringOccurrence($agulha, $palheiro) Contagens.
getMonthName($mes, $curto = true) Nome do mês em espanhol.
padString($texto, $preenchimento, $vezes, $lado = 'left') Preenchimento.
number_unformat($numero, $decimais, $milhar, $decimal) Converte "1.234,50" em número.
replace_all($buscar, $substituto, $texto) Substituição repetida até não restarem ocorrências.

Datas: 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');                           // tempo decorrido, em espanhol
datesUtils::timeLeft('2026-12-31 23:59:59');

$data = new datesUtils('22/09/2026 10:00:00');
$data = $data->addDays(7)->addHours(2);   // cada operação retorna uma data nova
echo $data->format('Y-m-d H:i:s');
$data->dayOfWeek(); $data->month(); $data->year();

Arquivos: fileUtils

Método Uso
mkdir($pasta) / createDirectory($caminho) Cria pastas (recursivo).
deleteFiles($pasta, '*.cache') / removeFolder($caminho) Exclusão.
getTempDir() Pasta temporária do projeto.
processSingleUpload($campo, $registro, $grupo, $tipo, $uso) Guarda um upload na galeria, associado a um registro.
processMultipleUpload($campo, $registro, $grupo) Vários uploads.
uploadedFileIsValid($campo, $requisitos) Valida tipo e tamanho.
getFileIcon($arquivo, $fontawesome = false) Ícone conforme a extensão.
rotateFile($arquivo, $maxHistorico) Rotação (usada pelos logs).

Imagens: imagesUtils

Koshkil::Uses('sys.tools.utils.imagesUtils');

imagesUtils::resizePicture($origem, $destino, 1200, 800);   // mantém a proporção
imagesUtils::loadAndLimitDiskSize($caminho, 300 * 1024);     // recomprime até ~300 KB
imagesUtils::getRemoteImage($url, $arquivoLocal, 800, 600);

Outros utilitários

Classe Métodos principais
arrayUtils deepMerge($a, $b), sanitizeStrings($array), buildQueryForCurl($array)
numberUtils stringToNumber('1M') → 1048576, numberToString($n, $fator)
encodingUtils Conversão UTF-8 / ISO-8859-1 (utf8_encode, utf8_decode)
htmlUtils parseTag($html), getTagParameters($atributos)
passwordUtils createHash($senha, $hashGuardado = null)
totpUtils Códigos de uso único (TOTP) para segundo fator: secretKey(), verifyKey()
Inflector camelize(), deCamelize(), pluralize(), singularize()
Sanitize mask($dados, $opcoes) mascara senhas e cartões (usado pelo log)
TCollection Coleção iterável (veja Modelos)

E-mail

emailUtils envolve o PHPMailer e lê a configuração SMTP de config/email.php:

<?php
$CONFIG = [
    'Email' => [
        'Smtp' => ['host' => 'smtp.meusite.com', 'port' => 587, 'secure' => true, 'username' => '…', 'password' => '…'],
        'Options' => [
            'Sender' => ['name' => 'Meu site', 'address' => 'nao-responda@meusite.com'],
            'useRealAddress' => true,   // false: tudo vai para sendTo (útil em desenvolvimento)
            'sendTo' => ['name' => 'Testes', 'address' => 'testes@meusite.com'],
        ],
    ],
];
Koshkil::Uses('sys.tools.utils.emailUtils');

$mail = new emailUtils();
$mail->sendTextMailByAddress('cliente@correio.com', 'Seu pedido', '<p>Obrigado pela compra!</p>');
$mail->sendTextMailByAddresses(['a@correio.com', 'b@correio.com'], 'Aviso', $html, [$caminhoAnexo]);

Os métodos sendMailByAddress(), sendMailByUser() e sendMailByRules() usam templates guardados no banco (modelo email_template: tmp_nombre, tmp_titulo, tmp_contenido) e substituem [variavel] pelos valores de setVariable(). sendMailByRules('noticias') escreve para todos os usuários que têm essa regra.

Rede

Koshkil::Uses('sys.network.clients.curl');

$http = new curl('https://api.exemplo.com/v1/precos');
$http->setOptions([CURLOPT_TIMEOUT => 10]);
$json = $http->post(['produto' => 15], ['Accept: application/json']);
Koshkil::Uses('sys.network.clients.ftp');

$ftp = new FTPClient('ftp.meusite.com', 'usuario', 'senha', '/public_html');
$ftp->connect();
$ftp->login();
$ftp->put($arquivoLocal, 'imagens/foto.jpg');
$ftp->close();

Extensions.Ftp.PassiveMode (em config/extensions.php) ativa o modo passivo. Os uploads da galeria podem ser replicados por FTP com os dados usr_ftp_* do usuário.