El framework PHP detrás de SitioYa

Documentación de Koshkil

Primeros pasos

Configuración

La clase Configure

Toda la configuración vive en un único arreglo en memoria que se lee y escribe con claves separadas por puntos.

Configure::read('Templates.Theme');              // 'cgs'
Configure::read('Debug.Level', 0);               // con valor por defecto
Configure::check('Google.Recaptcha');            // ¿existe la clave?
Configure::write('Templates.Site.phone', '...'); // crea los niveles que falten
Configure::consume('flash_message');             // lee y borra
Configure::delete('scripts');
Configure::merge(['Web' => ['SiteName' => 'X']]); // fusión profunda

Desde Smarty se usa igual: {Configure::read('Web.SiteName')}.

Tip

Configure también sirve como almacenamiento de la petición en curso: la ruta (System.Route), los scripts y estilos agregados (scripts, styles) y los mensajes (flash_message, error_message) se guardan ahí.

Cómo se cargan los archivos

Koshkil::loadConfig() se ejecuta al incluir core/Koshkil.php. Por cada archivo de la lista carga primero la versión global de config/ y después, si existe, la del dominio. Cada archivo define un arreglo $CONFIG que se fusiona en profundidad con lo ya cargado, así que el dominio solo necesita declarar lo que cambia.

Archivos que se cargan en cada petición, en este orden:

  1. config.php
  2. datasources.php
  3. cache.php
  4. extensions.php
  5. sessions.php
  6. rewrite.php
  7. i18n.php

Para cada uno, la sobrescritura del dominio se busca en este orden (se usa la primera que exista):

Ubicación Ejemplo
config/domains/cli/<archivo> solo si SERVER_NAME está vacío (línea de comandos)
config/domains/<dominio>/<archivo> config/domains/misitio.com/config.php
config/domains/<dominio>/<archivo>.php
config/domains/<dominio>.<archivo> config/domains/misitio.com.config.php
config/domains/<dominio>.php solo para config.php

Otros archivos se cargan a pedido: email.php al enviar correo, google.php desde SuperController, api.php desde ApiService. Podés cargar los tuyos igual:

Koshkil::loadConfig(['pagos.php']);   // config/pagos.php + config/domains/<dominio>/pagos.php

Reutilizar la configuración de otro dominio

Un dominio de desarrollo puede partir del de producción e incluir su archivo antes de cambiar lo necesario:

php <?php require __DIR__ . '/../misitio.com/config.php'; $CONFIG = array_merge($CONFIG, ['Debug' => ['Level' => 2, 'Javascript' => true]]);

Claves principales

config.php

Clave Uso
System.DefaultController Controlador que responde cuando la URL no coincide con ninguno (por defecto index).
System.Text.MaxLength Largo máximo de textos usado por algunas utilidades.
Templates.Theme Carpeta de webroot/themes/ que usa el sitio público.
Templates.Menu, Templates.Site Datos que leen los widgets y plantillas de cada theme (menú, datos de contacto…).
Web.SiteName Nombre del sitio.
Debug.Level 0 = sin logs; 1 a 3 = logs con distinto enmascarado de datos sensibles; 6 = registra todo el SQL; 7 = perfila cada modelo.
Debug.Rewrite 5 o más registra el proceso de reescritura en tmp/logs/rewrite.log.
Debug.Javascript false hace que WebElements::addScript() prefiera la versión .min.js si existe.
Debug.Profiler.Enabled Activa el perfilador de tiempos (ver Caché, logs y depuración).
Error.Reporting Valor para error_reporting().
Log.MaxSize, Log.KeepHistory, Log.MaxHistory Rotación de los archivos de log.
Session.UserHandler.Frontend / .Backend Nombre de la variable de sesión del usuario en el sitio y en el panel.

datasources.php

$CONFIG = [
    'Database' => [
        'AutoUpdateSchema' => true,          // sincroniza tablas con los modelos
        'master' => [                        // conexión por defecto
            'Driver'   => 'MySQLi',          // MySQLi, PostgreSQL, SQLite, SQLServer, Oracle
            'Host'     => 'localhost',
            'Port'     => 3306,              // opcional
            'Charset'  => 'utf8mb4',         // opcional
            'User'     => '...',
            'Password' => '...',
            'Name'     => 'mi_base',         // en SQLite: ruta del archivo
        ],
    ],
];

Otros archivos

Archivo Contenido Más información
cache.php Motores y dominios de caché Caché
sessions.php Motor de sesión, nombre de cookie, tiempos Seguridad
rewrite.php System.Web.Rewrite: reglas de reescritura Ruteo
i18n.php Idiomas, idioma por defecto, detección Internacionalización
extensions.php Extensions.Chat, Extensions.Ftp, Extensions.Pusher
email.php Email.Smtp y remitente Utilidades
google.php Google.Recaptcha.SiteKey y clave secreta Seguridad
api.php Credenciales de la API interna del dominio API REST

Credenciales

datasources.php, api.php y email.php guardan contraseñas en texto plano. config/ queda fuera de webroot/, pero no subas esos archivos de los dominios reales al repositorio.