Скрипты миграций для 1С-Битрикс. Добавление/обновление пользователей и их групп
Продолжая тему кусков кода для миграций на 1С-Битрикс представляю код миграции для пользователей и их групп. Для групп пользователей есть возможность установить права доступа к модулям и инфоблокам.
Код миграции
//<?php $errors = array(); /** * Список групп пользователей * Доступно добавление/обновление групп пользователей * * 1. В массиве MODULES_PERMISSIONS указываем права к административным частям модулей * 2. В массиве IBLOCK_PERMISSIONS права доступа к инфоблокам array(iblock_id => permission) * * И MODULES_PERMISSIONS и IBLOCK_PERMISSIONS не перезапишут текущие значения, а допишут новыми значениями */ $groups = array( array( 'NAME' => 'Olegpro', 'STRING_ID' => 'OLEGPRO', ), array( 'NAME' => 'Bitrix', 'STRING_ID' => 'BITRIX', ), array( 'NAME' => 'Интеграция с 1С', 'STRING_ID' => '1C_EXCHANGE', ), array( 'NAME' => 'Администраторы интернет-магазина', 'MODULES_PERMISSIONS' => array( array('sale', 'U'), array('sender', 'R'), ), 'IBLOCK_PERMISSIONS' => array( 163 => 'W', ), ), ); /** * Список пользователей * Поиск уже существующих пользователей осуществляется по логину. * В массиве групп указываем не ID групп, а их имена (потому что ID на dev/prod серверах могут отличаться) */ $users = array( array( 'NAME' => 'Олег', 'LAST_NAME' => '', 'EMAIL' => 'email@site.ru', 'LOGIN' => 'email@site.ru', 'LID' => 'ru', 'ACTIVE' => 'Y', 'GROUP_ID' => array('Olegpro', 'Администраторы интернет-магазина'), 'PASSWORD' => '123456', 'CONFIRM_PASSWORD' => '123456', ), array( 'LOGIN' => 'admin', 'GROUP_ID' => array('Olegpro'), ), array( 'LOGIN' => 'test', 'GROUP_ID' => array('Bitrix'), ), ); \Bitrix\Main\Loader::includeModule('iblock'); foreach ($groups as $key => $groupFields) { if(!isset($groupFields['NAME'])) continue; $groupPermissions = array(); if(isset($groupFields['MODULES_PERMISSIONS']) && is_array($groupFields['MODULES_PERMISSIONS'])) { $groupPermissions = $groupFields['MODULES_PERMISSIONS']; unset($groupFields['MODULES_PERMISSIONS']); } $iblockPermissions = array(); if(isset($groupFields['IBLOCK_PERMISSIONS']) && is_array($groupFields['IBLOCK_PERMISSIONS'])) { $iblockPermissions = $groupFields['IBLOCK_PERMISSIONS']; unset($groupFields['IBLOCK_PERMISSIONS']); } $g = new CGroup(); $newGroupId = 0; $groupIterator = CGroup::GetList( ($by = ''), ($order = ''), array( 'NAME' => $groupFields['NAME'] ) ); if($group = $groupIterator->Fetch()) { $newGroupId = $group['ID']; if(!($g->Update($newGroupId, $groupFields))) { $errors[] = sprintf('Ошибка обновления группы пользователей [%s]: %s', $groupFields['NAME'], $g->LAST_ERROR); } }else{ if(!($newGroupId = $g->Add($groupFields))) { $errors[] = sprintf('Ошибка добавления группы пользователей [%s]: %s', $groupFields['NAME'], $g->LAST_ERROR); } } // Устанавливаем права к административным частям модулей if(is_array($groupPermissions)) { foreach($groupPermissions as $groupPermission) { $oldPermission = CGroup::GetModulePermission($newGroupId, $groupPermission[0]); if($oldPermission !== $groupPermission[1]) { CGroup::SetModulePermission($newGroupId, $groupPermission[0], $groupPermission[1]); } } } // Устанавливаем права доступа к инфоблокам if(is_array($iblockPermissions)) { foreach($iblockPermissions as $iblockId => $permission) { $oldPermissions = $newPermissions = CIBlock::GetGroupPermissions($iblockId); $newPermissions[$newGroupId] = $permission; if($oldPermissions !== $newPermissions) { CIBlock::SetPermission($iblockId, $newPermissions); } } } $groups[$key] = false; unset($groups[$key]); $groupFields['ID'] = $newGroupId; $groups[$groupFields['NAME']] = $groupFields; } unset($key, $groupFields); if(!empty($errors)) { echo '<pre>';print_r($errors);echo '</pre>'; return ''; die(); } foreach ($users as $key => $userFields) { if(!isset($userFields['LOGIN'])) continue; $u = new CUser(); $newUserId = 0; $userIterator = CUser::GetList( ($by = ''), ($order = ''), array( 'LOGIN_EQUAL' => $userFields['LOGIN'] ), array( 'SELECT' => array('UF_*'), 'FIELDS' => array('ID', 'EMAIL', 'LOGIN') ) ); if($user = $userIterator->Fetch()) { $newUserId = $user['ID']; }else{ if(!($newUserId = $u->Add($userFields))) { $errors[] = sprintf('Ошибка добавления пользователя [%s]: %s', $userFields['LOGIN'], $u->LAST_ERROR); } } if($newUserId > 0) { $userGroups = CUser::GetUserGroup($newUserId); foreach ($userFields['GROUP_ID'] as $keyGroupId => $groupName) { if(isset($groups[$groupName])) { $userGroups[] = $groups[$groupName]['ID']; } } $userFields['GROUP_ID'] = array_unique($userGroups); if(!($u->Update($newUserId, $userFields))) { $errors[] = sprintf('Ошибка обновления пользователя [%s]: %s', $userFields['LOGIN'], $u->LAST_ERROR); } } $users[$key] = $userFields; } unset($key, $userFields); if(!empty($errors)) { echo '<pre>';print_r($errors);echo '</pre>'; }else{ echo 'Готово.'; }
Список миграций доступен по тегу Миграции для 1С-Битрикс