Блок Гутенберга должен быть разрешен, чтобы отобразить правильное представление редактирования

#reactjs #wordpress #jsx #wordpress-gutenberg

Вопрос:

Здравствуйте, уважаемые разработчики,

Мне нужна небольшая помощь с редактором блоков WordPress Гутенберга, так как я сделал блок, который работал довольно хорошо.

Одной вещи не хватало, я решил добавить метку привязки » между одной из моих переменных реквизита в функции сохранения.

Сначала я добавил новый тег ввода в функцию редактирования, чтобы обновить атрибут href моего якоря.

на фронте все работает нормально. Единственная проблема, с которой я сталкиваюсь, заключается в том, что в редакторе статей backoffice Gutenberg мой блок возвращает HTML-код функции сохранения вместо функции редактирования.

Поэтому WordPress выдает мне ошибку, и мне всегда нужно нажимать кнопку разрешить, чтобы увидеть html-код функции сохранения.

Я даю вам свой код, я хочу знать, видите ли вы что-то странное, или, может быть, вы знаете о проблеме :

 const {registerBlockType} = wp.blocks
const {InspectorControls, MediaUpload} = wp.editor

registerBlockType('astra/ingreds', {
    title: 'Ligne d'Ingrédient',
    category: 'widgets',
    icon: 'smiley',
    attributes: {
        ingName: {type: "string"},
        ingQtt: {type: "string"},
        mediaID: {type: "string"},
        mediaURL: {type: "string"},
        bgurl: {type: "string"},
        ingLink: {type: "string"}
    },
    edit: function(props) {
        function updateIngName(e){
            props.setAttributes({ingName : e.target.value})
        }
        function updateIngQtt(e){
            props.setAttributes({ingQtt : e.target.value})
        }
        function updateLink(e){
            props.setAttributes({ingLink : e.target.value})
        }
    return (
            <div className="anton-cont-recette" id="container-recipe">
                <div className="ing-row">
                    <input className="ing-link" type="text" placeholder="Lien du produit" onChange={updateLink} value={props.attributes.ingLink}/>
                    <div className="ing-picto" style={{backgroundImage: props.attributes.bgurl}}></div>
                    <input className="ing-name" type="text" placeholder="Ingrédient" onChange={updateIngName} value={props.attributes.ingName}/>
                    <input className="ing-qtt"  type="text" placeholder="Quantité" onChange={updateIngQtt} value={props.attributes.ingQtt}/>
                </div>
                <InspectorControls>
                    <h2>Sélectionnez une image pour l'ingrédient {props.attributes.ingName}</h2>
                    <MediaUpload
                     type="image"
                     onSelect={image => props.setAttributes({mediaID: image.id, mediaURL: image.sizes.full.url, bgurl: "url('" image.sizes.full.url "')"})}
                     value={ props.attributes.mediaID }
                     render={
                        ({open}) =>(
                            <button onClick={open}>Choisir une image</button>
                            )
                     }
                    />          
                </InspectorControls>
            </div>
        )
    },
    save: function (props) {
        const backgroundImg = 'background-image: url(' props.attributes.mediaURL ')'; 
        return (
                 <div className="row ing-line">
                     <div className="ing-picto" style={backgroundImg}></div>
                     <div className="ing-holder">
                         <span className="ingName"><a href={props.attributes.ingLink} target="_blank">{props.attributes.ingName}</a></span>
                         <span className="ingQtt">{props.attributes.ingQtt}</span>
                     </div>
                 </div>)
    }
})
 

Комментарии:

1. Если вы откроете консоль в редакторе при первой загрузке сообщения, она покажет вам, чем отличается HTML, сохраненный в базе данных, от того, что Гутенберг пытался отобразить с save помощью функции. Это поможет вам начать отслеживать, в чем проблема.

2. Вы правы, спасибо за подсказку 😉

Ответ №1:

После рекомендаций Фила я увидел в консоли эти строки с ошибками:

 blocks.min.js?ver=e2b6602c7ebbe8ce93832ce35d81be1c:2 Block validation: Block validation failed for `astra/ingreds` ({name: 'astra/ingreds', icon: {…}, keywords: Array(0), attributes: {…}, providesContext: {…}, …}).

Content generated by `save` function:

<div class="wp-block-astra-ingreds row ing-line"><div class="ing-picto" style="background-image: url(undefined)"></div><div class="ing-holder"><span class="ingName"><a target="_blank"></a></span><span class="ingQtt"></span></div></div>

Content retrieved from post body:

<div class="wp-block-astra-ingreds row ing-line"><div class="ing-picto" style="background-image: url(undefined)"></div><div class="ing-holder"><span class="ingName"><a target="_blank" rel="noopener"></a></span><span class="ingQtt"></span></div></div>
 

Единственное, что отличалось между этими двумя, — это атрибут rel из тега привязки, который я не объявлял и/или который был создан по умолчанию телом сообщения.

поэтому я просто написал в своей функции сохранения «rel = noopener», и знаете что? Это сработало !

Спасибо Филу и его знаниям о том, как отлаживать блоки Гутенберга!

Хорошего дня!