Servicios
Plugins
Qué es un plugin
Un plugin es un módulo autocontenido dentro de plugins/<nombre>/: tiene sus propios controladores, modelos, widgets, endpoints de API, plantillas, traducciones, permisos, menú del panel y reglas de reescritura. SitioYa trae, entre otros, noticias, clasificados, mensajes, stock, tablas y multidomain.
Crear uno
./app/bin/create-plugin.sh tienda
Crea esta estructura:
plugins/tienda/
├── config/
│ ├── config.php 'enabled' => true
│ ├── permissions.php reglas, roles y asignaciones
│ ├── menu.php ítems del menú del panel
│ ├── rewrite.php reglas de reescritura
│ ├── domains/ sobrescrituras por dominio
│ └── locales/{es,en,pt}/ traducciones
├── src/
│ ├── Controllers/ (Admin/, Ajax/…)
│ ├── Models/
│ ├── Widgets/
│ ├── Api/ endpoints: plugins.tienda.<clase>.<método>
│ ├── Components/ Hooks/ Libraries/
└── webroot/
├── css/ js/
└── templates/ admin/, front/, widgets/
Activación
PluginsManager::getInstalledPlugins() recorre plugins/ en cada petición y activa los que tengan 'enabled' => true en config/config.php. Cada dominio puede cambiarlo:
<?php
// plugins/tienda/config/domains/misitio.com/config.php
$CONFIG = ['enabled' => false];
La lista de plugins activos queda en PluginsManager::$installedPlugins. El resto de config.php se lee con:
PluginsManager::readPluginConfig('tienda', 'moneda', 'ARS');
PluginsManager::writePluginConfig('tienda', 'moneda', 'USD');
URLs
El primer segmento de la URL (después de admin/, si está) selecciona el plugin:
| URL | Controlador |
|---|---|
/tienda/carrito |
plugins/tienda/src/Controllers/CarritoController.php |
/admin/tienda/productos/editar/4 |
plugins/tienda/src/Controllers/Admin/ProductosController.php → editar(4) |
/tienda/js/carrito.js |
archivo plugins/tienda/webroot/js/carrito.js |
Las plantillas se buscan en plugins/tienda/webroot/templates/<front|admin>/, y los widgets del plugin con {html_widget type="plugins.tienda.front.carrito"}.
Permisos
<?php
// plugins/tienda/config/permissions.php
$PERMISSIONS = [
'rules' => [
'tienda' => ['name' => 'Acceso a la tienda', 'attributes' => 15],
'tienda_productos' => ['name' => 'ABM de productos', 'attributes' => 15],
],
'roles' => [
'Tienda' => 0,
],
'rules_roles' => [
'Tienda' => [
'tienda' => 8, // solo ver
'tienda_productos' => 15, // todo
],
],
];
attributes son los permisos que la regla admite (bits de add=1, edit=2, delete=4, view=8, ver Seguridad). Las reglas y roles se crean o actualizan solos cuando cambia el archivo.
Menú del panel
<?php
// plugins/tienda/config/menu.php
$MENU = [
'tienda' => [
'rules' => 'tienda',
'text' => __('main', [], 'menu', 'tienda'),
'iconmenu' => 'fa fa-shopping-cart',
'link' => Koshkil::getLink('admin/tienda/index'),
'options' => [
'productos' => [
'text' => __('products', [], 'menu', 'tienda'),
'rules' => 'tienda&tienda_productos',
'link' => Koshkil::getLink('admin/tienda/productos/listado'),
],
],
],
];
Cada ítem se muestra solo a quien cumple roles o rules.
Reescritura
<?php
// plugins/tienda/config/rewrite.php
$RULES = [
['rule' => '^tienda/producto/([0-9]+)$', 'target' => '/tienda/productos/ver/$1', 'flags' => 'L,NC'],
];
También hay una versión por dominio: config/domains/<dominio>/rewrite.php.
Modelos y extensión de usuarios
Koshkil::UsesModel('tienda.productos'); // plugins/tienda/src/Models/productos.php -> TMProductos
Si el plugin define un comportamiento usuarios (clase TiendaUsuariosBehavior en plugins/tienda/src/Models/Behaviors/Usuarios.php), se adjunta automáticamente al modelo de usuarios: así un plugin agrega métodos como $usuario->pedidos() sin tocar el núcleo. En los plugins, la clase de un comportamiento lleva el nombre del plugin como prefijo.
Integración con plantillas
Un theme puede incluir las piezas que aporten todos los plugins activos:
{include_plugins folder="admin/dashboard"} {* cada plugin/webroot/templates/admin/dashboard/*.tpl *}
{include_plugins_scripts file="admin/dashboard.js"}