Страница 1 из 1

История изменений не отслеживает items::update_by_id

Добавлено: 11 янв 2025, 00:37
soadap
Здравствуйте.
Столкнулся с проблемой, есть несколько кастомных форм/плагинов, которые работают с базой через items::update_by_id($entity_id,$item_id,$data); , но в таком случае изменения не попадают в отчёт "Истории изменений". До этого форма работала через API, изменения попадали в отчёт, но решил переписать форму на более нативный PHP и столкнулся с такой проблемой.
Собственно вопрос, есть ли возможность обновлять значения через php функцию чтобы они трекались в "Истории изменений"?

Re: История изменений не отслеживает items::update_by_id

Добавлено: 11 янв 2025, 11:47
Fait
Да, есть такое.
По смыслу то должно обновляться, конечно.
Но этого не происходит.
Как вариант, можно добавить код, который будет напрямую в базу записывать в историю изменений все изменения

Re: История изменений не отслеживает items::update_by_id

Добавлено: 11 янв 2025, 17:39
Antonyous99
А помоему это перебор каждый инсерт и апдейт в историю писать.
Хотя есть же к функции items::update_by_id опцинальный параметр

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

['run_email_rules'=>false,'run_process'=>false]
что снижает нагрузку на сервер.
Можно было бы тут про запись в исторю добавить.

Re: История изменений не отслеживает items::update_by_id

Добавлено: 11 янв 2025, 21:43
soadap
Fait писал(а): 11 янв 2025, 11:47 Да, есть такое.
По смыслу то должно обновляться, конечно.
Но этого не происходит.
Как вариант, можно добавить код, который будет напрямую в базу записывать в историю изменений все изменения
А не подскажете код? Я вчера игрался с подсмотренным в модуле API и других модулях кодом типа:

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

if(isset($_POST['update_fix_price'])) {
    $entity_id = 40;
    $item_id = $_POST['id'];
    
    // Get current item info before update for track changes
    $item_info_query = db_query("select * from app_entity_" . $entity_id . " where id='" . $item_id . "'");
    $item_info = db_fetch_array($item_info_query);
    
    $data = [
        'field_578' => $_POST['price'],
        'field_783' => time()
    ];
    
    // Perform the update
    items::update_by_id($entity_id, $item_id, $data);
    
    // Log changes
    $log = new track_changes($entity_id, $item_id);
    $log->log_update($item_info);
    
    exit;
}
Но оно не отрабатывало, т.е. изменения переменной вносились, но в историю изменений не попадало.

Re: История изменений не отслеживает items::update_by_id

Добавлено: 12 янв 2025, 10:10
Fait
Да не, вы напрямую в БД запрос посылайте.
Типа

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

db_query('insert into app_track_changes (поля из бд) values (значения полей)');
И так же записать изменённые поля в другую таблицу, в которой поля указаны (не помню, как называется).
Так-то интересно, я наверное скоро тоже поиграюсь с этим функционалом)

Re: История изменений не отслеживает items::update_by_id

Добавлено: 12 янв 2025, 21:35
soadap
В общем работает вот так (там захардкожен report_id = 1, ну и обновляемые поля):

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

if(isset($_POST['update_fix_price'])) {
    global $app_user;
    
    $entity_id = 40;
    $item_id = $_POST['id'];
        
    // Get current item info before update
    $item_info_query = db_query("select e.* from app_entity_" . $entity_id . " e where e.id='" . $item_id . "'");
    $item_info = db_fetch_array($item_info_query);
    
    // Do the update
    db_perform('app_entity_' . $entity_id, array(
        'field_578' => $_POST['price'],
        'field_783' => time(),
        'date_updated' => time()
    ), 'update', "id='" . db_input($item_id) . "'");
        
    // Log change and field
    db_perform('app_ext_track_changes_log', array(
        'reports_id' => 1,
        'type' => 'update',
        'entities_id' => $entity_id,
        'items_id' => $item_id,
        'date_added' => time(),
        'created_by' => $app_user['id']
    ));
    
    db_perform('app_ext_track_changes_log_fields', array(
        'log_id' => db_insert_id(),
        'fields_id' => 578,
        'value' => $_POST['price'],
        'previous_value' => $item_info['field_578']
    ));
    
    exit;
}
Хотя только что увидел что оно нормально не трекает юзера, вместо имени пишет "Public Form" и в базе значение created_by = 0, так что ещё нужно подправить.

Re: История изменений не отслеживает items::update_by_id

Добавлено: 13 янв 2025, 00:10
soadap
В общем понял, в Custom PHP (я туда эту функцию запихнул, чтобы использовать sitewide) переменная $app_user не работает, потому нужно либо вызывать эту функцию из плагина, либо передавать переменную юзера из формы.

////

Перенёс фукнцию в плагин вместо кастоминого php, переменнар $app_user работает нормально, история изменения заносится корректно.

Re: История изменений не отслеживает items::update_by_id

Добавлено: 13 янв 2025, 08:31
Fait
Главное, чтобы работало)
Хотя, код можно и попроще сделать, без db_perform и пр.

Re: История изменений не отслеживает items::update_by_id

Добавлено: 14 янв 2025, 00:46
soadap
Fait писал(а): 13 янв 2025, 08:31 Главное, чтобы работало)
Хотя, код можно и попроще сделать, без db_perform и пр.
Код Claude писал, я JS'сник и PHP вообще не знаю, но как вы сказали главное чтобы работало.))