Fn_attach_image_pairs() - как её оседлать?

Хочу в категорию добавить еще одно дополнительное изображение. Что я уже сделал:

  1. Доработал шаблон админки добавив хук с таким кодом:

    {include
    file=“common/attach_images.tpl”
    image_name=“category_scheme_image”
    image_object_type=“category”
    image_pair=$category_data.category_scheme_image
    image_object_id=$id
    image_type=“A”
    }

В итоге появилось поле добавления изображения на странице dispatch=categories.update.
Подозреваю что на этом этапе я ошибся в параметрах загрузки common/attach_images.tpl.

Как мануал использую вот эту статью Как добавить картинку к объекту — Документация docs.cs-cart.ru 4.11.x, но в голове что-то не сходится.

К примеру:

image_object_type — тип объекта, в котором будут храниться картинки в данном случае в таблице cscart_common_images_links, cscart_common_images, cscart_detailed_images

но таблиц cscart_common_images_links, cscart_common_images, cscart_detailed_images в моей базе нет. Поэтому я не совсем уверен что верно заполнил этот параметр image_object_type.

  1. Написал хук к контролеру:

    <?php

use Tygh\Registry;

if (!defined(‘BOOTSTRAP’)) { die(‘Access denied’); }

$_REQUEST[‘category_id’] = empty($_REQUEST[‘category_id’]) ? 0 : $_REQUEST[‘category_id’];

if ($_SERVER[‘REQUEST_METHOD’] == ‘POST’) {

if ($mode == 'update') {
	$category_id = fn_update_category($_REQUEST['category_data'], $_REQUEST['category_id'], DESCR_SL);
	
	if (!empty($category_id)) {
		fn_attach_image_pairs('category_scheme_image', 'category', $category_id, DESCR_SL);
	}
}

}

Также не уверен в параметрах. За пример взял /app/controllers/backend/categories.php. Там fn_attach_image_pairs() использует 4 параметра, последний из которых языковая переменная?

Но в Как добавить картинку к объекту — Документация docs.cs-cart.ru 4.11.x такое разъяснение последнего параметра:

mod — имя таблицы, содержащей данный объект (другими словами, это параметр object_table в таблице common_images_links; если таблица со ссылками используется своя, то параметр задавать не нужно — например, для товаров).

Если под таблице common_images_links имеется ввиду cscart_images_links, то в ней нет object_table. Есть pair_id object_id object_type image_id detailed_id type position.

В итоге что у меня получилось. Получилось внести запись в cscart_images_links. То есть, как я понял, создалась пара id-категории + id-картинки.

Но, в шаблоне массив $category_data не имеет элемента $category_data .category_scheme_image. И вывести картинку я не могу. Я не записал информацию в массив? Где это сделать?

  1. Наверное я должен писать:

    $category_data[‘category_scheme_image’] = fn_get_image_pairs($category_id, ‘category’, ‘A’);

Но только куда и правильно ли?

Вроде понял. Нужно во фронтенд контроллер categories.php хукнуть:

		$category_data['category_scheme_image'] = fn_get_image_pairs($_REQUEST[category_id], 'category_scheme_image', 'A');

И object_type должен быть не category, а category_scheme_image.

Но вот что означает последний параметр в функции fn_attach_image_pairs() так и не пойму…

Я так понимаю, Вы начинающий разработчик. Если Вы не понимаете что делает какая-либо функция, или не знаете на что влияет какой-либо параметр - откройте код функции и посмотрите http://i.abt.team/inj/20200402-143546-DYKBxbVHeB.png. Только так можно 100% понять что оно делает, а заодно подсмотреть хорошие приемы программирования (если конечно код от нормальных разработчиков).

1 лайк

Обратите внимание на переменную image_type

1 лайк

Последний параметр ($object_ids) используется для добавления картинок с одним типом к разным объектам на одной странице. Например, при заливке картинки к разным вариантам характеристики с типом производитель.

В вашем случае его использовать не надо, оставьте пустым

1 лайк

Всем спасибо, вроде бы все получилось удачно.

Единственное, я не совсем понял что есть “тип объекта”.
В fn.images.php сказано:

@param string $image_type Type of an object image belongs to (product, category, etc.)

Это какие-то фиксированные типы? Методом перебора понял что писать тип 'category' не могу, так как переписывается основное изображение категории. И пишу свой, выдуманный 'category_scheme_image'. Который еще и сходится с image_name.

fn_attach_image_pairs('category_scheme_image', 'category_scheme_image', $category_id, DESCR_SL);

image_name я понял зачем нужен:

@param string $name Name of image to search for inside global $_REQUEST array

Но не должен ли мой тип быть = category?

Нет, можете свои использовать без проблем. Просто по этому типу потом выборка из базы идет, т.к., например, ID = 10 может быть и у товара, и у категории и тп

1 лайк

Столкнулся с задачей добавить доп. картинку к варианту характеристики “Бренд”.

В themes/backend успешно добавил поле вот так:

<div class="control-group">
<label class="control-label" for="elm_image_{$id}_{$num}">{__("certificate")}</label>
<div class="controls">
{include file="common/attach_images.tpl"
	image_name="feature_variant_sert"
	image_object_type="feature_variant_sert"
	image_pair=$var.feature_variant_sert
	image_key=$num
	image_type="V"
	prefix=$id
	hide_titles=true
	no_thumbnail=true
}
</div>

Но с ($mode == ‘update’) в контроллере проблема. Ведь нужен 5-ый параметр для функции, так как я не в характеристику загружаю картинку, а в её вариант:

fn_attach_image_pairs('feature_variant_sert', 'feature_variant_sert', $feature_id, DESCR_SL, [???]);

Как и где его получить? Сейчас ищу в /app/controllers/backend/product_features.php. Но может быть надо искать в другом месте?

И если я верно понимаю мне нужно будет в дальнейшем расширить функцию fn_get_product_feature_variant() добавив в неё:

$var['feature_variant_sert'] = fn_get_image_pairs($variant_id, 'feature_variant_sert', 'V', true, true, $lang_code);

если я хочу чтобы в массиве появился [feature_variant_sert] => …?

Например, в REQUEST смотрите варианты, которые обновляются. Но тут есть момент - заливка сработает только для существующих вариантов

1 лайк

Спасибо, прописал вот так:

fn_attach_image_pairs('feature_variant_sert', 'feature_variant_sert', $feature_id, DESCR_SL, $_REQUEST['feature_data']['original_var_ids'] );

Как можно проверить что картинка загрузилась именно к варианту?
В таблице cscart_images запись появилась. И пара в таблице cscart_images_links тоже. Но меня смущает что в cscart_images_links под object_id стоит id характеристики, а не id варианта характеристики. Как cs-cart цепляет картинку именно для варианта?

Понял свою ошибку. 5-ый параметр должен быть массивом, а не строкой. Собрал его так:

$object_ids = explode(",", $_REQUEST['feature_data']['original_var_ids']);

Важно чтобы массив начинался с 1-цы. Иначе будет сдвиг картинки по вариантам вниз. Я сделал так:

array_unshift($object_ids, NULL);
unset($object_ids[0]);

И 3-тий параметр получается не нужно указывать:

fn_attach_image_pairs('feature_variant_sert', 'feature_variant_sert', false, DESCR_SL, $object_ids);

Теперь в БД записи добавляются верно.

Осталось только создать хук для функции вот так:

function fn_my_changes_get_product_feature_variants_post(
	&$vars,
	&$params,
	&$lang_code
) {
	// add sertificat
	if ($params['get_images'] == true) {
		$image_pairs = $vars
			? fn_get_image_pairs(array_keys($vars), 'feature_variant_sert', 'V', true, true, $lang_code)
			: array();

		foreach ($image_pairs as $variant_id => $image_pair) {
			$vars[$variant_id]['feature_variant_sert'] = array_pop($image_pair);
		}
	}
}

В итоге все получило! =)

2 лайка

А случайно как с фронтенда картинку загрузить не знаете?