Обновление блока по Ajax

Здравствуйте, создала свой модуль, есть форма, которая обновляется по ajax, но нужно создать ещё свой блок в static_templates, выглядит пока так:

{** block-description:matrix_purpose **}

<div class="purpose cm-ajax-full-render" id="purpose_matrix">
    <p class="title">{__("purpose_1")}</p>
    <div class="flex">
        <div  class="purpose_flex">
            <div class="purpose_arcan reverse">
                <p class="black">=</p>
                <p class="arcan">{if $auth.data.purpose_1}{$auth.data.purpose_1}{else}?{/if}</p>
            </div>
        </div>
    </div>
<!--purpose_matrix--></div>

<script  type="text/javascript">
    $.ceEvent('on', 'ce.ajaxdone', function() {
        $.ceAjax('request', fn_url('matrix.update1'), {
            result_ids: 'purpose_matrix'
        });
    });
</script>

В контроллере так:

if ($mode === 'update1') {	
	if(defined('AJAX_REQUEST')){	
	    Registry::get('view')->display('addons/matrix/blocks/static_templates/matrix_purpose.tpl');
	    exit;
	}
}

Обновление данного блока происходит, но бесконечно, кружочек начинает крутится и после обновления данных в блоке начинает заново.
Подскажите, пожалуйста, в чем ошибка. :slight_smile:

https://docs.cs-cart.com/latest/developer_guide/core/front-end/ajax.html

1 лайк

Евент ce.ajaxdone уходит в рекурсию

1 лайк

ну как сказать :slight_smile:

у Вас на событие “завершен AJAX запрос” вызывается AJAX запрос, который вызывает событие “завершен AJAX запрос”, которое вызывает AJAX запрос, который вызывает событие “завершен AJAX запрос”…

2 лайка

:melting_face:
Как завершить этот круг не подскажите :sweat_smile:, а то у меня либо обновляется бесконечно, либо не обновляется вообще :slightly_frowning_face:

Опишите кратко цель вашей доработки

1 лайк

Есть форма, по нажатию кнопки происходит обновление блока (эта форма тоже с моего модуля), нужно создать ещё один блок в static_templates, чтобы клиент мог его ставить, куда захочет.
Форма:

<form name="matrix" id="form_{$id}" action="{""|fn_url}" method="post" class="cm-ajax cm-ajax-full-render cm-processing-personal-data " data-ca-processing-personal-data-without-click="true">
                            <div class="buttons-container">
                                <div class="ty-float-left">
                                <button class="ty-btn__primary ty-btn__big cm-form-dialog-closer ty-btn ty-btn matrix" type="submit" name="dispatch[matrix.update]" data-ca-event="formajaxpost_upload_form">Отправить</button>    
                                <input type="hidden" name="result_ids" value="matrix" /> 
                                </div>
                            </div>
                        </form>   

Блок, который она обновляет лежит в addons/matrix/views/matrix/update.tpl

Мой же блок лежит в addons/matrix/blocks/static_templates/matrix_purpose.tpl

Вчера я попробовала создать событие на кнопку data-ca-event="formajaxpost_upload_form"
и поменяла js на этот, но не срабатывает :melting_face:

<script  type="text/javascript">
    $.ceEvent('on', 'ce.formajaxpost_upload_form', function() {
        $.ceAjax('request', fn_url('matrix.update1'), {
            result_ids: 'purpose_matrix'
        });
    });
</script>

И будут ещё блоки добавляться и все должны как-то обновляться по этой кнопке…

Если я правильно понял, вам просто нужно поменять

<input type="hidden" name="result_ids" value="matrix" />

на

<input type="hidden" name="result_ids" value="purpose_matrix" />

Использование яваскрипта при этом можно убрать

1 лайк

К сожалению так не работает, прекращает обновляться addons/matrix/views/matrix/update.tpl
и мой блок тоже не обновляется.
Попробовала все блоки поместить в

<div class=" cm-ajax-force" id="matrix">
<!--matrix--></div>

Обновляется только первый блок, а мой нет :frowning:

вот у вас в самом первом топике html - это содержимое шаблона
addons/matrix/blocks/static_templates/matrix_purpose.tpl ? Когда в цикл уходит - у вас там скрипт не множится?

1 лайк

Покажите контент обоих шаблонов

1 лайк

Хорошо, я начала с того, что создала addons / matrix / blocks / static_templates / matrix_form.tpl

{** block-description:matrix_forma1 **}
            
<div class="row-fluid">                        
    <div class="span16  ">
        <div class="row-fluid form_page_matrix">                        
            <div class="span8  ">
                <div class="ty-wysiwyg-content" data-ca-live-editor-object-id="0" data-ca-live-editor-object-type="">
                    {$id = "matrix"}
    
                    <div title="Расчитать">
                        {include file="addons/matrix/views/matrix/components/matrix.tpl"}
                    </div>
                
                </div>                
        	</div>
			<div class="span8 ">
                <div class="foo">                
                    {include file="addons/matrix/views/matrix/update.tpl"}            
                </div>
            </div>
        </div>
    </div>
</div>

Затем в addons/matrix/views/matrix/components/matrix.tpl я поместила форму

<form name="matrix" id="form_{$id}" action="{""|fn_url}" method="post" class="cm-ajax cm-ajax-full-render cm-processing-personal-data " data-ca-processing-personal-data-without-click="true">
                            <div class="buttons-container">
                                <div class="ty-float-left">
                                <button class="ty-btn__primary ty-btn__big cm-form-dialog-closer ty-btn ty-btn matrix" type="submit" name="dispatch[matrix.update]" >Отправить</button>    
                                <input type="hidden" name="result_ids" value="matrix" /> 
                                </div>
                            </div>
                        </form>  

А в addons/matrix/views/matrix/update.tpl, то что она будет возвращать

<div class="ty-wysiwyg-content cm-ajax-force" id="matrix">
                            <div style="display: flex; align-items: center; flex-direction: column;">
                                <div id="n1" class="trans" style="top: 27%;">
                                    <div style="background: #C5C5C5; filter: drop-shadow(0px 0px 50px rgba(197, 197, 197, 0.50)); transform: rotate(-41deg);" class="main_lasso child_two">{if $auth.data.line_blag_center}{$auth.data.line_blag_center}{else}?{/if}</div>
                                </div>
                            </div>
<!--matrix--></div>

Это работает. :slight_smile:
Затем, мне понадобился ещё один шаблон, который тоже бы мог обновляться по этой форме я его создала в addons / matrix / blocks / static_templates / matrix_purpose.tpl

{** block-description:matrix_purpose **}

<div class="purpose cm-ajax-full-render" id="purpose_matrix">
    <p class="title">{__("purpose_1")}</p>
    <div class="flex">
        <div  class="purpose_flex">
            <div class="purpose_arcan reverse">
                <p class="black">=</p>
                <p class="arcan">{if $auth.data.purpose_1}{$auth.data.purpose_1}{else}?{/if}</p>
            </div>
        </div>
    </div>
<!--purpose_matrix--></div>

Но как его обновлять вместе с тем не очень понимаю :slight_smile:

Да, он бесконечно начинает работать)

В контроллере через display отдавайте оба шаблона, а в форме поправьте

<input type="hidden" name="result_ids" value="matrix,purpose_matrix" />

1 лайк

Супер! Заработало, спасибо, в контроллере сделала вот так:

<?php

use Tygh\Registry;
use Tygh\Ajax;
use Tygh\Tools\Url;
use Tygh\Tygh;

defined('BOOTSTRAP') or die('Access denied');

$view = Tygh::$app['view'];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
	
    $return_url = !empty($_REQUEST['return_url']) ? $_REQUEST['return_url'] : '';
	
	if ($mode === 'update') {
		if ($_REQUEST['result_ids'] == 'matrix, purpose_matrix') {
			
			Registry::get('view')->display('addons/matrix/blocks/static_templates/matrix_purpose.tpl');
			Registry::get('view')->display('addons/matrix/views/matrix/update.tpl');
		}
	}	
	return [CONTROLLER_STATUS_OK, $return_url];		
}



if ($mode === 'update') {	
	if(defined('AJAX_REQUEST')){
	
	    Registry::get('view')->display('addons/matrix/blocks/static_templates/matrix_purpose.tpl');
	    Registry::get('view')->display('addons/matrix/views/matrix/update.tpl');
	
	    exit;
	}
}

Не знаю насколько это правильно)
Благодарю :smiling_face_with_three_hearts:

1 лайк