• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/lib/update/adminfilteroption.php
  • Класс: BitrixMainUpdateAdminFilterOption
  • Вызов: AdminFilterOption::execute
public function execute(array &$option)
{
	$listFilter = Option::get(self::$moduleId, "listFilterToConvert", "");
	if ($listFilter !== "" )
		$listFilter = unserialize($listFilter, ['allowed_classes' => false]);
	$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"], ['allowed_classes' => false]);
			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"], ['allowed_classes' => false]);
				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;
	}
}