如何在gutenberg块中创建多个元字段

时间:2019-08-26 21:05:38

标签: wordpress wordpress-gutenberg gutenberg-blocks

我需要创建一个wordpress Gutenberg块,这将允许我插入一些数据,例如姓名和姓氏,公司名称以及参考文献中的最佳句子。

到目前为止,我设法创建了一个保存一个文本字段的Gutenberg块。

dc-references-block.php

// register custom meta tag field
function dcr_register_post_meta() {
    register_post_meta( 'page', 'dc_references_block_field', array(
        'show_in_rest' => true,
        'single' => true,
        'type' => 'string',
    ) );
}
add_action( 'init', 'dcr_register_post_meta' );


function dcr_enqueue() {
    wp_enqueue_script(
        'dc-references-block-script',
        plugins_url( 'dc-references-block.js', __FILE__ ),
        array( 'wp-blocks', 'wp-element', 'wp-components' )
    );
}
add_action( 'enqueue_block_editor_assets', 'dcr_enqueue' );

dc-references-block.js

( function( wp ) {
    var el = wp.element.createElement;
    var registerBlockType = wp.blocks.registerBlockType;
    var TextControl = wp.components.TextControl;


    registerBlockType( 'dc-references-block/dc-references-block', {
        title: 'Title',
        icon: 'edit',
        category: 'common',

        attributes: {
            blockValue: {
                type: 'string',
                source: 'meta',
                meta: 'dc_references_block_field'
            }
        },

        edit: function( props ) {
            var className = props.className;
            var setAttributes = props.setAttributes;

            function updateBlockValue( blockValue ) {
                setAttributes({ blockValue });
            }

            return el(
                'div',
                { className: className },
                el( TextControl, {
                    label: 'write here name of company',
                    value: props.attributes.blockValue,
                    onChange: updateBlockValue
                }
              )

            );
        },

        save: function() {
            return null;
        }
    } );
} )( window.wp );

每当我尝试向该块添加第二个文本字段或textarea时,都会出现错误“站点不支持此块”。

在这种情况下,谁能向我解释如何在一个块中正确添加一个文本字段和一个文本区域呢?

1 个答案:

答案 0 :(得分:2)

如果包含不起作用的代码会更好。无论如何,我通过添加另一个文本输入和一个文本区域(在属性和元数据中具有相关条目)来更改您的代码。

这是修改后的代码。另外,我还更改了一些代码以使其更具可读性。

Javascript

( function( wp ) {
    const el = wp.element.createElement;
    const registerBlockType = wp.blocks.registerBlockType;
    const TextControl = wp.components.TextControl;
    const TextareaControl = wp.components.TextareaControl;

    registerBlockType( 'dc-references-block/dc-references-block', {
        title: 'Title',
        icon: 'edit',
        category: 'common',

        attributes: {
            blockValue: {
                type: 'string',
                source: 'meta',
                meta: 'dc_references_block_field'
            },
            // Add two new attributes
            name: {
                type: 'string',
                source: 'meta',
                meta: 'dc_references_block_field_name'
            },
            desc: {
                type: 'string',
                source: 'meta',
                meta: 'dc_references_block_field_desc'
            }
        },

        edit: function( props ) {
            const className = props.className;
            const setAttributes = props.setAttributes;

            // Original element with onChange event as an anonymous function
            const text = el( TextControl, {
                label: 'write here name of company',
                value: props.attributes.blockValue,
                key: 'companyName',
                onChange: function( value ) {
                    setAttributes( { name: value } );
                }
            } );

            //Add two new elements
            const secondText = el( TextControl, {
                label: 'Write your name',
                value: props.attributes.name,
                key: 'username',
                onChange: function( value ) {
                    setAttributes( { name: value } );
                }
            } );

            const textArea = el( TextareaControl, {
                label: 'Write a description',
                value: props.attributes.desc,
                key: 'desc',
                onChange: function( value ) {
                    setAttributes( { desc: value } );
                }
            } );

            return el(
                'div',
                { className: className },
                // Children of the main div as an array
                [ text, secondText, textArea ]
            );
        },

        save: function() {
            return null;
        }
    } );
}( window.wp ) );

PHP

register_post_meta( 'page', 'dc_references_block_field', array(
        'show_in_rest' => true,
        'single' => true,
        'type' => 'string',
    ) );

   // register two new meta corresponding to attributes in JS
    register_post_meta( 'page', 'dc_references_block_field_name', array(
        'show_in_rest' => true,
        'single' => true,
        'type' => 'string',
    ) );

    register_post_meta( 'page', 'dc_references_block_field_desc', array(
        'show_in_rest' => true,
        'single' => true,
        'type' => 'string',
    ) );