[РЕШЕНО!] Как добавить в свой модуль мультизагрузку картинок?

Согласно документации:
https://www.cs-cart.ru/docs/4.11.x/developer_guide/core/images_subsystem.html?highlight=attach_images
Как добавить одну картинку, вроде разобрался.
А вот как сделать загрузку нескольких картинок, как в товаре?
В файле
design/backend/templates/views/products/update.tpl
это делается вот так:

{include file="common/form_file_uploader.tpl"
existing_pairs=(($product_data.main_pair) ? [$product_data.main_pair] : []) + $product_data.image_pairs|default:[]
file_name="file"
image_pair_types=['N' => 'product_add_additional_image', 'M' => 'product_main_image', 'A' => 'product_additional_image']
allow_update_files=!$is_shared_product && $allow_update_files|default:true
}

Пробую делать по аналогии, как с одной картинкой, но ничего не получается. Во первых при сохранении записи предупреждение “Вы точно хотите покинуть данную страницу?”. И ничего не сохраняется!
Может кто реализовывал?

В общем почти со всем разобрался, по порядку:
Добавляем поле вот так:

{include
file="common/form_file_uploader.tpl"
existing_pairs=(($page_data.main_pair) ? [$page_data.main_pair] : []) + $page_data.image_pairs|default:[]
file_name="file"
image_pair_types=['N' => 'myimg_add_additional_image', 'M' => 'myimg_main_image', 'A' => 'myimg_additional_image']
allow_update_files=!$is_shared_myimg && $allow_update_files|default:true
}

В функции обновления добавляем это:

// Update main image
fn_attach_image_pairs('myimg_main', 'myimg', $page_id, $lang_code);

// Update additional images
fn_attach_image_pairs('myimg_additional', 'myimg', $page_id, $lang_code);

// Add new additional images
fn_attach_image_pairs('myimg_add_additional', 'myimg', $page_id, $lang_code);

// Remove images
if (isset($page_data['removed_image_pair_ids'])) {
    $page_data['removed_image_pair_ids'] = array_filter($page_data['removed_image_pair_ids']);
}
if (!empty($page_data['removed_image_pair_ids'])) {
    fn_delete_image_pairs($page_id, 'myimg', '', $page_data['removed_image_pair_ids']);
}

/**
 * Re-attach one of the additional myimg images as the main one when myimg has no main image.
 * This case can occur when creating or updating a myimg programmatically via API.
 */
$main_image = fn_get_image_pairs($page_id, 'myimg', 'M', true, true, $lang_code);
$additional_images = fn_get_image_pairs($page_id, 'myimg', 'A', true, true, $lang_code);
$main_image_candidate = reset($additional_images);

if (!$main_image && $main_image_candidate) {
    $pairs_data = [
$main_image_candidate['pair_id'] => [
    'detailed_alt' => '',
    'type' => 'M',
    'object_id'    => 0,
    'pair_id'      => $main_image_candidate['pair_id'],
    'position'     => 0,
    'is_new'       => YesNo::NO,
],
    ];

    fn_update_image_pairs([], [], $pairs_data, $page_id, 'myimg', [], true, $lang_code);

в функции удаления вот так:

fn_delete_image_pairs($page_id, 'myimg');

в функции get вот так (в аргументах ещё добавляем $get_main_pair = true, $get_add_pairs = true):

// Get additional image pairs
if ($get_add_pairs == true) {
$page_data['image_pairs'] = fn_get_image_pairs($page_data['page_id'], 'myimg', 'A', true, true, $lang_code);
}
// Get main image pair
if ($get_main_pair == true) {
$page_data['main_pair'] = fn_get_image_pairs($page_data['page_id'], 'myimg', 'M', true, true, $lang_code);

В этом случае работает добавление картинок, как при создании, так и при обновлении. При удалении записи картинки удаляются из базы, но при каждом действии страница ругается:

И ещё, если удалить одну картинку или две, ну то есть уже в созданной записи, то удаление не происходит при сохранении записи. И такое же предупреждение об уходе со странице.
Подскажите что делать?

2 лайка

С удалением элемента массива картинок разобрался, надо создать копию файла common/form_file_uploader.tpl с другим именем (common/form_file_uploader_myimage.tpl) и подключить его. А в нем строку:
<input type="hidden" name="product_data[removed_image_pair_ids][]" value="" data-ca-image-remove>
Заменить на:
<input type="hidden" name="page_data[removed_image_pair_ids][]" value="" data-ca-image-remove>
Осталось только убрать окно с предупреждением о закрытии страницы!
Есть у кого идеи???

1 лайк

Разобрался сам, на кнопке сохранить нет события отменяющего стандартное поведение.
Реализовал в js скрипте плагина, добавил уже обрабатываемый класс для продуктов, вот так:

var mySaveButton = document.querySelector('.btn.btn-primary.cm-submit.btn-primary');
mySaveButton.classList.add('cm-product-save-buttons');

У кого будут вопросы, готов помочь.

5 лайков

Ты просто спаситель) Помогло. Спасибо)

Да не за что, все бы так друг другу помогали :wink:

3 лайка