- Модуль: 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;
}
}