Я конечно извиняюсь, но ваши разработчики не вникли в суть проблемы. У себя каждый раз исправляю, но все же хотелось бы чтобы было исправлено в ядре. Итак:
- Действительно за обновление настроек отвечает fn_update_addon_settings в которую в качестве четвертого аргумента передается $vendor_values
- Далее для обновления настроек витрин страбатывает вот этот код
if (
!empty($vendor_values[$setting['id']])
&& Settings::instance()->areOverriddenValuesSupportedByEdition($setting['edition_type'])
) {
foreach ($vendor_values[$setting['id']] as $company_id => $vendor_setting_value) {
if ($setting_value != $vendor_setting_value) {
Settings::instance()->updateValueById($setting_id, $vendor_setting_value, $company_id, $execute_functions);
}
}
}
В итоге мы переходим к Settings::instance()->updateValueById(), где и доходим до изначально указанного мной кода
$this->db->replaceInto($table, $data);
if ($this->isRootMode() && $storefront_id) {
$this->db->query('DELETE FROM ?:settings_vendor_values WHERE object_id = ?i AND storefront_id = ?i', $object_id, $storefront_id);
}
Теперь смотрим скриншот дебаггера
И видим что срабатывает
Записываем в таблицу settings_vendor_values правильные настройки что были у обновляемого модуля для витрины 3
$this->db->replaceInto("settings_vendor_values", ['object_id' => 6377, 'value' => 3, 'company_id' => 3, 'storefront_id' => 3]);
Удаляем только что записанные настройки витрины 3
\\isRootMode = true storefront_id=3
if ($this->isRootMode() && $storefront_id) {
$this->db->query('DELETE FROM ?:settings_vendor_values WHERE object_id = 6377 AND storefront_id = 3');
}
До 4.13.2 кода удаления не было и все работало корректно(старые настройки сохранялись). Ну и логики работы я тут не вижу - нужно либо удалять старые настройки и ничего не записывать. Либо удалять старые настройки, а потом записывать новые. Либо как раньше просто был код db->replaceInto и все работало прекрасно. А вот записывать новые настройки и тут же удалять ну как то странно, хотя может так и задумано.