Issue #2862💬 RespondidoAbierto el 29 de junio de 2020por LerdouilleReacciones 0

Tipo personalizado no reconocido en la importación

Respuesta rápidapor Lerdouille

Hola, Para que conste, cuando intento cambiar el retorno de isComponent, con un tipo definido en un plugin como este : 'isComponent: el => { if (el.tagName === 'DIV' && (typeof el.classList !== 'undefined' && el.classList.contains('imagelink-class'))) { return { type: 'marketing-button' }; } },` la importación reconoc...

Lee la respuesta completa abajo ↓

Pregunta

Fragmento de códigoTEXT
Hola,

Consigo crear un nuevo tipo que contiene una imagen clickable. Pero, desafortunadamente, el nuevo tipo personalizado no es reconocido por el analizador HTML al importar.

Aquí está mi nuevo código fuente tipo:

'Editor. DomComponents.addType('imagelink', {

isComponent: el => {
                    if (el.tagName === 'DIV' && (typeof el.classList !== 'undefined' && el.classList.contains('imagelink-class'))) {
                      return { type: 'imagelink' };
                    }
                },
                modelo: {
                    Predeterminados: { 
                       etiquetaNombre: 'div',
                        redimensionable: {keepAutoHeight: true},
                        Atributos: {clase: 'Clase Enlace Imagen', "Tipo de Datos": "Enlace Imagen"},
                        Droppable: falso,
                        Rasgos: [
                            { 
                                tipo: 'href', etiqueta: 'Fuente', nombre: 'href'
                            },
                            {
                                tipo: 'select',
                                etiqueta: 'Target',
                                Nombre: 'Objetivo',
                                Opciones: [
                                  { valor: '', nombre: 'Esta ventana' },
                                  { valor: '_blank', nombre: 'Nueva ventana' }
                                ]
                            }
                        ],
                        Componentes: [
                            {
                                redimensionable: falso,
                                arrastrable: falso,
                                Droppable: falso,
                                seleccionable: false,
                                Hoverable: falso,
                                Tipo: 'Enlace',
                                componentes: [{
                                    tipo: 'imagen',
                                    atributos: {
                                        src: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR U0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIHZpZXdCb3g9IjAgMCAyNCAyNCIgc3R5bGU9ImZpbGw6IHJnEoMCwwLDAsMC4xNSk7IHRyYW5zZm9ybTogc2NhbGUoMC43NSkiPgogICAgICAgIDxwYXRoOMC43NSkiPgogICAgICAgIDxwYXRoIGQ9Ik04LjUgMTMuNWwyLjUgMyAzLjUtNC41IDQuNSA2SDVtMTYgMVY1YTIgMiAwIDAgMC0yLTJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnoiPjwvcGF0aD4KICAgICAgPC9zdmc+',
                                        estilo:'ancho:100%;'
                                    },
                                    redimensionable: falso,
                                    arrastrable: falso,
                                    Droppable: falso,
                                    Hoverable: falso,
                                    seleccionable: false,
                                }]
                            }
                        ]
                    },
                    init() {
                      this.on('change:attributes:href', this.handleHrefChange);
                      this.on('change:atributos:objetivo', this.handleTargetChange);
                    },
                    handleHrefChange: función ( componente, valor ) {
                        eliminar component.attributes.attributes.href;
                        eliminar component.atributos.atributos.objetivo;
                        component.atributos.componentes.modelos[0].atributos.atributos.href = valor;
                        return false;
                    },
                    handleTargetChange: función ( componente, valor ) {
                        eliminar component.attributes.attributes.href;
                        eliminar component.atributos.atributos.objetivo;
                        componentes.atributos.modelos[0].atributos.atributos.target = valor;
                        return false;
                    },
                },
            });`

Preciso la definición del nuevo tipo que se incluye en un plugin, que se pasa en la inicialización del editor: 

var editor = grapesjs.init({
....
Plugins: [myplugin];
...
}

Intenté usar el parámetro isComponent para hacerlo, la condición es buena, pero el plugin renderiza todos los componentes del dom por separado ('<img>' y '<a>') en lugar del tipo "imagelink". Así que cuando hago clic en la imagen, no puedo cambiar los rasgos definidos en mi tipo.

Creo que me estoy perdiendo algunos puntos, pero no consigo entenderlo... ¿Podrías decirme qué te pasa?

Sé que es posible, por ejemplo el plugin 'gjs-social' y su tipo 'Social-link-block' funcionan perfectamente...

Un cordial

Respuestas (3)

Lerdouille2 de julio de 2020
Fragmento de códigoTEXT
Hola,

Para que conste, cuando intento cambiar el retorno de isComponent, con un tipo definido en un plugin como este : 

'isComponent: el => {
                    if (el.tagName === 'DIV' && (typeof el.classList !== 'undefined' && el.classList.contains('imagelink-class'))) {
                      return { type: 'marketing-button' };
                    }
                },`

la importación reconocerá mis resultados del<div><a><img></a></div> DOM como un botón de marketing (definido en el plugin grapesjs-block-avance

Creo que me estoy perdiendo algo en la definición de tipo para ayudar a grapesjs a reconocer mi tipo en la importación...

Un cordial
Lerdouille2 de julio de 2020

Otra curiosidad que podría ser lógica... Si intentara poner una función exótica isComponent así:

'if (el.tagName === 'ABCDE') { return { type: 'imagelink' }; }`

Y cuando intento importar este texto html: '<abcde>prueba</abcde>' El plugin detecta correctamente mi tipo personalizado "imagelink".

PERO, cuando importo este texto html: '<abcde><img src="ggggg"></abcde>'

No funcionó. Supongo que el plugin sigue yendo más allá en el reconocimiento de componentes y detecta el IMG y el dominante A, y anula para que la detección...

artf6 de julio de 2020

Creo que te estás perdiendo el sentido de los componentes. Tienes uno personalizado ('imagelink') y luego uno interno ('img'), así que el editor lo muestra y no veo problemas aquí. Para ver los rasgos del componente personalizado tienes que seleccionarlo y no tiene nada que ver con la imagen interna

Preguntas y respuestas relacionadas

Continúa investigando con debates sobre temas similares.

Plugins de pago que cumplen con este problema

Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.

Ver todos los plugins

Cargando recomendaciones de plugins de pago...

Opción gratuita

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 →
Opción premium

Los plugins premium incluyen soporte, actualizaciones regulares y funciones listas para producción — ahorrando días de trabajo de integración.

Explora plugins premium →

Explorar categorías de plugins

Ve directamente a las páginas de categorías de plugins en el marketplace.