- Модуль: 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;
}