• Модуль: lists
  • Путь к файлу: ~/bitrix/modules/lists/classes/general/lists.php
  • Класс: CLists
  • Вызов: CLists::copyIblock
static function copyIblock($iblockId, array &$errors)
{
	$iblockId = (int)$iblockId;
	if(!$iblockId)
	{
		$errors[] = Loc::getMessage('LISTS_REQUIRED_PARAMETER', array('#parameter#' => 'iblockId'));
		return false;
	}

	/* We obtain data on old iblock and add a new iblock */
	$query = CIBlock::getList(array(), array('ID' => $iblockId), true);
	$iblock = $query->fetch();
	if(!$iblock)
	{
		$errors[] = Loc::getMessage('LISTS_COPY_IBLOCK_ERROR_GET_DATA');
		return false;
	}
	$iblockMessage = CIBlock::getMessages($iblockId);
	$iblock = array_merge($iblock, $iblockMessage);

	$iblock['NAME'] = $iblock['NAME'].Loc::getMessage('LISTS_COPY_IBLOCK_NAME_TITLE');
	if(!empty($iblock['PICTURE']))
	{
		$iblock['PICTURE'] = CFile::makeFileArray($iblock['PICTURE']);
	}
	if(!empty($iblock['CODE']))
	{
		$iblock['CODE'] = $iblock['CODE'].'_copy';
	}
	$iblockObject = new CIBlock;
	if(!$iblockObject)
	{
		$errors[] = Loc::getMessage('LISTS_COPY_IBLOCK_ERROR_GET_DATA');
		return false;
	}
	$copyIblockId = $iblockObject->add($iblock);
	if($copyIblockId)
	{
		global $CACHE_MANAGER;
		$CACHE_MANAGER->ClearByTag('lists_list_'.$copyIblockId);
		$CACHE_MANAGER->ClearByTag('lists_list_any');
		$CACHE_MANAGER->CleanDir('menu');
	}
	else
	{
		$errors[] = Loc::getMessage('LISTS_COPY_IBLOCK_ERROR_GET_DATA');
		return false;
	}

	/* Set right */
	$rights = array();
	if($iblock['RIGHTS_MODE'] == 'E')
	{
		$rightObject = new CIBlockRights($iblockId);
		$i = 0;
		foreach($rightObject->getRights() as $right)
		{
			$rights['n'.($i++)] = array(
				'GROUP_CODE' => $right['GROUP_CODE'],
				'DO_CLEAN' => 'N',
				'TASK_ID' => $right['TASK_ID'],
			);
		}
	}
	else
	{
		$i = 0;
		if(!empty($iblock['SOCNET_GROUP_ID']))
		{
			$socnetPerm = self::getSocnetPermission($iblockId);
			foreach($socnetPerm as $role => $permission)
			{
				if($permission > "W")
					$permission = "W";
				switch($role)
				{
					case "A":
					case "E":
					case "K":
						$rights['n'.($i++)] = array(
							"GROUP_CODE" => "SG".$iblock['SOCNET_GROUP_ID']."_".$role,
							"IS_INHERITED" => "N",
							"TASK_ID" => CIBlockRights::letterToTask($permission),
						);
						break;
					case "L":
						$rights['n'.($i++)] = array(
							"GROUP_CODE" => "AU",
							"IS_INHERITED" => "N",
							"TASK_ID" => CIBlockRights::letterToTask($permission),
						);
						break;
					case "N":
						$rights['n'.($i++)] = array(
							"GROUP_CODE" => "G2",
							"IS_INHERITED" => "N",
							"TASK_ID" => CIBlockRights::letterToTask($permission),
						);
						break;
				}
			}
		}
		else
		{
			$groupPermissions = CIBlock::getGroupPermissions($iblockId);
			foreach($groupPermissions as $groupId => $permission)
			{
				if($permission > 'W')
					$rights['n'.($i++)] = array(
						'GROUP_CODE' => 'G'.$groupId,
						'IS_INHERITED' => 'N',
						'TASK_ID' => CIBlockRights::letterToTask($permission),
					);
			}
		}

	}
	$iblock['RIGHTS'] = $rights;
	$resultIblock = $iblockObject->update($copyIblockId, $iblock);
	if(!$resultIblock)
		$errors[] = Loc::getMessage('LISTS_COPY_IBLOCK_ERROR_SET_RIGHT');

	/* Add fields */
	$listObject = new CList($iblockId);
	$fields = $listObject->getFields();
	$copyListObject = new CList($copyIblockId);
	foreach($fields as $fieldId => $field)
	{
		$copyFields = array(
			'NAME' => $field['NAME'],
			'SORT' => $field['SORT'],
			'MULTIPLE' => $field['MULTIPLE'],
			'IS_REQUIRED' => $field['IS_REQUIRED'],
			'IBLOCK_ID' => $copyIblockId,
			'SETTINGS' => $field['SETTINGS'],
			'DEFAULT_VALUE' => $field['DEFAULT_VALUE'],
			'TYPE' => $field['TYPE'],
			'PROPERTY_TYPE' => $field['PROPERTY_TYPE'],
		);

		if(!$listObject->is_field($fieldId))
		{
			if($field['TYPE'] == 'L')
			{
				$enum = CIBlockPropertyEnum::getList(array(), array('PROPERTY_ID' => $field['ID']));
				while($listData = $enum->fetch())
				{
					$copyFields['VALUES'][] = array(
						'XML_ID' => $listData['XML_ID'],
						'VALUE' => $listData['VALUE'],
						'DEF' => $listData['DEF'],
						'SORT' => $listData['SORT']
					);
				}
			}

			$copyFields['CODE'] = $field['CODE'];
			$copyFields['LINK_IBLOCK_ID'] = $field['LINK_IBLOCK_ID'];
			if(!empty($field['PROPERTY_USER_TYPE']['USER_TYPE']))
				$copyFields['USER_TYPE'] = $field['PROPERTY_USER_TYPE']['USER_TYPE'];
			if(!empty($field['ROW_COUNT']))
				$copyFields['ROW_COUNT'] = $field['ROW_COUNT'];
			if(!empty($field['COL_COUNT']))
				$copyFields['COL_COUNT'] = $field['COL_COUNT'];
			if(!empty($field['USER_TYPE_SETTINGS']))
				$copyFields['USER_TYPE_SETTINGS'] = $field['USER_TYPE_SETTINGS'];
		}

		if($fieldId == 'NAME')
		{
			$resultUpdateField = $copyListObject->updateField("NAME", $copyFields);
			if($resultUpdateField)
				$copyListObject->save();
			else
				$errors[] = Loc::getMessage('LISTS_COPY_IBLOCK_ERROR_ADD_FIELD',
					array('#field#' => $field['NAME']));

			continue;
		}

		$copyFieldId = $copyListObject->addField($copyFields);
		if($copyFieldId)
			$copyListObject->save();
		else
			$errors[] = Loc::getMessage('LISTS_COPY_IBLOCK_ERROR_ADD_FIELD',
				array('#field#' => $field['NAME']));
	}

	/* Copy Workflow Template */
	// Make a copy workflow templates

	return $copyIblockId;
}