StyleManager - SectorsView - addToCollection() utiliza el atributo "name" para construir el ID y falla con varios espacios o caracteres especiales
Aquí está la captura de pantalla que mencioné antes: ! informe de error del atributo de identificación de grapesjs
Lee la respuesta completa abajo ↓Pregunta
Hola @artf,
Usando la propiedad pluginOpts del método grapesjs.init(), personalicé los sectores que aparecen en el Style Manager (a través del plugin Newsletter), así:
'''js grapesjs.init({ [...] Plugins: ['GJS-plugin-CKEDITOR', 'GJS-Blocks-Basic', 'GJS-Preset-Newsletter', 'GJS-Preset-Webpage'], pluginsOpts: { [...] 'gjs-preset-newsletter': { SectoresEstiloGestionado: [ { id: "dimensiones", nombre: "Mi etiqueta personalizada con espacios" buildProps: [ [...] ], [...] } ] } } );
El objetivo es traducir las etiquetas a otro idioma.
Pero he visto que también se usa la propiedad de "nombre"... para construir el atributo id de la etiqueta HTML de cada sector, con un prefijo personalizado, como "gjs-<namePropertyInLowercase>".
El problema surge cuando "name" contiene varios espacios: solo el primero se reemplaza, lo que lleva a un atributo id HTML inválido (con espacios), que no puede ser dirigido a través de CSS para aplicar algún estilo personalizado en el panel del Gestor de Estilos (ver captura de pantalla adjunta).
Abrí grapes.js y encontré esto en el método addToCollection():
'''js
var view = new SectorView({
modelo: modelo,
id: this.pfx + model.get('name').replace(' ', '_').toLowerCase(),
Nombre: Model.Get('Nombre'),
propiedades: model.get('propiedades'),
Objetivo: esto. Objetivo,
propTarget: this.propTarget,
config: this.config
});
Como sabrás, el método estándar de "reemplazar" de JavaScript está actuando un poco raro por defecto, reemplazando solo la primera aparición en la cadena de origen, si no configuras explícitamente un RegExp con la bandera g (a diferencia de todos los demás lenguajes de programación disponibles en la Tierra, que se encargan de esto automáticamente). De ahí el error.
Además, el atributo "nombre" puede contener caracteres especiales (acentuados) en algunos idiomas, y también podrían romper el ID, ya que no se escapa de ellos.
Si usar el atributo "name" es intencionado aquí, y no un error de copiar/pegar (por si te referías a 'model.get('id')' en lugar de 'model.get('name')'), ¿cuál es el propósito de esto? En lugar de usar, por ejemplo, una propiedad de "id", podríamos definirnos nosotros mismos? (y naturalmente evitando usar espacios o caracteres especiales con tal propiedad).
Podrías usar el atributo "id" si está definido, y recurrir a tu conversión actual de atributo "nombre" si es necesario (teniendo cuidado de reemplazar TODOS los espacios).
Por eso, cambié esta línea en grapes.js: 'id: this.pfx + model.get('name').replace(' ', '_').toLowerCase(),' con: 'id: this.pfx + model.get('id'),'
Y, en mi código:
SectoresEstiloGestionado: [ { id: "dimensiones", nombre: "Mi etiqueta personalizada con espacios", [...] } ]
Así que el ID de mis sectores ahora es "gjs-sm-dimensions" como era de esperar, y no "etiqueta gjs-sm-my_custom con espacios".
Pregunta secundaria: ¿es peligroso guardar este cambio mientras esperas una solución oficial (o no) por tu parte?
Gracias por tu opinión.
-Maxime
Respuestas (3)
Aquí está la captura de pantalla que mencioné antes:
! informe de error del atributo de identificación de grapesjs
Si usar el atributo "name" es intencionado aquí y no un error de copiar/pegar (por si te referías a model.get('id') en vez de model.get('name')), ¿cuál es el propósito de esto? En lugar de usar, por ejemplo, una propiedad de "id", podríamos definirnos nosotros mismos? (y naturalmente evitando usar espacios o caracteres especiales con tal propiedad).
Bueno, definitivamente no es una decisión acertada, probablemente aún no usaba 'id's en esos modelos. Lo cambiaré en la próxima entrega.
Pregunta de subsidiaria: ¿es peligroso mantener este cambio mientras esperas una solución oficial (o no) de tu parte?
Creo que, para hacerlo más amigable para personalizar, sería necesario eliminar ese atributo id y añadir una nueva clase, así que el resultado final debería ser 'class="gjs-sm-sector gjs-sm-sector__MYID"'
Este hilo se ha bloqueado automáticamente porque no ha habido actividad reciente desde que se cerró. Por favor, abre un nuevo problema para bugs relacionados.
Preguntas y respuestas relacionadas
Continúa investigando con debates sobre temas similares.
Issue #689
Cambia el valor del atributo que se transmite a través de los rasgos
Hola @artf ¿Existe algún método para manipular el valor de entrada de un atributo que se pasa a través de rasgos? Por ejemplo, pasé el valo...
Issue #1484
[Pregunta]: Las filas siguientes del bloque de texto no dan el cursor/editor de texto enriquecido al hacer clic, sino que se seleccionan en su lugar
He notado un comportamiento extraño en mi adaptación de GrapesJS respecto al editor de texto rico y el plugin gjs-blocks-basic. Cada vez qu...
Issue #816
[PREGUNTA] Añade bloque de imagen a través de la API del editor
Hola @artf, Cuando arrastro y suelto un bloque de imagen dentro del lienzo, se activa el evento 'activo' para el bloque de imagen que ejecu...
Issue #1177
[PREGUNTA] Uso de clases idénticas múltiples
Hola @artf, Tengo una pregunta sobre el Style Manager. Supongamos que tenemos varios elementos con clases fila dentro de html, ¿existe algu...
Plugins de pago que cumplen con este problema
Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.
Cargando recomendaciones de plugins de pago...
Consulta los plugins de código abierto de GrapesJS en GitHub O haz una búsqueda rápida en nuestro catálogo gratuito.
Explora plugins gratuitos →Los plugins premium incluyen soporte, actualizaciones regulares y funciones listas para producción — ahorrando días de trabajo de integración.
Explora plugins premium →Tutoriales relacionados
Guías detalladas sobre el mismo tema.
Explorar categorías de plugins
Ve directamente a las páginas de categorías de plugins en el marketplace.