Страница 2 из 4

Re: Автоматизация - вызов процесса автоматизации.

Добавлено: 31 май 2023, 12:37
tehnos
Вот только что понадобилось запустить автоматизацию из автоматизации - пошёл на форум, а тут такое :)
Всё же не совсем понятно... Как например запустить автоматизацию #100 из "Выполнить PHP скрипт"?

Re: Автоматизация - вызов процесса автоматизации.

Добавлено: 31 май 2023, 15:12
alexinc
tehnos писал(а): 31 май 2023, 12:37 Вот только что понадобилось запустить автоматизацию из автоматизации - пошёл на форум, а тут такое :)
Всё же не совсем понятно... Как например запустить автоматизацию #100 из "Выполнить PHP скрипт"?
Пока подсказать не могу до конца. Борюсь. По всем признакам должен работать, но не работает. Пока не ясно, почему. С кнопки работает в списке записи, а вот с запуска из автоматизации, нет. Причем, видно в date_updated - обновление происходит. Не понятно.

Re: Автоматизация - вызов процесса автоматизации.

Добавлено: 31 май 2023, 16:08
tehnos
Держите, кому надо. Работает.
Прошу Сергея поправить, если видны очевидные косяки или присутствует лишний код.

Код: Выделить всё

/* Запуск автоматизации №73 */

$item_id = [id];
$process_id = 73;

//find process
$process_query = db_query("SELECT * FROM `app_ext_processes` WHERE `id` = {$process_id}");
$process = mysqli_fetch_assoc($process_query);

//check status
if($process['is_active'] == 0) {
  die();
}

//check process filter
$reports_info_query = db_query("SELECT * FROM `app_reports` WHERE `entities_id` = '" . db_input($process['entities_id']) . "' AND `reports_type` = 'process" . $process['id'] . "'");
if($reports_info = mysqli_fetch_assoc($reports_info_query)) {
  if(!reports::count_filters_by_reports_id($reports_info['id']) && !$item_id) {
    die("Error: filters are not setup for process #{$process_id}!");
  }
}

$processes = new processes($process['entities_id']);

//run process for single item
if($item_id) {
  //check if item exists
  $check_query = db_query("SELECT `id` FROM `app_entity_{$process['entities_id']}` WHERE `id` = {$item_id}");
  if(!$check = mysqli_fetch_assoc($check_query)) {
      die("Error: item #{$item_id} not found");
    }
    
  $processes->items_id = $item_id;
    if($processes->check_buttons_filters($process)) {
      $processes->run($process, false, true);
    }
}

//run process for filtered items
elseif($reports_info) {
    $listing_sql_query = '';
    $listing_sql_query_select = '';
    $listing_sql_query_having = '';
    $sql_query_having = array();

    //prepare forumulas query
    $listing_sql_query_select = fieldtype_formula::prepare_query_select($process['entities_id']);

    $listing_sql_query = reports::add_filters_query($reports_info['id'], $listing_sql_query);

    //prepare having query for formula fields
    if(isset($sql_query_having[$process['entities_id']]))
    {
        $listing_sql_query_having = reports::prepare_filters_having_query($sql_query_having[$process['entities_id']]);
    }

    $listing_sql_query .= $listing_sql_query_having;

    $item_sql = "SELECT e.* " . $listing_sql_query_select . " FROM app_entity_" . $process['entities_id'] . " e  WHERE e.id > 0 " . $listing_sql_query;

    $item_query = db_query($item_sql);
    while($item = mysqli_fetch_assoc($item_query))
    {
        $processes->items_id = $item['id'];
        $processes->run($process, false, true);           
    }    
}

Re: Автоматизация - вызов процесса автоматизации.

Добавлено: 31 май 2023, 16:19
alexinc
Это ж прямо из cron вытащено. Нет?

Re: Автоматизация - вызов процесса автоматизации.

Добавлено: 31 май 2023, 16:24
tehnos
Да. Перенабрал в привычное для меня форматирование + было пару опечаток исправил.
У себя проверил на автоматизации выполняющейся для единичной записи - всё ок.
Если будет более компактное решение - сообщите.

Re: Автоматизация - вызов процесса автоматизации.

Добавлено: 31 май 2023, 17:14
alexinc
Ну на самом деле, как ребята подсказали выше - все достаточно просто.
$current_entity_id = это поле из запроса $process_query = db_query("SELECT * FROM `app_ext_processes` WHERE `id` = {$process_id}") - process['entities_id'].
Самое важное в работе процесса - это получить item_id. без него работать не будет никак. А вот получить его можно уже разными способами. Прямым перебором из базы или фильтры применять, но item_id передавать обязательно.
processes = new processes($current_entity_id);
$processes->items_id = $current_item_id;
$processes->run($process, false, true);
Единственно, я не понял - что за 3 параметр вот здесь: $processes->run($process, false, true). В коде класса стоит is_ipn - что это значит, для меня загадка (комментариев в коде - 0)... опытным путем выяснил, что не будет показываться сообщение о выполнении, но сдается мне - это просто стечение обстоятельств.

Re: Автоматизация - вызов процесса автоматизации.

Добавлено: 31 май 2023, 17:38
tehnos
"Всё просто", но никто не предложил рабочий кусок кода.

Re: Автоматизация - вызов процесса автоматизации.

Добавлено: 31 май 2023, 18:04
alexinc

Код: Выделить всё

$process_id = 26;
$process_query = db_query("SELECT * FROM app_ext_processes WHERE id =".$process_id,false); // получаем данные из таблицы процессов.
if ($process=db_fetch_array($process_query)) {
//получаем нужный id записи, который используется в процессе. Обзовем его $item_id. Возможно, придется получать список.
$processes = new processes($process['entities_id']);
$processes->items_id = $item_id;
$processes->run($process, false, true);
}

Re: Автоматизация - вызов процесса автоматизации.

Добавлено: 03 июн 2023, 06:28
support
Для версии 3.4 добавил метод run_by_id

Re: Автоматизация - вызов процесса автоматизации.

Добавлено: 05 июн 2023, 10:35
tehnos
Благодарю!