Логика работы функции fn_set_progress

Какая логика у функции прогресса fn_set_progress?

Пример, есть цикл, обработка файла 4000 позиций.

Перед циклом
fn_set_progress(‘echo’, “Загружено предложений: 0”);

В начале цикла
$count_offers++; //подсчет
fn_set_progress(‘parts’, $count_offers);
fn_set_progress(‘title’, “Обработка файла”);

В конце цикла
fn_set_progress(‘echo’, __(‘Загружено предложений’) ." ". $count_offers);
fn_set_progress(‘step_scale’, $count_offers);

Прогресс в обработке сразу смещается в право, и там стоит до финала.
http://joxi.ru/DrlBDbqtvbZ3X2

То есть, нет самого процесса плавного движения ползунка.

Сами себе ответим)

Строку fn_set_progress(‘step_scale’, $count_offers); Необходимо поставить перед циклом.
Где $count_offers Общее количество элементов в цикле.

$count_offers = count($array_offers);

fn_set_progress(‘step_scale’, $count_offers);

foreach($array_offers as $offer){
   fn_set_progress(‘title’, “Обработка файла”);
   ...
   fn_set_progress(‘echo’, __(‘Загружено предложений’) ." ". $count_offers);
}
3 лайка

fn_set_progress только по ajax работает? При генерации страницы его можно как-то показать? У меня вывод всех сообщений делается просто на белом фоне…

Или что-то нужно дополнительно подключить?

Да, работает только с аяксом

А есть какая-то возможность добавить в админское меню ajax ссылку, чтобы запрос на контроллер уходил по ajax и выводил мою логику в progress bar?

Просто сейчас я реализовал в menu.post.php обычную ссылку, и контроллер отрабатывает без ajax. Ничего аналогичного (похожего) на мою задачу найти не могу (

Выложите код ссылки и саму функцию.

Код ссылки:
модуль/schemas/menu/menu.post.php

$schema[‘top’][‘addons’][‘items’][‘s_helpers_mod.s_clear_category’] = array(
‘attrs’ => array(
‘class’=>‘is-addon’
),
‘href’ => ‘s_helpers_mod_clear_category.delete_all_products’,
‘position’ => 800,
);
return $schema;

Код контроллера:
модуль/controllers/backend/s_helpers_mod_clear_category.php

if (!defined(‘BOOTSTRAP’)) { die(‘Access denied’); }
if($mode==‘delete_all_products’){
$s_prod_ids = db_get_fields (“SELECT * FROM cscart_products_categories WHERE category_id = 3476;”);

$s_prod_ids_count = count($s_prod_ids);
fn_set_progress(‘step_scale’, $s_prod_ids_count);

foreach($s_prod_ids as $s_prod_id){
fn_delete_product($s_prod_id);
fn_set_progress(‘echo’, ‘Удалено товаров’ ." ". $s_prod_id);
}
return array(CONTROLLER_STATUS_OK, “categories.manage”);
}

Попробуйте так:

$schema[‘top’][‘addons’][‘items’][‘s_helpers_mod.s_clear_category’] = array(
‘attrs’ => array(
‘class’=>‘is-addon’,
'class_href' => 'cm-ajax cm-comet',
),
‘href’ => ‘s_helpers_mod_clear_category.delete_all_products’,

‘position’ => 800,
);`return $schema;`

Суть в том, чтобы повесить класс ‘cm-ajax cm-comet’ на Вашу ссылку.
В схеме есть подсказка, что можно добавить через class_href, но на тесте не срабатывает…

Если принципиально повесить класс именно на пункт, меню, попробуйте через скрипт добавить.

1 лайк

Еще вот это

fn_set_progress(‘step_scale’, $s_prod_ids_count);

надо поменять на

fn_set_progress('parts', $s_prod_ids_count);
fn_set_progress('step_scale', 1);
1 лайк

Огроменное Вам спасибо!!! Все работает

Еще один момент подскажите плз, как стандартно сделать редирект после ajax запроса? Не хочу писать логику обновления значений в блоках и т.п., думаю сделать проще, редиректить на страницу с данными

return array(CONTROLLER_STATUS_REDIRECT, "categories.manage");

не срабатывает при ajax запросах?

fn_redirect();

Тоже не срабатывает

А если:

Без

return array(CONTROLLER_STATUS_REDIRECT, “categories.manage”);

После функций в контроллере.

fn_redirect(fn_url('categories.manage', 'A'));
exit;

Неа, не срабатывает. Остается на той же странице…

Думал js кастомный подцепить и там переадресацию на js реализовать по событию 'ce.ajaxdone'

Но как свой скрипт подцепить через контроллер, без шаблонов, нигде найти не могу )) Или такое вообще не реально?

Можно попробовать так:
После клика дождаться окончания выполнения ajax, и выполнить переадресацию

$('.my_spec_btn').on('click', function() { 
    $.ceEvent('on', 'ce.ajaxdone', function(event) {
               window.location.replace("https://google.com");
        });         
});
1 лайк

Шаблон нужен для того, чтобы скрипт вгрузить.
Точнее нужно подключится к хуку
Например design/backend/templates/addons/my_changes/hooks/index/scripts.post.tpl
и там либо сам скрипт, либо ссылку на него(название аддона своё используйте)

1 лайк

Вот так

Tygh::$app['ajax']->assign('force_redirection', fn_url('categories.manage'));
exit;
2 лайка
Tygh::$app['ajax']->assign('force_redirection', fn_url('categories.manage'));
exit;

Вот так работает! Огромное спасибо!

1 лайк

Рад был помочь

1 лайк