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