Yandex Metrika
sanches.free 1 просмотр

Картинки инфоблока в шаблоне: CFile::GetFileArray и ResizeImageGet

Зачем сначала GetFileArray

В выборках инфоблока идентификаторы DETAIL_PICTURE, PREVIEW_PICTURE и файловых свойств — это просто числа. Класс CFile ожидает либо этот ID в обёртках вида MakeFileArray, либо уже готовый массив от CFile::GetFileArray: там есть SRC, размеры, тип. Если сразу передать «сырой» ID в функции ресайза там, где нужен массив, вы получите предупреждения или тихий обрыв логики.

Ресайз под сетку

CFile::ResizeImageGet создаёт уменьшенную копию под заданный прямоугольник и складывает её в служебный каталог; при совпадении параметров повторный вызов обычно читает уже сгенерированный файл. Режим BX_RESIZE_IMAGE_EXACT заполняет рамку с подрезкой, BX_RESIZE_IMAGE_PROPORTIONAL сохраняет пропорции без искажений. Выбор режима зависит от вёрстки карточек и того, допускает ли дизайн поля.

$cardThumb = null;
$fileId = (int) ($row["DETAIL_PICTURE"] ?? 0);

if ($fileId > 0)
{
	$fileMeta = CFile::GetFileArray($fileId);
	if (is_array($fileMeta))
	{
		$resized = CFile::ResizeImageGet(
			$fileMeta,
			["width" => 320, "height" => 200],
			BX_RESIZE_IMAGE_EXACT
		);

		if (is_array($resized) && $resized["src"] !== "")
		{
			$cardThumb = [
				"src" => $resized["src"],
				"caption" => (string) ($row["NAME"] ?? ""),
				"lead" => (string) ($row["DETAIL_TEXT"] ?? ""),
			];
		}
	}
}

На что смотреть в продакшене

Не смешивайте в одном участке поток произвольного HTML до картинок и позднюю отправку ресайза без контроля уровней ob_*, если ниже вы отдаёте файл целиком. Для фильтров визуальной части есть отдельные константы и хуки качества JPEG/WebP — их имеет смысл подстроить один раз под CDN и целевой вес страницы, а не крутить на каждом элементе списка.

Краткий чеклист

  • Проверяйте ID и результат GetFileArray до ресайза.
  • Явно выбирайте режим вписывания, чтобы верстка не «плясала».
  • Убедитесь, что список не вызывает лишних ресайзов в цикле без кеширования страницы.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии