Как каскадировать компонент Gutenberg SelectControl

Как я могу каскадировать компонент SelectControl в редакторе Гутенберга.

Прошу всех профессионалов помочь мне в этом. У меня 8 месяцев опыта работы с wordpress и практически нет опыта работы с ES next Javascript или React.

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

Все, что я хочу, - это изменить первый список выбора. Я хочу обновить параметры второго списка выбора с помощью getEntityRecords().

Вот код js:

    ( function( blocks, blockEditor, element, components, serverSideRender  ) {
    var el = element.createElement;
    var InspectorControls = blockEditor.InspectorControls;
    var SelectControl = components.SelectControl;
      
    
    blocks.registerBlockType( 'custom-blocks/news-selection', {
        title: 'News (selection)',
        icon: 'universal-access-alt',
        category: 'custom-blocks',
        example: {
            attributes: {
                posts_per_page: 3
            },
    },


    edit: function( props ) {

        var options_news =  new Array();     
       
        if (props.isSelected) {

            var options_page_group = [];
    
            var page_query = {
                per_page: -1,
                parent: 0,
                orderby: 'menu_order',
                order: 'asc',
                status: 'publish,future,draft,pending,private',
            };

            (wp.data.select('core').getEntityRecords('postType', 'page', page_query)).forEach((post) => { 
                options_page_group.push({value:post.id, label:post.title.rendered});
            });

            function make_request_for_news(pgrp_id){

                props.setAttributes({news_1_id: null}); 

                var news_query = {
                    per_page: 10,
                    orderby: 'publication_date',
                    order: 'desc',
                    meta_key: 'news_page_group',
                    meta_value: pgrp_id
                };

                let p = new Promise((resolve, reject) => {
                    let news = (wp.data.select('core').getEntityRecords('postType', 'news', news_query));

                    if (news!== null) {
                        console.log('got the response');
                        resolve(news);
                    } else {
                        reject('noooo');
                    }
                });

                p.then((resp)=> {
                    populate_news_select_list(resp);
                }).catch((resp) => {
                    console.log(resp);
                });


            }


            function populate_news_select_list(resp){
                /*Here I am getting the response but from here how can I set these as options of the selectcontrol component*/
                resp.forEach(post => {
                    options_news.push({value:post.id, label:post.title.rendered});
                });



            }
            
                      

        return [ //Inspector control element
                el(InspectorControls,
                    {key: "inspector"},

                    el( SelectControl,
                        {
                            label: js_ref_obj.page_group_selection,
                            options : [{ value: -1, label: '-Select-' }].concat(options_page_group),
                            onChange: function( content ) {
                                props.setAttributes({page_group_id: content}); 
                                if (content > 0) {
                                    make_request_for_news(content);
                                }
                            },
                            value: props.attributes.page_group_id,
                        }
                    ),
                    el( "div",
                        {style : {display : props.attributes.page_group_id>0 ? "block" : "none" }},
                        el( SelectControl,
                            {
                                label: js_ref_obj.news_selection + ' 1',
                                options : [{ value: null, label: '-Select-' }].concat(options_news),
                                onChange: function( content ) {
                                    props.setAttributes({news_1_id: content}); 
                                },
                                value: props.attributes.news_1_id,
                            }
                        )
                    ),
                    
                    
                ),
                el(serverSideRender,
                    {key: "editable",
                        block: "custom-blocks/news-selection",
                        attributes: props.attributes
                    }
                )
                    
            ];
        }

        else {
            
            return [
                //serverSideRender element for live state preview.
                    el(serverSideRender,
                        {key: "editable",
                            block: "custom-blocks/news-selection",
                            attributes: props.attributes
                        }
                    )
            ];
        }
       
    

    },

    save: function( props ) {
        return null;

    },
} );
}(
    window.wp.blocks,
    window.wp.blockEditor,
    window.wp.element,
    window.wp.components,
    window.wp.serverSideRender
) );

Любая помощь будет оценена по достоинству. Благодаря!

0 ответов