Skip to content

MelisEngine ​

Base de datos compartida del CMS — modelo de páginas, sitios, idiomas, clase base del plugin de plantillas y la caché de renderizado. Paquete melisplatform/melis-engine.

Propósito ​

MelisEngine es propietario de todo el modelo de base de datos del CMS (páginas, árbol de páginas, sitios, plantillas, idiomas, dominios, SEO, estilos) y lo expone a través de gateways de tablas, servicios y una caché multinivel. Tanto MelisFront (renderizado del front-end) como MelisCms (edición en el back-office) leen y escriben exclusivamente a través de MelisEngine — ninguno de los módulos hermanos es propietario de tablas. También define MelisTemplatingPlugin, la clase base abstracta que extiende cada plugin de contenido de la plataforma.

Rol en el back-office React ​

MelisEngine no tiene herramienta de back-office React ni interfaz propia — ni brick, ni config/react-api.php, ni capacidades, ni entrada en la barra lateral de /melis-react. No está migrado a React y no está pensado para estarlo: es infraestructura de la plataforma, no una herramienta de back-office. Su relación con la capa React ocurre por completo entre bastidores, a través de dos vías:

  • Vía de datos — los controladores del CMS React (MelisReactApi*, que residen en los módulos del CMS, no aquí) leen y escriben páginas, sitios, idiomas, plantillas y SEO únicamente a través de los gateways MelisEngineTable* y los servicios de MelisEngine (MelisEnginePage, MelisEngineTree, MelisEngineLang, …). La capa React nunca toca el esquema del CMS directamente.
  • Vía de renderizado — el contenido del CMS que se muestra en el editor de páginas React y en las herramientas heredadas dentro de iframes se renderiza en el servidor (páginas → plantillas → zonas → plugins). El motor resuelve el modelo de páginas y define la clase base del plugin; MelisFront ejecuta el renderizado real. React embebe el resultado renderizado en el servidor en lugar de volver a renderizar el contenido del CMS en el cliente.

Como es invisible pero fundamental, los problemas del motor se manifiestan dentro de las herramientas del CMS React — un árbol de páginas vacío, un desplegable de idiomas que permanece vacío, un editor de páginas que da error al cargar — normalmente causados por una tabla del CMS que falta o está desactualizada, o por un servicio del motor que falla, nunca por una pantalla del motor (no existe ninguna).

Cómo habilitarlo ​

MelisEngine se carga automáticamente como dependencia. El orden de carga en config/melis.module.load.php es:

php
// config/melis.module.load.php
return [
    'MelisCore',
    'MelisFront',
    'MelisEngine',   // requires melis-core + melis-front
    'MelisCms',
];

Dependencias de Composer: melisplatform/melis-core ^6.0, melisplatform/melis-front ^6.0, laminas/laminas-cache (adaptadores de sistema de archivos + memoria). Se ejecuta sobre PHP ^8.3 | ^8.5.

Servicios clave ​

Registrados como alias de service_manager en config/module.config.php:

Alias de servicioRol
MelisEnginePage / MelisPageServiceResuelve una página por id y modo (published / saved): getDatasPage($idPage, $mode) — devuelve el árbol de páginas hidratado, los datos de la página, el SEO, la plantilla y los objetos de estilo
MelisEngineTree / MelisTreeServiceNavegación por el árbol de páginas: getPageChildren(), getPageFather(), getPageBreadcrumb(), getPageLink(), búsqueda
MelisEngineTemplateServiceBúsqueda de plantillas: getTemplate($tplId)
MelisEngineSiteServiceCatálogo de sitios
MelisEngineSiteDomainServiceResolución dominio → sitio: getSiteByDomain()
MelisEngineLang / MelisEngineLangServiceIdiomas: idiomas disponibles, locale ↔ id, idioma del sitio
MelisEngineSEOServiceDatos SEO por página: getSEOById()
MelisEnginePageDefaultUrlsServiceBúsquedas de URL de página precalculadas / canónicas
MelisEngineStyle / MelisEngineStyleServiceEstilos del sitio y CSS por página
MelisEngineCacheSystemOrquestador de caché: getCacheByKey(), setCacheByKey(), deleteCacheByPrefix()
MelisSearchÍndice de páginas de texto completo (estilo Lucene) usado por la búsqueda del front-end
MelisEngineSendMailUtilidad de correo electrónico
MelisGdprService / MelisGdprAutoDeleteServiceTextos del banner de RGPD y framework de autoeliminación
MelisEngineComposerOperaciones de Composer / dependencias

Todos los servicios que extienden MelisGeneralService disparan eventos *_start / *_end (p. ej. melisengine_service_get_available_languages_start / _end) a los que otros módulos pueden engancharse.

Consumidores React (verificados) ​

Estos son los puntos de entrada sancionados de la vía de datos por los que las herramientas del CMS React acceden al motor:

Servicio / gateway del motor (alias)Usado por (BO React)
MelisEnginePage (MelisPageService)melis-cms MelisReactApiPageController — datos de página para el editor de páginas React
MelisEngineTree (MelisTreeService)melis-cms MelisReactApiPageController — navegación por el árbol de páginas
MelisEngineLang (MelisEngineLangService)melis-cms MelisReactApiCmsSitesController, MelisReactApiCmsMenuManagerController — idiomas disponibles del CMS
MelisEngineTableCmsLang (MelisCmsLangTable)melis-cms-tags, melis-cms-user-account, melis-core (RGPD) — desplegables de idioma React

El alias MelisEngineTableCmsLang => MelisCmsLangTable::class está registrado en config/module.config.php.

Back-office ​

MelisEngine no tiene herramienta propia para el usuario final, ni en el back-office heredado ni en /melis-react. Sí registra dos factorías de elementos de formulario utilizadas en todo el back-office:

FactoríaPropósito
MelisEnginePluginTemplateSelectElemento de selección de plantilla para formularios de plugin
MelisEngineSiteSelectElemento de selección de sitio para formularios de plugin

También existen controladores de instalación y mantenimiento (MelisSetup*), pero son invocados por el instalador, no por los editores.

Front-office ​

Aquí reside la clase base de cada plugin de contenido:

ElementoDescripción
MelisEngine\Controller\Plugin\MelisTemplatingPluginBase abstracta para todos los plugins de contenido. Define front() (renderizado en vivo, abstracto), back() (contenedor/vista de edición del back-office), persistencia de la configuración XML (loadDbXmlToPluginConfig() / savePluginConfigToXml()), carga GET/POST, modo de vista previa y ancho responsivo.

Cada plugin de contenido de la plataforma (News, Slider, Menu, Breadcrumb, …) hereda de esta clase. Implementa front() para la salida en vivo; la clase base gestiona back() automáticamente. El mismo pipeline de plugins alimenta el editor de páginas React: MelisFront renderiza los plugins de cada zona en el servidor y React muestra el resultado.

Dos listeners de microservicios se enganchan a melis_core_microservice_amend_data para exponer métodos de árbol y de página (getPageChildren, getPageFather, getDomainByPageId, getDatasPage) sobre la capa de microservicios de la plataforma.

Tablas de la base de datos ​

MelisEngine es la única fuente de verdad para el esquema del CMS (install/sql/setup_structure.sql + deltas en install/dbdeploy/):

TablaContiene
melis_cms_page_treeJerarquía de páginas (tree_father_page_id, orden)
melis_cms_page_publishedVersión publicada (en vivo) de cada página
melis_cms_page_savedVersión guardada / borrador (editada en el back-office)
melis_cms_page_langEnlaces página ↔ idioma
melis_cms_langIdiomas / locales del CMS
melis_cms_siteSitios (raíz del árbol de páginas)
melis_cms_templatePlantillas (layout / controlador / acción o ruta PHP)
melis_cms_page_seoSEO por página (URL, redirección 301, meta title/description, canónica)
melis_cms_site_domainDominios del sitio por entorno
melis_cms_site_301 / melis_cms_site_404Redirecciones 301 / mapeo 404 a nivel de sitio
melis_cms_page_default_urlsURL de página precalculadas (tabla de caché)
melis_cms_style / melis_cms_page_styleEstilos CSS y enlaces página ↔ estilo
melis_cms_platform_idsRangos de asignación de id de página por entorno
melis_cms_site_config / _home / _langsConfiguración del sitio, página de inicio por idioma, idiomas activos
melis_cms_site_robotrobots.txt por dominio
melis_cms_mini_tpl_*Categorías, plantillas y flags de mini-plantillas
melis_cms_gdpr_textsTextos del banner de RGPD por sitio / idioma
melis_site_translation / _textCadenas de traducción a nivel de sitio

Gateways de tablas ​

Cada tabla está envuelta por un gateway MelisEngineTable* registrado en el service manager (p. ej. MelisEngineTablePageTree, MelisEngineTablePagePublished, MelisEngineTablePageSeo). Otros módulos — heredados o React — deben usar siempre estos gateways, nunca SQL en crudo. El gateway base proporciona getEntryById(), getEntryByField(), save(), deleteById(), fetchAll().

Ejemplo ​

Leer una página y navegar por el árbol:

php
$pageSvc = $sm->get('MelisEnginePage');
$page    = $pageSvc->getDatasPage($idPage);            // 'published' (live) by default
$draft   = $pageSvc->getDatasPage($idPage, 'saved');   // draft shown in the React page editor

$tree       = $sm->get('MelisEngineTree');
$children   = $tree->getPageChildren($idPage, 1);       // 1 = published only
$breadcrumb = $tree->getPageBreadcrumb($idPage);
$url        = $tree->getPageLink($idPage, true);        // true = absolute URL

Rellenar un desplegable de idiomas React desde un controlador del CMS (en el servidor, delegando al motor):

php
// Inside a MelisReactApi* controller of a CMS module — the React JSON layer
// delegates to the engine; MelisEngine exposes no react-api of its own.
$langTable = $sm->get('MelisEngineTableCmsLang');
$langs     = $langTable->fetchAll()->toArray();   // fills a React language dropdown

Leer/escribir a través de un gateway de tabla (nunca SQL en crudo):

php
$seoTable = $sm->get('MelisEngineTablePageSeo');
$seo      = $seoTable->getEntryByField('plang_page_id', $idPage)->current();
$seoTable->save(['seo_meta_title' => 'New title'], $existingSeoId);  // upsert

Cachear un resultado calculado:

php
$cache = $sm->get('MelisEngineCacheSystem');
$cache->setCacheByKey('mykey', 'my_cache_config', $value);
$value = $cache->getCacheByKey('mykey', 'my_cache_config');
$cache->deleteCacheByPrefix('page_' . $idPage, 'meliscms_page');   // invalidate a page

Escuchar un evento de servicio:

php
$sharedEvents->attach('MelisEngine', 'melisengine_page_getdatas_end', function ($e) {
    $p = $e->getParams();   // includes page id and 'results'
    // alter $p['results'] before it is returned
}, 50);

Construir un plugin de contenido:

php
// Subclass MelisTemplatingPlugin, implement front() for live render.
// The base class handles back() (BO container), config XML persistence and preview.
class MyPlugin extends MelisEngine\Controller\Plugin\MelisTemplatingPlugin
{
    public function front(): string
    {
        return $this->getView()->render('my-module/plugin/my-plugin', $this->pluginConfig);
    }
}

El trío Core / Engine / Front ​

El back-office React no cambia el trío; se apoya sobre él:

  • MelisEngine (este módulo) — es propietario de todo el modelo de BD del CMS y lo expone mediante gateways de tablas + servicios + caché; define MelisTemplatingPlugin.
  • MelisFront — renderiza las páginas a partir de los datos del motor (ejecuta los plugins de contenido) y da soporte a la vista previa editable usada dentro del back-office (heredado y el editor de páginas React / herramientas en iframe).
  • MelisCms — el back-office del CMS; no es propietario de ninguna tabla y edita todo a través del motor. Sus herramientas del CMS React (MelisReactApiPage, MelisReactApiCmsSites, MelisReactApiCmsMenuManager, …) son los consumidores React enumerados arriba.

Archivos clave ​

ÁmbitoRuta
Alias de servicios y gateways, cachésvendor/melisplatform/melis-engine/config/module.config.php
Servicio de datos de páginavendor/melisplatform/melis-engine/src/Service/MelisPageService.php
Servicio de árbol / enlacesvendor/melisplatform/melis-engine/src/Service/MelisTreeService.php
Orquestador de cachévendor/melisplatform/melis-engine/src/Service/ (MelisEngineCacheSystem*)
Clase base del plugin de plantillasvendor/melisplatform/melis-engine/src/Controller/Plugin/MelisTemplatingPlugin.php
Gateways de tablasvendor/melisplatform/melis-engine/src/Model/Tables/
Esquema + migraciones deltavendor/melisplatform/melis-engine/install/sql/

Véase también: MelisFront · MelisCms · MelisCore