Sistema de comentarios para publicaciones de News y Blog — moderación, un flujo de aprobación opcional por publicación, un plugin de front-office «Post comments» y un widget de panel. En v6, la interfaz de moderación es una pestaña Comments en el editor React de News/Blog. Paquete melisplatform/melis-cms-comments.
MelisCmsComments añade un sistema de comentarios a las publicaciones de MelisCmsNews y MelisCmsBlog. Incluye el backend de comentarios (tabla melis_cms_comments + MelisCmsCommentsService), un plugin de plantillas de front-office (lista de comentarios + formulario «leave a comment»), un flujo de validación por publicación que mantiene los comentarios del front-office pendientes hasta que un administrador los aprueba, y un widget de panel Latest comments. Combinado con MelisCmsUserAccount, los comentarios pueden requerir una cuenta de sitio con sesión iniciada.
En el back-office React (/melis-react) este módulo no incluye ningún brick propio — sin ui-react/, sin react-api.php, sin react.capabilities.php. Es un módulo de backend + contribución con tres superficies pertenecientes al host:
una pestaña de moderación de comentarios dentro del editor de News/Blog — la interfaz de la pestaña React y sus endpoints /comments…pertenecen a los bricks de News y Blog, que delegan en el servicio de este módulo;
un plugin de página de front «Post comments» colocado y configurado en el editor de páginas CMS React;
un widget de panel «Latest comments» — un plugin de panel PHP/phtml heredado (legacy) renderizado dentro del host de widgets del panel React (sin reescritura en React).
Dependencias de Composer: melis-core ^6.0 y melis-cms ^6.0. Funcionalmente requiere al menos un módulo de publicaciones — MelisCmsNews o MelisCmsBlog — para ser útil. MelisCmsUserAccount es una integración opcional para comentarios restringidos a cuentas. Todas las superficies están condicionadas a la activación: cuando el módulo está ausente, los endpoints de comentarios de News/Blog devuelven 404 y el panel de moderación se oculta.
Servicio principal de CRUD/moderación (extiende MelisEngineGeneralService). Dispara pares de eventos *_start/*_end en cada método. Llamado por los controladores react-api de News/Blog.
Métodos clave de MelisCmsCommentsService:
php
$svc = $sm->get('MelisCmsCommentsService');// Create or update a comment (BO comments are approved immediately)$id = $svc->saveComment($text, $postId, $commentId, 'NEWS', $name, $authorId, 'front');// Fetch a single comment$comment = $svc->getCommentById($id);// Front-office list for a post (ordered)$list = $svc->getCommentsByPostId($postId, 'BLOG', 'mccom_date_creation', 'DESC');// Back-office query — omit 'validated' to return pending + approved + refused$rows = $svc->getComments([ 'postType' => 'NEWS', 'postId' => $postId, 'withUserInfo' => true, 'limit' => 10,]);// Moderation$svc->approveComment($id); // mccom_validated=1, status=1 (shown)$svc->refuseComment($id); // mccom_validated=2, status=0 (hidden)$svc->deleteCommentById($id);// Cascade-delete when a post is removed$svc->deletePostComments('NEWS', $postId);
saveComment() lee el indicador c{type}_validate_comments de la publicación: cuando está activado y el comentario proviene del front-office, se almacena como pendiente (validated=0); los comentarios del back-office se almacenan como aprobados de inmediato. Todo el texto guardado pasa por HTMLPurifier 4.12 para su sanitización contra XSS.
Pestaña de moderación de comentarios (React, propiedad de News/Blog)
Abre un artículo de News o una publicación de Blog en el editor y cambia a la pestaña Comments. Muestra los comentarios de esta publicación con un punto de estado por fila (azul = pendiente, verde = mostrado, rojo = rechazado), el autor, el texto del comentario y la hora, un cuadro en línea Name + write-a-comment + Add a comment para publicar uno directamente, y acciones por fila de aprobar / rechazar / eliminar (aprobar/rechazar solo aparecen cuando la publicación tiene la validación activada).
El componente de la pestaña React pertenece a los bricks de News/Blog, no a este módulo. No hay react-api.php en MelisCmsComments — los comentarios se exponen a través del react-api propio de los módulos News y Blog, que delega cada operación en MelisCmsCommentsService:
Método y URL
Controlador / acción propietaria
Propósito
GET /melis/react-api/news/:id/comments
MelisCmsNewsReactApiController::commentsAction
Todos los comentarios (todos los estados) de un artículo de news
POST /melis/react-api/news/comments/save
commentSaveAction
Crear/editar un comentario (BO → aprobado)
POST /melis/react-api/news/comments/approve/:cid
commentApproveAction
Aprobar (mccom_validated=1, status=1)
POST /melis/react-api/news/comments/refuse/:cid
commentRefuseAction
Rechazar (mccom_validated=2, status=0)
POST /melis/react-api/news/comments/delete/:cid
commentDeleteAction
Eliminar el comentario
GET /melis/react-api/blog/:id/comments
MelisCmsBlog…ReactApiController::commentsAction
Todos los comentarios de una publicación de blog
POST /melis/react-api/blog/comments/{save,approve,refuse,delete}[/:cid]
Acciones de comentario de Blog
Las mismas operaciones para Blog
El commentsAction construye una consulta getComments(['postId' => …, 'postType' => 'NEWS']) sin clave validated, por lo que devuelve comentarios pendientes + aprobados + rechazados. Cada acción devuelve 404 cuando el módulo no está disponible; el contrato es { success, data|error }.
El MelisCmsCommentsTabController heredado (getComments / save / approve / refuse / delete, protegido por hasAccess('meliscms_page')) todavía se usa en la ruta clásica/iframe — consulta la documentación heredada.
Controller\Plugin\MelisCmsCommentsPlugin es un MelisTemplatingPlugin (clave de configuración meliscmscomments, sección MelisCms, configuración en config/plugins/MelisCmsCommentsPlugin.config.php). En el panel PLUGINS del editor de páginas CMS React, bajo Melis Cms Comments, arrastra Post comments a una zona de destino en una plantilla de página de News/Blog.
La ventana modal de configuración elige la Template (por defecto MelisCmsComments/comments) y el Post Type (NEWS / BLOG), que se persisten en el XML del plugin de la página como template_path, mccplugin_post_type y registration_page_page_id (para comentarios restringidos a cuentas mediante MelisCmsUserAccount).
El renderizado de front (front()) resuelve la publicación a partir del parámetro de consulta newsId / blogId, carga los comentarios mediante getCommentsByPostId() y construye el formulario para añadir comentarios (Name + comentario + Submit). Cuando la publicación requiere una cuenta, dispara melis_cms_user_account_login_form para incrustar un plugin de inicio de sesión.
Vista por defecto MelisCmsComments/comments; recursos plugins/css/commentsPlugin.css, plugins/js/commentsPlugin.js.
Controller\DashboardPlugins\MelisCmsCommentsLatestCommentsPlugin extiende MelisCoreDashboardTemplatingPlugin; su latestCommentsAction() devuelve un ViewModel de Laminas (plantilla melis-cms-comments/dashboard/latest-comments, un .phtml), registrado en config/dashboard-plugins/dashboard.config.php (id de plugin MelisCmsCommentsLatest). El host de widgets del panel React renderiza este plugin heredado tal cual — no hay reescritura en React. Muestra los comentarios más recientes por tipo de publicación (pestañas Blog / News) con filtros All sites / All users / límite, y por cada comentario muestra el autor, una insignia de estado, el título de la publicación y la fecha. Los filtros de sitio/usuario y la recarga de zona los sirve MelisCmsCommentsViewHelperController::listAction (melis-cms-comments/dashboard/list, zona dashboard_latest_comments_list).
RGPD: pone a null mccom_author_account para una cuenta eliminada y luego vuelve a disparar el evento RGPD del módulo.
Module::addValidateCommentsField() (arranque del back-office) comprueba qué módulos de publicaciones están activos y añade la columna c{news,blog}_validate_comments a sus tablas si falta.
La interfaz de la pestaña Comments de React y sus endpoints /comments… residen en los bricks de News/Blog (MelisCmsNewsReactApiController, MelisCmsBlog…ReactApiController); ambos delegan en MelisCmsCommentsService. Modelo de datos, servicio y la herramienta clásica: documentación heredada.
MelisCmsComments
Propósito
MelisCmsComments añade un sistema de comentarios a las publicaciones de MelisCmsNews y MelisCmsBlog. Incluye el backend de comentarios (tabla
melis_cms_comments+MelisCmsCommentsService), un plugin de plantillas de front-office (lista de comentarios + formulario «leave a comment»), un flujo de validación por publicación que mantiene los comentarios del front-office pendientes hasta que un administrador los aprueba, y un widget de panel Latest comments. Combinado con MelisCmsUserAccount, los comentarios pueden requerir una cuenta de sitio con sesión iniciada.En el back-office React (
/melis-react) este módulo no incluye ningún brick propio — sinui-react/, sinreact-api.php, sinreact.capabilities.php. Es un módulo de backend + contribución con tres superficies pertenecientes al host:/comments…pertenecen a los bricks de News y Blog, que delegan en el servicio de este módulo;Activarlo
Añádelo a
config/melis.module.load.php:Dependencias de Composer:
melis-core ^6.0ymelis-cms ^6.0. Funcionalmente requiere al menos un módulo de publicaciones — MelisCmsNews o MelisCmsBlog — para ser útil. MelisCmsUserAccount es una integración opcional para comentarios restringidos a cuentas. Todas las superficies están condicionadas a la activación: cuando el módulo está ausente, los endpoints de comentarios de News/Blog devuelven 404 y el panel de moderación se oculta.Servicios clave
MelisCmsCommentsServiceMelisEngineGeneralService). Dispara pares de eventos*_start/*_enden cada método. Llamado por los controladores react-api de News/Blog.Métodos clave de
MelisCmsCommentsService:saveComment()lee el indicadorc{type}_validate_commentsde la publicación: cuando está activado y el comentario proviene del front-office, se almacena como pendiente (validated=0); los comentarios del back-office se almacenan como aprobados de inmediato. Todo el texto guardado pasa por HTMLPurifier 4.12 para su sanitización contra XSS.Pestaña de moderación de comentarios (React, propiedad de News/Blog)
Abre un artículo de News o una publicación de Blog en el editor y cambia a la pestaña Comments. Muestra los comentarios de esta publicación con un punto de estado por fila (azul = pendiente, verde = mostrado, rojo = rechazado), el autor, el texto del comentario y la hora, un cuadro en línea Name + write-a-comment + Add a comment para publicar uno directamente, y acciones por fila de aprobar / rechazar / eliminar (aprobar/rechazar solo aparecen cuando la publicación tiene la validación activada).
El componente de la pestaña React pertenece a los bricks de News/Blog, no a este módulo. No hay
react-api.phpen MelisCmsComments — los comentarios se exponen a través del react-api propio de los módulos News y Blog, que delega cada operación enMelisCmsCommentsService:GET /melis/react-api/news/:id/commentsMelisCmsNewsReactApiController::commentsActionPOST /melis/react-api/news/comments/savecommentSaveActionPOST /melis/react-api/news/comments/approve/:cidcommentApproveActionmccom_validated=1, status=1)POST /melis/react-api/news/comments/refuse/:cidcommentRefuseActionmccom_validated=2, status=0)POST /melis/react-api/news/comments/delete/:cidcommentDeleteActionGET /melis/react-api/blog/:id/commentsMelisCmsBlog…ReactApiController::commentsActionPOST /melis/react-api/blog/comments/{save,approve,refuse,delete}[/:cid]El
commentsActionconstruye una consultagetComments(['postId' => …, 'postType' => 'NEWS'])sin clavevalidated, por lo que devuelve comentarios pendientes + aprobados + rechazados. Cada acción devuelve 404 cuando el módulo no está disponible; el contrato es{ success, data|error }.El
MelisCmsCommentsTabControllerheredado (getComments / save / approve / refuse / delete, protegido porhasAccess('meliscms_page')) todavía se usa en la ruta clásica/iframe — consulta la documentación heredada.Plugin de página de front «Post comments»
Controller\Plugin\MelisCmsCommentsPlugines unMelisTemplatingPlugin(clave de configuraciónmeliscmscomments, sección MelisCms, configuración enconfig/plugins/MelisCmsCommentsPlugin.config.php). En el panel PLUGINS del editor de páginas CMS React, bajo Melis Cms Comments, arrastra Post comments a una zona de destino en una plantilla de página de News/Blog.MelisCmsComments/comments) y el Post Type (NEWS / BLOG), que se persisten en el XML del plugin de la página comotemplate_path,mccplugin_post_typeyregistration_page_page_id(para comentarios restringidos a cuentas mediante MelisCmsUserAccount).front()) resuelve la publicación a partir del parámetro de consultanewsId/blogId, carga los comentarios mediantegetCommentsByPostId()y construye el formulario para añadir comentarios (Name + comentario + Submit). Cuando la publicación requiere una cuenta, disparamelis_cms_user_account_login_formpara incrustar un plugin de inicio de sesión.MelisCmsComments/comments; recursosplugins/css/commentsPlugin.css,plugins/js/commentsPlugin.js.Widget de panel «Latest comments» (legacy)
Controller\DashboardPlugins\MelisCmsCommentsLatestCommentsPluginextiendeMelisCoreDashboardTemplatingPlugin; sulatestCommentsAction()devuelve unViewModelde Laminas (plantillamelis-cms-comments/dashboard/latest-comments, un.phtml), registrado enconfig/dashboard-plugins/dashboard.config.php(id de pluginMelisCmsCommentsLatest). El host de widgets del panel React renderiza este plugin heredado tal cual — no hay reescritura en React. Muestra los comentarios más recientes por tipo de publicación (pestañas Blog / News) con filtros All sites / All users / límite, y por cada comentario muestra el autor, una insignia de estado, el título de la publicación y la fecha. Los filtros de sitio/usuario y la recarga de zona los sirveMelisCmsCommentsViewHelperController::listAction(melis-cms-comments/dashboard/list, zonadashboard_latest_comments_list).Tablas de la base de datos
melis_cms_commentsmccom_id,mccom_post_id,mccom_type(NEWS/BLOG),mccom_comment_text,mccom_name,mccom_validated,mccom_status,mccom_date_creation,mccom_author_account.Se añaden automáticamente dos columnas a las tablas de los módulos de publicaciones durante el arranque (sin necesidad de cambios de esquema allí):
cnews_validate_commentsmelis_cms_newscblog_validate_commentsmelis_cms_blogModelo de estados.
mccom_validated:0= nuevo/pendiente (azul),1= aprobado/mostrado (verde),2= rechazado/oculto (rojo).mccom_statusrefleja la visibilidad en el sitio (1mostrado /0oculto).Listeners y cableado entre módulos
Enlazados en
Module.phpdurante el arranque:MelisCmsCommentsFlashMessengerListenermelis_cms_comments_flash_messengerCMS_COMMENT_ADD / UPDATE / DELETE).MelisCmsCommentsSaveValidateCommentListenermeliscmsnews_get_postvaluescnews_validate_commentscuando se guarda una publicación de news.MelisCmsCommentsGdprAutoDeleteActionDeleteListenermelis_cms_user_account_gdpr_auto_delete_action_deletemccom_author_accountpara una cuenta eliminada y luego vuelve a disparar el evento RGPD del módulo.Module::addValidateCommentsField()(arranque del back-office) comprueba qué módulos de publicaciones están activos y añade la columnac{news,blog}_validate_commentsa sus tablas si falta.Archivos clave
vendor/melisplatform/melis-cms-comments/config/module.config.phpvendor/melisplatform/melis-cms-comments/config/plugins/MelisCmsCommentsPlugin.config.phpvendor/melisplatform/melis-cms-comments/config/dashboard-plugins/dashboard.config.phpvendor/melisplatform/melis-cms-comments/src/Service/MelisCmsCommentsService.phpvendor/melisplatform/melis-cms-comments/src/Controller/MelisCmsCommentsTabController.phpvendor/melisplatform/melis-cms-comments/src/Controller/Plugin/MelisCmsCommentsPlugin.phpvendor/melisplatform/melis-cms-comments/src/Controller/DashboardPlugins/MelisCmsCommentsLatestCommentsPlugin.phpvendor/melisplatform/melis-cms-comments/src/Listener/vendor/melisplatform/melis-cms-comments/src/Model/Tables/MelisCmsCommentsTable.phpvendor/melisplatform/melis-cms-comments/src/Module.phpvendor/melisplatform/melis-cms-comments/library/htmlpurifier-4.12.0/Consulta también: MelisCmsNews · MelisCmsBlog · MelisCms · MelisEngine · MelisCore