Добавьте встроенную цветовую палитру для пользовательского блока Гутенберга - PullRequest
0 голосов
/ 23 мая 2018

Я создал пользовательский блок Гутенберга. Мой пользовательский блок Гутенберга

В этом блоке мне нужно изменить цвет фона (зеленый) и цвета текста.Можно ли как-нибудь включить встроенную цветовую палитру Гутенберга, которая появляется, когда я щелкаю пункт Гутенберга по умолчанию и другие блоки.

Вот мой код для моего блока Гутенберга.

    ( function( blocks, components, i18n, element ) {
    var el = element.createElement;
    var registerBlockType = wp.blocks.registerBlockType;
    var RichText = wp.blocks.RichText;
    var BlockControls = wp.blocks.BlockControls;
    var AlignmentToolbar = wp.blocks.AlignmentToolbar;
    var MediaUpload = wp.blocks.MediaUpload;
    var InspectorControls = wp.blocks.InspectorControls;
    var TextControl = wp.components.TextControl;

    registerBlockType( 'futurelab/color-block', { // The name of our block. Must be a string with prefix. Example: my-plugin/my-custom-block.
        title: i18n.__( 'Color Block' ), // The title of our block.
        description: i18n.__( 'A custom block for displaying color blocks.' ), // The description of our block.
        icon: 'media-document', // Dashicon icon for our block. Custom icons can be added using inline SVGs.
        category: 'common', // The category of the block.

        attributes: {
            title: {
                type: 'array',
                source: 'children',
                selector: 'h3',
            },
            content: {
                type: 'array',
                source: 'children',
                selector: 'p',
            },
            buttonText: {
                type: 'array',
                source: 'children',
                selector: 'span',
            },
            buttonURL: {
                type: 'url',
                selector:'div'
            },
        },


        // The "edit" property must be a valid function.
        edit: function( props ) {
            var title = props.attributes.title; // Content in our block.
            var content = props.attributes.content; // Content in our block.
            var buttonText = props.attributes.buttonText; // Content in our block.
            var buttonURL = props.attributes.buttonURL;


            /**
             * Update title on change.
             */
            function onChangeTitle( newTitle ) {
                props.setAttributes( { title: newTitle } );
            }
            function onChangeContent( newContent ) {
                props.setAttributes( { content: newContent } );
            }
            function onChangeButtonText( newButtonText ) {
                props.setAttributes( { buttonText: newButtonText } );
            }

            // The editable title.
            return [
                el( InspectorControls, { key: 'inspector' }, // Display the block options in the inspector panel.
                    el( components.PanelBody, {
                            title: i18n.__( 'Color Block Settings' ),
                            className: 'block-social-links',
                            initialOpen: true,
                        },
                        el( 'p', {}, i18n.__( 'Enter the button url here to navigate button when click.' ) ),
                        el( TextControl, {
                            type: 'url',
                            label: i18n.__( 'Button URL' ),
                            value: buttonURL,
                            onChange: function( newButton ) {
                                props.setAttributes( { buttonURL: newButton } );
                            },
                        } ),
                    ),
                ),
                el(
                    'div',
                    {className: props.className + ' color-content-block'},
                    el(RichText, // Editable React component.
                        {
                            tagName: 'h3', // <p></p>.
                            className: props.className, // The class="wp-editor-gb-03-block-editable".
                            value: title, // Content in our block. i.e. props.attributes.title;
                            placeholder: 'Block Title...',
                            keepPlaceholderOnFocus: true,
                            focus: focus, // Focus — should be truthy. i.e. props.focus;
                            onFocus: props.setFocus,
                            onChange: onChangeTitle
                        }
                    ),
                    el(RichText, // Editable React component.
                        {
                            tagName: 'p', // <p></p>.
                            className: props.className + ' block-content', // The class="wp-editor-gb-03-block-editable".
                            onChange: onChangeContent, // Run the onChangeContent() function onChange of title.
                            placeholder: 'Block Content...',
                            value: content, // Content in our block. i.e. props.attributes.title;
                            focus: focus, // Focus — should be truthy. i.e. props.focus;
                            onFocus: props.setFocus
                        }
                    ),
                    el (
                        'span',
                        {   className: props.className + ' btn' },
                        el(RichText, // Editable React component.
                            {
                                tagName: 'span', // <p></p>.
                                className: props.className, // The class="wp-editor-gb-03-block-editable".
                                placeholder: 'Button Title...',
                                onChange: onChangeButtonText, // Run the onChangeContent() function onChange of title.
                                value: buttonText, // Content in our block. i.e. props.attributes.title;
                                focus: focus, // Focus — should be truthy. i.e. props.focus;
                                onFocus: props.setFocus,
                            }
                        ),

                    ),
                    el (
                        'div',
                        {   className: props.className + ' display-none' },
                        buttonURL,
                    ),
                )
            ]
        },

        // The "save" property must be specified and must be a valid function.
        save: function( props ) {
            var title = props.attributes.title; // Content in our block.
            var content = props.attributes.content; // Content in our block.
            var buttonText = props.attributes.buttonText; // Content in our block.
            var buttonURL = props.attributes.buttonURL;

            // The frontend title.
            return el(
                'div',
                {className: 'color-title-block'},
                el( 'h3',  { // <p></p>.
                        className:'', // The class="wp-block-gb-block-editable-03".
                    },
                    title,
                ),
                el( 'p',  { // <p></p>.
                        className:'block-content', // The class="wp-block-gb-block-editable-03".
                    },
                    content,
                ),
                el('span', {
                        className: 'btn'
                    },
                    buttonText,
                ),
                el( 'div', {
                        className: ''
                    },
                    buttonURL
                ),
            );
        },
    } );

} )(
    window.wp.blocks,
    window.wp.components,
    window.wp.i18n,
    window.wp.element,
);

Пожалуйста, помогите мне с этим.

1 Ответ

0 голосов
/ 16 августа 2018

Вам необходимо добавить атрибут для хранения цвета, а затем обернуть свою функцию редактирования в компонент высшего порядка, называемый withColors, и включить PanelColorSettings в InspectorControls, оба из которых находятся в wp.editor.

var PanelColorSettings = wp.editor.ColorPanelSettings;
var withColors = wp.editor.withColors
var compose = wp.compose.compose

 ...

 attributes: {
   myColorAttributeName: {
     type: 'string'
   }
 }

 ...

 edit: compose([withColors('myColorAttributeName')])(myRegularEditFunction)

это открывает новую функцию поддержки, которая автоматически передается и называется setMyColorAttributeName (например, setAttributes()), которую можно использовать в элементах PanelColorSettings в функции onChange.

* Обновление: март 2019 *

обновление ответа с помощьюболее полный пример

// get these from the wp object.
const { withColors, PanelColorSettings, getColorClassName } = wp.editor;
const { compose } = wp.compose;
const { Fragment } = wp.element;

...

/** extract your edit component into a function like this.
* this will give you a settings panel on the sidebar with
* the color swatches and handle the onChange function
*/
const EditComponent = ({colorScheme, setColorScheme} /* and your other props */) => (
  <Fragment>
    <InspectorControls>
       <PanelColorSettings
          title={ 'Color Options' }
          colorSettings={ [
              {
                value: colorScheme.color,
                label: 'Block Color Scheme',
                onChange: setColorScheme,
              },
          ] }
       />
    </InspectorControls>

    <YOUR-ACTUAL-BLOCK-MARKUP />
  <Fragment>
);

...

registerBlockType( 'namespace/blockslug', {
...
  edit: compose( [withColors('colorScheme')] )(EditComponent)

});

После добавления этой разметки у вас есть доступ к getColorClassName( 'background-color', attributes.colorScheme) в функции рендеринга.в этом случае он возвращает что-то вроде has-purple-background-color.Нужно написать много кода для чего-то, что должно быть намного проще, но это работает.

команда WP и Gutenberg, возможно, изменили это после официального выпуска WP 5, но он все еще работает для меня на WP 5.1.1, поэтому я отправляю его.

...