• Модуль: lists
  • Путь к файлу: ~/bitrix/modules/lists/lib/update/ecrmpropertyupdate.php
  • Класс: BitrixListsUpdateEcrmPropertyUpdate
  • Вызов: EcrmPropertyUpdate::execute
public function execute(array &$result)
{
	if(!Loader::includeModule("lists"))
		return false;

	$className = get_class($this);
	$option = Option::get("lists", $className, 0);
	$result["steps"] = $option;

	$limit = 20;
	$result["steps"] = isset($result["steps"]) ? $result["steps"] : 0;

	$queryObject = PropertyTable::getList(array(
		"select" => array("ID", "IBLOCK_ID", "USER_TYPE_SETTINGS"),
		"filter" => array("=USER_TYPE" => "ECrm")
	));
	$listIblockId = array();
	$listPropertyId = array();
	while($property = $queryObject->fetch())
	{
		if(is_string($property["USER_TYPE_SETTINGS"]) && CheckSerializedData($property["USER_TYPE_SETTINGS"]))
		{
			$property["USER_TYPE_SETTINGS"] = unserialize($property["USER_TYPE_SETTINGS"]);
		}
		if(is_array($property["USER_TYPE_SETTINGS"]))
		{
			if(array_key_exists("VISIBLE", $property["USER_TYPE_SETTINGS"]))
				unset($property["USER_TYPE_SETTINGS"]["VISIBLE"]);
			$tmpArray = array_filter($property["USER_TYPE_SETTINGS"], function($mark) { return $mark == "Y"; });
			if(count($tmpArray) == 1)
			{
				$listIblockId[] = intval($property["IBLOCK_ID"]);
				$listPropertyId[$property["IBLOCK_ID"]][] = intval($property["ID"]);
			}
		}
	}

	$connection = Application::getInstance()->getConnection();
	$listIblockIdS = implode(",", $listIblockId);
	if(empty($listIblockIdS))
	{
		return false;
	}

	$sqlString = "SELECT ID, IBLOCK_ID FROM b_iblock_element WHERE IBLOCK_ID IN (".$listIblockIdS
		.") ORDER BY ID ASC LIMIT ".$limit." OFFSET ".$result["steps"];
	$queryObject = $connection->query($sqlString);
	$listElement = $queryObject->fetchAll();
	$selectedRowsCount = $queryObject->getSelectedRowsCount();
	$listElementData = array();
	foreach($listElement as $element)
	{
		$listElementData[$element["IBLOCK_ID"]][] = $element["ID"];
	}

	foreach($listElementData as $iblockId => $listElementId)
	{
		$queryObject = CIblockElement::getPropertyValues(
			$iblockId, array("ID" => $listElementId), false, array("ID" => $listPropertyId[$iblockId]));
		while($propertyValues = $queryObject->fetch())
		{

			foreach($propertyValues as $propertyId => $propertyValue)
			{
				if($propertyId == "IBLOCK_ELEMENT_ID" || empty($propertyValue))
					continue;

				$isDamaged = false;
				if(is_array($propertyValue))
				{
					$listPropertyValues = array();
					foreach ($propertyValue as $value)
					{
						if(!intval($value))
						{
							$explode = explode('_', $value);
							$listPropertyValues[] = intval($explode[1]);
							$isDamaged = true;
						}
					}
					$propertyValue = $listPropertyValues;
				}
				else
				{
					if(!intval($propertyValue))
					{
						$explode = explode('_', $propertyValue);
						$propertyValue = intval($explode[1]);
						$isDamaged = true;
					}
				}
				if($isDamaged && $propertyId)
				{
					CIBlockElement::setPropertyValues(
						$propertyValues["IBLOCK_ELEMENT_ID"], $iblockId, $propertyValue, $propertyId);
				}
			}
		}
	}

	if($selectedRowsCount < $limit)
	{
		Option::delete("lists", array("name" => $className));
		return false;
	}
	else
	{
		$result["steps"] = $result["steps"] + $selectedRowsCount;
		$option = $result["steps"];
		Option::set("lists", $className, $option);
		return true;
	}
}