CMS 1C-Битрикс - копирование файлов

8 Октябрь 2016 0 комментариев

На просторах Интернета часто можно натолкнуться на жалобы пользователей CMS "1С-Битрикс", посвящённые тому прискорбному факту, что при копировании элемента инфоблока значения полей и свойств типа "Файл" не копируются - то есть, например, если в скопированном элементе поля "Картинка для анонса" и "Детальная картинка" были заполнены, то в получившейся копии они будут пусты. Если картинки должны быть одинаковы и у оригинала и у копии, приходится в каждую копию элемента заново загружать те же изображения.

Предположим, нам нужно, чтобы при копировании элемента инфоблока копировались также значения его полей "Картинка для анонса" и "Детальная картинка", свойства "Каталог" типа "Файл" и множественного свойства "Файлы" типа "Файл". Для этого можно в файле init.php прописать функцию AddEventHandler следующего вида:

AddEventHandler("iblock", "OnBeforeIBlockElementAdd", ["ClassElementImageCopy", "OnBeforeIBlockElementAddHandler"]);
class ClassElementImageCopy
{
	function OnBeforeIBlockElementAddHandler(&$arFields)
	{
		if (!empty($_REQUEST['copyID']) and ($copy_ID = (int)$_REQUEST['copyID']))
		{
			CModule::IncludeModule('iblock');
			$product = CIBlockElement::GetByID($copy_ID)->fetch();
			if(!empty($product['DETAIL_PICTURE']))
				$arFields['DETAIL_PICTURE'] = CFile::MakeFileArray(CFile::GetPath($product['DETAIL_PICTURE']));

			if(!empty($product['PREVIEW_PICTURE']))
				$arFields['PREVIEW_PICTURE'] = CFile::MakeFileArray(CFile::GetPath($product['PREVIEW_PICTURE']));
			$res = CIBlockElement::GetProperty(23, $copy_ID, ['ID' => 'ASC'], ['CODE' => 'FILES']);
			while ($ob = $res->GetNext())
				$arFields['PROPERTY_VALUES']['FILES'][] = ['VALUE' => CFile::MakeFileArray(CFile::GetPath($ob['VALUE'])), 'DESCRIPTION' => ''];

			if(!empty($arFields['PROPERTY_VALUES']['FILES']))
				CIblockElement::SetPropertyValues($arFields['ID'], 23, $arFields['PROPERTY_VALUES']['FILES'], 'FILES');

			$res = CIBlockElement::GetProperty(23, $copy_ID, ['ID' => 'ASC'], ['CODE' => 'CATALOG']);
			if ($ob = $res->GetNext())
			{
				$arFields['PROPERTY_VALUES']['CATALOG'] = ['VALUE' => CFile::MakeFileArray(CFile::GetPath($ob['VALUE'])), 'DESCRIPTION' => ''];
				CIblockElement::SetPropertyValues($arFields['ID'], 23, $arFields['PROPERTY_VALUES']['CATALOG'], 'CATALOG');
			}
		}
	}
}

Теперь, непосредственно после копирования элемента на открывшейся форме редактирования элемента-копии все поля и свойства типа "Файл" будут пусты. Но при нажатии кнопок "Сохранить", "Применить" или "Сохранить и добавить" нужные нам поля и свойства элемента-копии будут содержать копии значений соответствующих полей и свойств элемента-оригинала.

Популярные статьи

То, что еще нравится нашим читателям

Оставьте комментарий

Нам важно ваше мнение
Укажите корректный e-mail
Укажите ваше имя
Напишите текст комментария

Заявка на сотрудничество с нами

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

Не корректный email