WordPress-Gutenberg-块验证:预期文本

时间:2019-03-02 作者:camilluskillus

我正在构建一个gutenberg block插件,我被困在了简单的双字段结构上。问题是save函数工作正常,但edit函数有问题。重新加载页面时,出现以下错误:“此块包含意外或无效的内容。”

在浏览器控制台中,我发现以下错误:

块验证:预期文本lkjhlkjhlkjh, 锯poiupoiupoiu. 块验证:的块验证失败protex-contact/g-block (对象{名称:“protex contact/g-block”,标题:“protex konakt”,图标:{…},类别:“common”,属性:{…},编辑:edit(),保存:save()})。

预期:

<div class="wp-block-protex-contact-g-block"><p class="prtx_contact_name">lkjhlkjhlkjh</p><p class="prtx_contact_address">lkjhlkjhlkjh</p></div>

实际值:

<div class="wp-block-protex-contact-g-block"><p class="prtx_contact_name">lkjhlkjhlkjh</p><p class="prtx_contact_address">poiupoiupoiu</p></div>

这是我的JS:

    const { __ } = wp.i18n;
    var el = wp.element.createElement,
        registerBlockType = wp.blocks.registerBlockType,
        RichText = wp.editor.RichText;
    registerBlockType( \'protex-contact/g-block\', {
        title: __( \'Protex konakt\', \'protex-contact-domain\' ),
        icon: \'id\',
        category: \'common\',
        attributes: {
            content: {
                type: \'string\',
                source: \'html\',
                selector: \'p\',
            },
            content2:{
                type: \'string\',
                source: \'html\',
                selector: \'p\',
            },
        },

        edit: function( props ) {
            var content = props.attributes.content,
            content2 = props.attributes.content2;

            function onChangeContent( newContent ) {
                props.setAttributes( { content: newContent } );
            }

            function onChangeContent2 ( newContent2 ){
                props.setAttributes( { content2: newContent2 } );
            }

            return el ( \'div\', { className: props.className }, 
                el(
                RichText,
                {
                    tagName: \'p\',
                    className: \'prtx_contact_name\',
                    onChange: onChangeContent,
                    value: content,
                }
                ),
                el(
                RichText,
                {
                    tagName: \'p\',
                    className: \'prtx_contact_address\',
                    onChange: onChangeContent2,
                    value: content2,
                }
                ),
            );
        },

        save: function( props ) {
            var content = props.attributes.content;
            var content2 = props.attributes.content2;
            return el ( \'div\', { className: props.className },
                el( RichText.Content, {
                    tagName: \'p\',
                    className: \'prtx_contact_name\',
                    value: content,
                } ),
                el( RichText.Content, {
                    tagName: \'p\',
                    className: \'prtx_contact_address\',
                    value: content2,
                } ),
            );
        },
    } );

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

问题在于选择器:

attributes: {
    content: {
        type: \'string\',
        source: \'html\',
        selector: \'p\',
    },
    content2:{
        type: \'string\',
        source: \'html\',
        selector: \'p\',
    },
},
您仅使用p 对于这两个属性。

当块查看保存的HTML以验证它时,它会检查选择器的值是否与属性的值匹配。如果没有,则验证失败。

鉴于此HTML:

<div class="wp-block-protex-contact-g-block">
    <p class="prtx_contact_name">lkjhlkjhlkjh</p>
    <p class="prtx_contact_address">poiupoiupoiu</p>
</div>
它检查的值content 通过查找p, 它发现lkjhlkjhlkjh, 这是第一个p 标签这也是的保存值content, 所以到目前为止情况看起来不错。

然后它查找content2 通过查看第一个p 标记,因为这是选择器lkjhlkjhlkjh. 但是,块认为content2 应该是poiupoiupoiu, 因此,它认为HTML保存不正确。

因此,您需要确保可以使用选择器在HTML中找到正确的值。您可以使用已经在这些段落中使用的类来实现这一点:

attributes: {
    content: {
        type: \'string\',
        source: \'html\',
        selector: \'p.prtx_contact_name\',
    },
    content2:{
        type: \'string\',
        source: \'html\',
        selector: \'p.prtx_contact_address\',
    },
},

相关推荐

Frontend Post Form Validation

好的,这里有几篇关于前端投递表单的帖子。我把它们都读了,这让我明白了我的意思。现在,我遇到的每一个表单都有某种形式的验证,它似乎可以检查您想要设置为必需的字段的值。我试过了,但什么都没用。我只是无法设置任何必填字段。表单的其他方面都很完美。但我希望强制执行我的必填字段(适当错误消息的奖励)。我试着在google上四处看看,我真的不认为JS是我想要使用的。以及任何其他我似乎也无法进行的php验证。我敢肯定,我把它们都弄错了。以下是我所拥有的:http://pastebin.com/rw4c6jZQ (应验证