El framework PHP detrás de SitioYa

Documentación de Koshkil

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.phpeditar(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.

<?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"}