• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/lib/update/filteroption.php
  • Класс: BitrixIblockUpdateis
  • Вызов: is::execute
public function execute(array &$option)
{
	$listFilter = Option::get(self::$moduleId, "listFilterToConvert", "");
	if ($listFilter !== "" )
		$listFilter = unserialize($listFilter);
	$listFilter = is_array($listFilter) ? $listFilter : array();
	if (empty($listFilter))
	{
		Option::delete(self::$moduleId, array("name" => "listFilterToConvert"));
		$GLOBALS["CACHE_MANAGER"]->cleanDir("user_option");
		return false;
	}

	$connection = Application::getInstance()->getConnection();
	$sqlHelper = $connection->getSqlHelper();

	foreach ($listFilter as $filterId => $filter)
	{
		$queryObject = $connection->query("SELECT * FROM `b_filters` WHERE `FILTER_ID` = '".$sqlHelper->forSql(
			$filterId)."' ORDER BY ID ASC LIMIT ".$this->limit." OFFSET ".$filter["offset"]);
		$selectedRowsCount = $queryObject->getSelectedRowsCount();
		while ($oldFilter = $queryObject->fetch())
		{
			$filters = array();
			$listNewPresetName = [];
			$oldFields = unserialize($oldFilter["FIELDS"]);
			if (is_array($oldFields))
			{
				list($newFields, $newRows) = $this->convertOldFieldsToNewFields(
					$oldFields, $filter["ratioFields"]);
				$presetId = "filter_".(time()+(int)$oldFilter["ID"]);
				$filters[$presetId] = array(
					"name" => $oldFilter["NAME"],
					"fields" => $newFields,
					"filter_rows" => implode(",", $newRows)
				);
				$listNewPresetName[$presetId] = $oldFilter["NAME"];
			}

			if (empty($filters))
			{
				continue;
			}

			$queryOptionCurrentFilter = $connection->query(
				"SELECT * FROM `b_user_option` WHERE 
				`CATEGORY` = 'main.ui.filter' AND 
				`USER_ID` = '".$sqlHelper->forSql($oldFilter["USER_ID"])."' AND 
				`NAME` = '".$sqlHelper->forSql($filter["tableId"])."'"
			);
			if ($optionCurrentFilter = $queryOptionCurrentFilter->fetch())
			{
				$optionCurrentFilterValue = unserialize($optionCurrentFilter["VALUE"]);
				if (is_array($optionCurrentFilterValue))
				{
					if (!empty($optionCurrentFilterValue["filters"]))
					{
						// This is a check whether presets exist with that name.
						foreach ($optionCurrentFilterValue["filters"] as $currentFilter)
						{
							$name = (!empty($currentFilter["name"]) ? $currentFilter["name"] : "");
							$listNewPresetName = array_filter($listNewPresetName, function($oldName) use ($name) {
								return ($oldName !== $name);
							});
						}

						$filters = array_intersect_key($filters, $listNewPresetName);

						$optionCurrentFilterValue["filters"] = array_merge(
							$optionCurrentFilterValue["filters"], $filters);
						$optionCurrentFilterValue["update_default_presets"] = true;

						$connection->query(
							"UPDATE `b_user_option` SET 
							`VALUE` = '" . $sqlHelper->forSql(serialize($optionCurrentFilterValue)) . "' WHERE 
							`ID` = '" . $sqlHelper->forSql($optionCurrentFilter["ID"]) . "'"
						);
					}
				}
			}
			else
			{
				$optionNewFilter = array();
				$optionNewFilter["filters"] = $filters;
				$optionNewFilter["update_default_presets"] = true;

				$connection->query(
					"INSERT INTO `b_user_option` 
					(`ID`, `USER_ID`, `CATEGORY`, `NAME`, `VALUE`, `COMMON`) VALUES 
					(NULL, '".$sqlHelper->forSql($oldFilter["USER_ID"])."', 'main.ui.filter', '".
					$sqlHelper->forSql($filter["tableId"])."', '".$sqlHelper->forSql(serialize($optionNewFilter)).
					"', '".$sqlHelper->forSql($oldFilter["COMMON"])."')"
				);
			}
		}

		if ($selectedRowsCount < $this->limit)
		{
			unset($listFilter[$filterId]);
		}
		else
		{
			$listFilter[$filterId]["offset"] = $listFilter[$filterId]["offset"] + $selectedRowsCount;
		}
	}

	$GLOBALS["CACHE_MANAGER"]->cleanDir("user_option");

	if (!empty($listFilter))
	{
		Option::set(self::$moduleId, "listFilterToConvert", serialize($listFilter));
		return true;
	}
	else
	{
		Option::delete(self::$moduleId, array("name" => "listFilterToConvert"));
		return false;
	}
}