%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/main/classes/general/ |
| Current File : /home/bitrix/www/bitrix/modules/main/classes/general/csv_user_import.php |
<?php
/**
* Bitrix Framework
* @package bitrix
* @subpackage main
* @copyright 2001-2013 Bitrix
*/
IncludeModuleLangFile(__FILE__);
class CSVUserImport
{
var $csv;
var $arHeader = false;
var $isErrorOccured = false;
var $errorMessage = "";
var $ignoreDuplicate = false;
var $userGroups = false;
var $callback = null;
var $defaultEmail = false;
var $imageFilePath = null;
var $externalAuthID = null;
var $attachIBlockID = 0;
var $userPropertyName = "UF_DEPARTMENT";
var $arSectionCache = Array();
var $isUserPropertyCreate = false;
public function __construct($csvFilePath, $delimiter)
{
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/csv_data.php");
$this->csv = new CCSVData($fields_type = "R");
$this->csv->LoadFile($csvFilePath);
$this->csv->MoveFirst();
$this->csv->SetDelimiter($delimiter);
$this->csv->SetFirstHeader(false);
if (!$this->arHeader = $this->csv->Fetch())
{
$this->isErrorOccured = true;
$this->errorMessage = GetMessage("CSV_IMPORT_HEADER_NOT_FOUND");
return;
}
foreach($this->arHeader as $key => $val)
$this->arHeader[$key] = strtoupper($val);
if (!$this->CheckRequiredFields())
{
$this->isErrorOccured = true;
return;
}
}
function CheckRequiredFields()
{
if ($this->isErrorOccured || !is_array($this->arHeader) || count($this->arHeader) <= 1)
{
$this->errorMessage = GetMessage("CSV_IMPORT_DELIMETER_NOT_FOUND");
return false;
}
$success = array_search("NAME", $this->arHeader);
if ($success === false || $success === null)
{
$this->errorMessage = GetMessage("CSV_IMPORT_NAME_NOT_FOUND");
return false;
}
$success = array_search("LAST_NAME", $this->arHeader);
if ($success === false || $success === null)
{
$this->errorMessage = GetMessage("CSV_IMPORT_LAST_NAME_NOT_FOUND");
return false;
}
return true;
}
function AttachUsersToIBlock($iblockID)
{
$iblockID = intval($iblockID);
if (CModule::IncludeModule("iblock") && $iblockID > 0)
{
$dbIblock = CIBlock::GetByID($iblockID);
if ($dbIblock->Fetch())
$this->attachIBlockID = $iblockID;
}
}
function SetUserPropertyName($userPropertyName)
{
$userPropertyName = trim($userPropertyName);
if (strlen($userPropertyName) > 0)
$this->userPropertyName = $userPropertyName;
}
function GenerateUserPassword($pass_len=10)
{
static $allchars = "abcdefghijklnmopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ0123456789";
$n = 61;
$string = "";
for ($i = 0; $i < $pass_len; $i++)
$string .= $allchars[mt_rand(0, $n)];
return $string;
}
function IsErrorOccured()
{
return $this->isErrorOccured;
}
function SetExternalAuthID($externalAuthID)
{
if (strlen($externalAuthID) > 0)
$this->externalAuthID = $externalAuthID;
}
function GetErrorMessage()
{
return $this->errorMessage;
}
function IgnoreDuplicate($ignore = true)
{
$this->ignoreDuplicate = (bool)$ignore;
}
function SetCallback($functionName)
{
if (is_callable($functionName))
$this->callback = $functionName;
}
function &GetCsvObject()
{
return $this->csv;
}
function SetDefaultEmail($email)
{
if (check_email($email))
$this->defaultEmail = $email;
}
function GetDefaultEmail()
{
if ($this->defaultEmail !== false)
return $this->defaultEmail;
return COption::GetOptionString("main", "email_from", "admin@".$_SERVER["SERVER_NAME"]);
}
function SetUserGroups($arGroups)
{
if (!is_array($arGroups))
return;
foreach ($arGroups as $groupID)
{
$groupID = intval($groupID);
$rsGroup = CGroup::GetByID($groupID);
if (!$rsGroup->Fetch())
continue;
if (!is_array($this->userGroups))
$this->userGroups = Array();
$this->userGroups[] = $groupID;
}
}
function SetImageFilePath($relativePath)
{
$relativePath = Rel2Abs("/", $relativePath);
if (is_dir($_SERVER["DOCUMENT_ROOT"].$relativePath))
$this->imageFilePath = rtrim($_SERVER["DOCUMENT_ROOT"].$relativePath, "/");
}
function __CreateUserProperty()
{
if ($this->attachIBlockID < 1)
return false;
$success = true;
$dbRes = CUserTypeEntity::GetList(Array(), Array("ENTITY_ID" => "USER", "FIELD_NAME" => $this->userPropertyName));
if (!$dbRes->Fetch())
{
$arLabelNames = Array();
$rsLanguage = CLanguage::GetList($by, $order, array());
while($arLanguage = $rsLanguage->Fetch())
{
IncludeModuleLangFile($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/classes/general/csv_user_import_labels.php", $arLanguage["LID"]);
$arLabelNames[$arLanguage["LID"]] = GetMessage("DEPARTMENT_USER_PROPERTY_NAME");
}
$arFields = Array(
'ENTITY_ID' => 'USER',
'FIELD_NAME' => $this->userPropertyName,
'USER_TYPE_ID' => 'iblock_section',
'XML_ID' => '',
'SORT' => 100,
'MULTIPLE' => 'Y',
'MANDATORY' => 'N',
'SHOW_FILTER' => 'I',
'SHOW_IN_LIST' => 'Y',
'EDIT_IN_LIST' => 'Y',
'IS_SEARCHABLE' => 'Y',
'SETTINGS' => array(
'DISPLAY' => 'LIST',
'LIST_HEIGHT' => '8',
'IBLOCK_ID' => $this->attachIBlockID,
),
"EDIT_FORM_LABEL" => $arLabelNames,
"LIST_COLUMN_LABEL" => $arLabelNames,
"LIST_FILTER_LABEL" => $arLabelNames,
);
$userType = new CUserTypeEntity();
$success = (bool)$userType->Add($arFields);
}
return $success;
}
function __GetIBlockSectionID(&$arFields)
{
$sectionID = 0;
$i = 0;
while(true)
{
$i++;
$csvSectionCode = "IBLOCK_SECTION_NAME_".$i;
if (!array_key_exists($csvSectionCode, $arFields))
break;
$sectionName = trim($arFields[$csvSectionCode]);
if (strlen($sectionName) < 1)
break;
$cacheID = md5($csvSectionCode."_".$sectionName."_".$sectionID);
if (array_key_exists($cacheID, $this->arSectionCache))
{
$sectionID = $this->arSectionCache[$cacheID];
continue;
}
$dbSection = CIBlockSection::GetList(Array(), Array("IBLOCK_ID" => $this->attachIBlockID, "NAME" => $sectionName, "SECTION_ID" => $sectionID));
if ($arGroup = $dbSection->Fetch())
{
$sectionID = $arGroup["ID"];
$this->arSectionCache[$cacheID] = $sectionID;
continue;
}
$iblockSection = new CIBlockSection;
$arSectionFields = Array(
"ACTIVE" => "Y",
"IBLOCK_SECTION_ID" => $sectionID,
"IBLOCK_ID" => $this->attachIBlockID,
"NAME" => $sectionName,
);
$sectionID = (int)$iblockSection->Add($arSectionFields);
if ($sectionID > 1)
$this->arSectionCache[$cacheID] = $sectionID;
else
return 0;
}
return $sectionID;
}
function ImportUser()
{
if ($this->isErrorOccured)
return false;
$this->errorMessage = "";
$defaultEmail = $this->GetDefaultEmail();
if (!$arUser = $this->csv->FetchDelimiter())
return false;
$arFields = Array();
foreach($this->arHeader as $index => $key)
if(($f = trim($arUser[$index])) <> '')
$arFields[$key] = $f;
if (!array_key_exists("NAME", $arFields) || strlen($arFields["NAME"]) < 1)
{
$this->errorMessage = GetMessage("CSV_IMPORT_NO_NAME")." (".implode(", ", $arFields).").<br>";
return true;
}
if (!array_key_exists("LAST_NAME", $arFields) || strlen($arFields["LAST_NAME"]) < 1)
{
$this->errorMessage = GetMessage("CSV_IMPORT_NO_LASTNAME")." (".implode(", ", $arFields).").<br>";
return true;
}
if (!array_key_exists("PASSWORD", $arFields) || strlen($arFields["PASSWORD"]) < 1)
$arFields["PASSWORD"] = $this->GenerateUserPassword(6);
$arFields["CONFIRM_PASSWORD"] = $arFields["PASSWORD"];
if (!array_key_exists("EMAIL", $arFields) || strlen($arFields["EMAIL"]) < 3 || !check_email($arFields["EMAIL"]))
$arFields["EMAIL"] = $defaultEmail;
if (!array_key_exists("LOGIN", $arFields))
$arFields["LOGIN"] = ToLower($arFields["NAME"]." ".$arFields["LAST_NAME"]);
if (array_key_exists("PERSONAL_BIRTHDAY", $arFields) && (strlen($arFields["PERSONAL_BIRTHDAY"]) < 2 || !CheckDateTime($arFields["PERSONAL_BIRTHDAY"])))
unset($arFields["PERSONAL_BIRTHDAY"]);
if (array_key_exists("DATE_REGISTER", $arFields) && (strlen($arFields["DATE_REGISTER"]) < 2 || !CheckDateTime($arFields["DATE_REGISTER"])))
unset($arFields["DATE_REGISTER"]);
if ($this->externalAuthID !== null && !array_key_exists("EXTERNAL_AUTH_ID", $arFields))
$arFields["EXTERNAL_AUTH_ID"] = $this->externalAuthID;
if (!array_key_exists("XML_ID", $arFields))
$arFields["XML_ID"] = md5(uniqid(rand(), true));
if(!array_key_exists("CHECKWORD", $arFields) || strlen($arFields["CHECKWORD"]) <= 0)
$arFields["CHECKWORD"] = md5(CMain::GetServerUniqID().uniqid());
if ($this->imageFilePath !== null)
{
if (array_key_exists("PERSONAL_PHOTO", $arFields) && strlen($arFields["PERSONAL_PHOTO"]) > 0)
{
$arFile = CFile::MakeFileArray($this->imageFilePath."/".$arFields["PERSONAL_PHOTO"]);
$arFile["MODULE_ID"] = "main";
$arFields["PERSONAL_PHOTO"] = $arFile;
}
if (array_key_exists("WORK_LOGO", $arFields) && strlen($arFields["WORK_LOGO"]) > 0)
{
$arFile = CFile::MakeFileArray($this->imageFilePath."/".$arFields["WORK_LOGO"]);
$arFile["MODULE_ID"] = "main";
$arFields["WORK_LOGO"] = $arFile;
}
}
else
{
unset($arFields["PERSONAL_PHOTO"]);
unset($arFields["WORK_LOGO"]);
}
$arFields["GROUP_ID"] = $this->userGroups;
$user = new CUser;
$userID = (int)$user->Add($arFields);
if($userID <= 0)
{
if($user->LAST_ERROR <> '')
$this->errorMessage = $arFields["NAME"]." ".$arFields["LAST_NAME"].": ".$user->LAST_ERROR;
}
if ($userID <= 0 && $this->ignoreDuplicate === false)
{
$postFix = 2;
$login = $arFields["LOGIN"];
do
{
$rsUser = CUser::GetByLogin($arFields["LOGIN"]);
if (!$rsUser->Fetch())
break;
$arFields["LOGIN"] = $login.$postFix;
$userID = (int)$user->Add($arFields);
if ($userID > 1)
break;
$postFix++;
} while(true);
}
if ($userID > 0)
{
if ($this->attachIBlockID > 0)
{
$iblockSectionID = $this->__GetIBlockSectionID($arFields);
if ($iblockSectionID > 0)
{
if (!$this->isUserPropertyCreate)
$this->isUserPropertyCreate = $this->__CreateUserProperty();
$arUpdate = Array();
$arUpdate[$this->userPropertyName] = Array($iblockSectionID);
$user->Update($userID, $arUpdate);
}
}
if ($this->callback !== null)
call_user_func_array($this->callback, Array(&$arFields, &$userID));
}
return true;
}
}