Обновление содержимого GrapesJS перед загрузкой - PullRequest
0 голосов
/ 05 ноября 2019

Я создал одну CMS в Laravel, и я использовал GrapesJS, чтобы сделать Page Builder идеальным, я просто создал один компонент для «Сообщений», чтобы пользователи могли выбирать категорию, в которой число выбранных сообщений также ограничено. После выбора или изменения лимита или категории делается запрос к бэкэнду, чтобы показать мне данные в JSON, и я добавляю GrapesJS. Я сохраняю все содержимое страницы в базе данных с помощью команды GrapesJS: editor.store().html

Теперь, как я могу сделать, чтобы загрузить свежие сообщения из базы данных из этой категории (рис. 1 и 2), выбранной в конструкторе. Потому что GrapesJS показывает мне только HTML-код.

Изображение компонента 1

Изображение компонента 2

Код для загрузки содержимого страницы для страницы

$page = Pages::find($id);
$pageContent = $page->content; // here is content from GrapesJS
return view('page')->with('pageContent', $pageContent);

код компонента:

function posts(editor) {
    // Trait -> Limit Post per page
    editor.TraitManager.addType('limitPostPerPage', {
        createInput({ trait }) {
            const traitOpts = trait.get('options') || [];
            const options = traitOpts.lenght ? traitOpts : [
                { id: '', name: 'Select Category...' },
                { id: '8', name: 'Sport' },
                { id: '9', name: 'Global news' },
            ];

            const el = document.createElement('div');
            el.className = "postsSettings";
            el.innerHTML = `
                <div class="group">
                    <label>Category:</label>
                    <select type="select" class="inputCategory">
                    ${options.map(opt => `<option value="${opt.id}">${opt.name}</option>`).join('')}
                    </select>
                </div>
                <div class="group">
                    <label>Limit post per Page</label>
                    <input type="number" class="inputLimitPostPerPage"/>
                </div>
            `;

            const inputLimitPostPerPage = el.querySelector('.inputLimitPostPerPage');
            const inputCategory = el.querySelector('.inputCategory');
            inputCategory.addEventListener('change', ev => {
                // console.log('inputCategory: ' + ev.target.value);
            });
            inputLimitPostPerPage.addEventListener('change', ev => {
                // console.log('LimitPostPerPage: ' + ev.target.value);
            });

            return el;
        },
        onEvent({ elInput, component, event }) {
            var category = elInput.querySelector('select').value;
            var limitPostPerPage = elInput.querySelector('input').value;

            $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': laravel_csrf_token } });
            $.ajax({
                type: 'POST',
                url: getPostsListUrl,
                data: { category: category, limitPostPerPage: limitPostPerPage },
                success: function(data) {
                    if(data.status == 'success') {
                        component.set('content', data.html);
                    }
                },
                error: function(XMLHttpRequest, textStatus, errorThrown) {
                    $.growl.error({ message: XMLHttpRequest.responseText });
                },
                fail: function(XMLHttpRequest, textStatus, errorThrown) {
                    $.growl.error({ message: XMLHttpRequest.responseText });
                },
            });
        },
    });

    // Component -> Posts
    editor.DomComponents.addType('postsComponent', {
        model: {
            defaults: {
                testprop: 1,
                traits: [
                    {
                        type: 'limitPostPerPage',
                        name: 'limitPostPerPage',
                        label: 'Posts Settings',
                        options: [
                            { value: 'link', name: 'Link' },
                            { value: 'popup', name: 'Popup' },
                        ],
                    },
                ],
            },
        },
        view: {
        },
    });

    // Block -> Posts
    var html = '<div class="container">'+
'                    <div class="row pt-4" data-gjs-type="postsComponent">'+
'                        <div class="col-lg-4 col-sm-6 mb-4" cool_disabled_v2="true" data-gjs-editable="false" data-gjs-removable="false">'+
'                            <div class="card h-100">'+
'                                <a href="#">'+

'                                </a>'+
'                                <div class="card-body">'+
'                                    <h4 class="card-title">'+
'                                        <a href="#" data-gjs-editable="false" data-gjs-removable="false" data-gjs-stylable="false">Post 1</a>'+
'                                    </h4>'+
'                                    <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur eum quasi sapiente nesciunt? Voluptatibus sit, repellat sequi itaque deserunt, dolores in, nesciunt, illum tempora ex quae? Nihil, dolorem!</p>'+
'                                </div>'+
'                            </div>'+
'                        </div>'+
'                        <div class="col-lg-4 col-sm-6 mb-4" cool_disabled_v2="true" data-gjs-editable="false" data-gjs-removable="false">'+
'                            <div class="card h-100">'+
'                                <a href="#">'+

'                                </a>'+
'                                <div class="card-body">'+
'                                    <h4 class="card-title">'+
'                                        <a href="#">Post 2</a>'+
'                                    </h4>'+
'                                    <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur eum quasi sapiente nesciunt? Voluptatibus sit, repellat sequi itaque deserunt, dolores in, nesciunt, illum tempora ex quae? Nihil, dolorem!</p>'+
'                                </div>'+
'                            </div>'+
'                        </div>'+
'                        <div class="col-lg-4 col-sm-6 mb-4" cool_disabled_v2="true" data-gjs-editable="false" data-gjs-removable="false">'+
'                            <div class="card h-100">'+
'                                <a href="#">'+

'                                </a>'+
'                                <div class="card-body">'+
'                                    <h4 class="card-title">'+
'                                        <a href="#">Post 3</a>'+
'                                    </h4>'+
'                                    <p class="card-text">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet numquam aspernatur eum quasi sapiente nesciunt? Voluptatibus sit, repellat sequi itaque deserunt, dolores in, nesciunt, illum tempora ex quae? Nihil, dolorem!</p>'+
'                                </div>'+
'                            </div>'+
'                        </div>'+
'                    </div>'+
'                </div>';
    editor.BlockManager.add('posts', {
        label: 'Posts',
        category: 'Basic',
        attributes: { class: 'fa fa-clipboard' },
        content: html,
        draggable: true,
        editable: false,
    });
}
...