• Модуль: sender
  • Путь к файлу: ~/bitrix/modules/sender/lib/contact.php
  • Класс: BitrixSenderContactTable
  • Вызов: ContactTable::addFromConnector
static function addFromConnector(ConnectorBase $connector, ?int $pageNumber = null, int $timeout = 0): array
{
	$startTime = getmicrotime();
	$withoutNav = empty($pageNumber);
	$result = false;
	$onlyOneLoop = false;
	$rowsInPage = 5;

	$countAll = 0;
	$countProcessed = 0;
	$countUpdated = 0;
	$countAdded = 0;
	$countError = 0;

	$dataDb = $connector->getResult();
	if($dataDb->resourceCDBResult)
	{
		$dataDb = $dataDb->resourceCDBResult;
	}
	elseif($dataDb->resource)
	{
		$dataDb = new CDBResult($dataDb->resource);
	}
	else
	{
		$dataDb = new CDBResult();
		$dataDb->initFromArray(array());
	}

	if(!is_subclass_of($dataDb, 'CDBResultMysql'))
	{
		$rowsInPage = 50;
		$onlyOneLoop = true;
	}

	while($timeout==0 || getmicrotime()-$startTime < $timeout)
	{
		if(!$withoutNav)
		{
			$dataDb->navStart($rowsInPage, false, $pageNumber);
			$countAll = $dataDb->selectedRowsCount();
		}

		$listId = null;
		while ($row = $dataDb->fetch())
		{
			if($withoutNav)
			{
				$countAll++;
			}

			$countProcessed++;

			if(!$listId)
			{
				$listId = ListTable::addIfNotExist(
					$connector->getModuleId() . '_' . $connector->getCode(),
					Loc::getMessage('CONTACT_PULL_LIST_PREFIX').$connector->getName()
				);
			}

			$id = null;
			$contactDb = ContactTable::getList(array(
				'select' => array('ID'),
				'filter' => array('EMAIL' => $row['EMAIL'])
			));
			if($contactRow = $contactDb->fetch())
			{
				$id = $contactRow['ID'];
				$countUpdated++;
			}
			else
			{
				$resultAdd = static::add(array(
					'NAME' => $row['NAME'],
					'EMAIL' => $row['EMAIL'],
					'USER_ID' => $row['USER_ID']
				));
				if ($resultAdd->isSuccess())
				{
					$id = $resultAdd->getId();
					$countAdded++;
				} else
				{
					$countError++;
				}
			}

			if($id)
				ContactListTable::addIfNotExist($id, $listId);

		}


		if($withoutNav)
		{
			$result = false;
			break;
		}

		if ($dataDb->NavPageCount <= $pageNumber)
		{
			$result = false;
			break;
		}
		else
		{
			$pageNumber++;
			$result = $pageNumber;
		}

		if($onlyOneLoop)
		{
			break;
		}
	}

	if($withoutNav)
	{
		$countProgress = $countAll;
	}
	else
	{
		$countProgress = ($pageNumber-1) * $dataDb->NavPageSize;
		if (!$result || $countProgress > $countAll) $countProgress = $countAll;
	}

	return array(
		'STATUS' => $result,
		'COUNT_ALL' => $countAll,
		'COUNT_PROGRESS' => $countProgress,
		'COUNT_PROCESSED' => $countProcessed,
		'COUNT_NEW' => $countAdded,
		'COUNT_ERROR' => $countError,
	);
}