function _get_mixed_list($section_id, $arParams = array(), $element_id = 0)
{
list($contextType, $contextEntityId) = $this->getContextData();
if($section_id)
{
$sectionData = $this->getSectionDataForLinkAnalyze($section_id);
if(CWebDavSymlinkHelper::isLink($contextType, $contextEntityId, $sectionData))
{
$parentSectionData = CWebDavSymlinkHelper::getLinkData($contextType, $contextEntityId, $sectionData);
if($parentSectionData)
{
$linkWebdav = new self($parentSectionData[self::UF_LINK_IBLOCK_ID], $this->base_url . $this->_path, array(
'ROOT_SECTION_ID' => $parentSectionData[self::UF_LINK_SECTION_ID],
'symlinkMode' => true,
'symlinkSectionData' => $parentSectionData,
'symlinkRealRootSectionData' => $this->arRootSection,
));
return $linkWebdav->_get_mixed_list($section_id, $arParams, $element_id);
}
}
}
else
{
if(CWebDavSymlinkHelper::isLinkElement($contextType, $contextEntityId, $element_id))
{
$parentSectionData = CWebDavSymlinkHelper::getLinkDataOfElement($contextType, $contextEntityId, $element_id);
if($parentSectionData)
{
$linkWebdav = new self($parentSectionData[self::UF_LINK_IBLOCK_ID], $this->base_url . $this->_path, array(
'ROOT_SECTION_ID' => $parentSectionData[self::UF_LINK_SECTION_ID],
'symlinkMode' => true,
'symlinkSectionData' => $parentSectionData,
'symlinkRealRootSectionData' => $this->arRootSection,
));
return $linkWebdav->_get_mixed_list($section_id, $arParams, $element_id);
}
}
}
global $by, $order;
InitSorting();
if (empty($by))
{
$by = "NAME"; $order = "ASC";
}
$by = mb_strtoupper($by);
$order = mb_strtoupper($order);
$section_id = ($section_id === null ? null : intval($section_id));
$element_id = intval($element_id);
$arParams = (is_array($arParams) ? $arParams : array());
$arParams["COLUMNS"] = (is_array($arParams["COLUMNS"]) ? $arParams["COLUMNS"] : array());
$arFilter = array(
"IBLOCK_ID" => $this->IBLOCK_ID,
"IBLOCK_ACTIVE" => "Y",
"CHECK_PERMISSIONS" => "Y",
"MIN_PERMISSION" => "R",
"SHOW_NEW" => "Y");
if ($section_id !== null)
$arFilter["SECTION_ID"] = $section_id;
$perms = $this->permission;
if (
$this->e_rights
&& !$GLOBALS['USER']->CanDoOperation('webdav_change_settings')
)
{
if ($element_id > 0)
{
$arParentPerms = $this->GetPermissions('ELEMENT', (int) $element_id, $this->IBLOCK_ID);
}
else
{
$arParentPerms = $this->GetPermissions(
'SECTION',
(
($section_id !== null)
? $section_id
: (
($this->arRootSection)
? $this->arRootSection
: 0
)
),
$this->IBLOCK_ID
);
}
if (is_array($arParentPerms))
{
if (isset($arParentPerms['element_rights_edit']))
$perms = 'X';
elseif (isset($arParentPerms['element_edit_any_wf_status']))
$perms = 'W';
elseif (isset($arParentPerms['element_edit']))
$perms = 'U';
elseif (isset($arParentPerms['element_read']))
$perms = 'R';
else
$perms = 'A';
}
}
if ($perms < "U")
{
$arFilter["ACTIVE"] = "Y";
$arFilter["GLOBAL_ACTIVE"] = "Y";
$arFilter["SHOW_HISTORY"] = "N";
$arFilter["SHOW_NEW"] = "N";
$arParams["COLUMNS"] = array_diff($arParams["COLUMNS"], array("ACTIVE", "GLOBAL_ACTIVE", "SORT", "CODE", "EXTERNAL_ID", "DATE_ACTIVE_FROM", "DATE_ACTIVE_TO"));
}
if ($perms < "W" && $this->workflow == "bizproc")
{
$arFilter["SHOW_BP_NEW"] = array(
"GROUPS" => $this->USER["GROUPS"],
"MODULE_ID" => $this->wfParams["DOCUMENT_TYPE"][0],
"ENTITY" => $this->wfParams["DOCUMENT_TYPE"][1],
"PERMISSION" => "read",
"USER_ID" => $GLOBALS["USER"]->GetID());
}
if ($element_id > 0 && $arParams["SHOW_VERSIONS"] == "Y")
{
$arFilter["SHOW_HISTORY"] = "Y";
$arFilter["WF_PARENT_ELEMENT_ID"] = $element_id;
if ($perms >= "U" && $perms < "W")
$arFilter["CHECK_BP_PERMISSIONS"] = $arFilter["SHOW_BP_NEW"];
}
elseif ($element_id > 0)
{
$arFilter["ID"] = $element_id;
}
if ($this->arRootSection && ($element_id <= 0))
{
if ($arFilter["SECTION_ID"] === null)
$arFilter["SECTION_ID"] = $this->arRootSection["ID"];
if (sizeof($arParams['FILTER'])>0)
$arFilter["INCLUDE_SUBSECTIONS"] = "Y";
$arFilter["RIGHT_MARGIN"] = $this->arRootSection["RIGHT_MARGIN"];
$arFilter["LEFT_MARGIN"] = $this->arRootSection["LEFT_MARGIN"];
}
if ($arFilter["SECTION_ID"] === null)
unset($arFilter["SECTION_ID"]);
if (isset($arParams["FILTER"]) && sizeof($arParams["FILTER"])>0)
{
if (isset($arParams["FILTER"]["timestamp_2"]) && $arParams["FILTER"]["timestamp_2"] <> '' && $arParams["FILTER"]["timestamp_datesel"]!="before")
$arParams["FILTER"]["timestamp_2"] .= " 23:59:59";
$arFilter = array_merge($arFilter, $arParams["FILTER"]);
}
if (isset($arFilter["NAME"]) && isset($arFilter["DESCRIPTION"]))
{
$arFilter[] = array("LOGIC" => "OR", "NAME"=>$arFilter["NAME"], "DESCRIPTION"=>$arFilter["DESCRIPTION"]);
unset($arFilter["NAME"]);
unset($arFilter["DESCRIPTION"]);
}
$arSelectedFields = $arParams["COLUMNS"];
if(in_array("LOCKED_USER_NAME", $arSelectedFields))
$arSelectedFields[] = "WF_LOCKED_BY";
if(in_array("USER_NAME", $arSelectedFields))
$arSelectedFields[] = "MODIFIED_BY";
if(in_array("CREATED_USER_NAME", $arSelectedFields))
$arSelectedFields[] = "CREATED_BY";
if(in_array("DETAIL_TEXT", $arSelectedFields))
$arSelectedFields[] = "DETAIL_TEXT_TYPE";
$arSelectedFields = array_merge($arSelectedFields, array(
"ACTIVE",
"CODE",
"CREATED_BY",
"DATE_CREATE",
"DATE_CREATE_UNIX",
"DESCRIPTION",
"DETAIL_PAGE_URL",
"EXTERNAL_ID",
"IBLOCK_ID",
"IBLOCK_CODE",
"IBLOCK_SECTION_ID",
"ID",
"LANG_DIR",
"XML_ID",
"LID",
"LOCKED_USER_NAME",
"LOCK_STATUS",
"MODIFIED_BY",
"NAME",
"PREVIEW_TEXT",
"PREVIEW_TEXT_TYPE",
//"PROPERTY_FORUM_MESSAGE_CNT",
"PROPERTY_FORUM_TOPIC_ID",
"PROPERTY_".$this->file_prop,
"PROPERTY_WEBDAV_INFO",
"PROPERTY_WEBDAV_SIZE",
"SITE_ID",
"TAGS",
"TIMESTAMP_X",
"TIMESTAMP_X_UNIX",
"WF_DATE_LOCK",
"WF_NEW",
"WF_PARENT_ELEMENT_ID",
"WF_STATUS_ID",
"WF_LOCKED_BY"
));
if ($this->workflow == "bizproc")
{
$arSelectedFields[] = "BP_PUBLISHED";
$arSelectedFields[] = "BIZPROC";
}
elseif ($this->workflow == 'workflow')
{
$arSelectedFields[] = "WF_COMMENTS";
}
$arSelectedFields = array_unique($arSelectedFields);
$arSelectedFields = array_filter($arSelectedFields);
$this->wfParams["selected_fields"] = $arSelectedFields;
if ($element_id > 0)
{
$arElementResult = array();
$arFilter["SHOW_HISTORY"] = "Y";
$db_res = CIBlockElement::GetList(array(), $arFilter, false, false, $arSelectedFields);
if ($db_res)
{
while ($arElement = $db_res->Fetch())
{
$arElement["TYPE"] = "E";
$arElement["FILE"] = CFile::GetFileArray($arElement["PROPERTY_" . $this->file_prop . "_VALUE"]);
$arElement["FILE"] = (is_array($arElement["FILE"]) ? $arElement["FILE"] : array("FILE_SIZE" => 0, "CONTENT_TYPE" => "text/plain", "MTIME" => 0));
if ($this->e_rights)
{
$arElement['E_RIGHTS'] = $this->GetPermission('ELEMENT', $arElement['ID']);
}
$arElementResult[] = $arElement;
}
}
$db_res = new CDBResult;
$db_res->InitFromArray($arElementResult);
}
else
{
$arOrder = array($by => $order);
$arResult = array();
if (!isset($arFilter["ID"]))
{
$arSectionFilter = array (
"IBLOCK_ID" => $arFilter["IBLOCK_ID"],
"?NAME" => $arFilter["NAME"],
"SECTION_ID" => $arFilter["SECTION_ID"],
">=ID" => $arFilter["ID_1"],
"<=ID" => $arFilter["ID_2"],
">=TIMESTAMP_X" => $arFilter["TIMESTAMP_X_1"],
"<=TIMESTAMP_X" => $arFilter["TIMESTAMP_X_2"],
"MODIFIED_BY" => $arFilter["MODIFIED_USER_ID"]? $arFilter["MODIFIED_USER_ID"]: $arFilter["MODIFIED_BY"],
">=DATE_CREATE" => $arFilter["DATE_CREATE_1"],
"<=DATE_CREATE" => $arFilter["DATE_CREATE_2"],
"CREATED_BY" => $arFilter["CREATED_USER_ID"]? $arFilter["CREATED_USER_ID"]: $arFilter["CREATED_BY"],
"ACTIVE" => $arFilter["ACTIVE"],
"CHECK_PERMISSIONS" => "Y",
);
if (isset($arFilter["content"]))
$arSectionFilter["?NAME"] = $arFilter["content"];
$arSectionIDs = array();
$excludeDropped = $excludeOldDropped = $excludeTrash = $excludeSectionMargin = array();
if(!empty($arParams['NON_OLD_DROPPED_SECTION']))
{
if($excludeId = $this->GetMetaID(self::OLD_DROPPED))
{
$excludeOldDropped = self::$_metaSectionData[$excludeId];
$excludeSectionMargin[] = array(
$excludeOldDropped['LEFT_MARGIN'],
$excludeOldDropped['RIGHT_MARGIN'],
);
}
}
if(!empty($arParams['NON_DROPPED_SECTION']))
{
if($excludeId = $this->GetMetaID(self::DROPPED, false))
{
$excludeDropped = self::$_metaSectionData[$excludeId];
$excludeSectionMargin[] = array(
$excludeDropped['LEFT_MARGIN'],
$excludeDropped['RIGHT_MARGIN'],
);
}
}
if(!empty($arParams['NON_TRASH_SECTION']))
{
if($excludeId = $this->GetMetaID(self::TRASH))
{
$excludeTrash = self::$_metaSectionData[$excludeId];
$excludeSectionMargin[] = array(
$excludeTrash['LEFT_MARGIN'],
$excludeTrash['RIGHT_MARGIN'],
);
}
}
$obSection = new CIBlockSection;
$rsSection = $obSection->GetList($arOrder, $arSectionFilter, false, array_merge($arSelectedFields, self::getUFNamesForSectionLink(), array('LEFT_MARGIN', 'RIGHT_MARGIN')));
while($arSection = $rsSection->Fetch())
{
if($excludeOldDropped && $arSection['LEFT_MARGIN'] >= $excludeOldDropped['LEFT_MARGIN'] && $arSection['RIGHT_MARGIN'] <= $excludeOldDropped['RIGHT_MARGIN'])
{
continue;
}
if($excludeTrash && $arSection['LEFT_MARGIN'] >= $excludeTrash['LEFT_MARGIN'] && $arSection['RIGHT_MARGIN'] <= $excludeTrash['RIGHT_MARGIN'])
{
continue;
}
if($excludeDropped && $arSection['LEFT_MARGIN'] >= $excludeDropped['LEFT_MARGIN'] && $arSection['RIGHT_MARGIN'] <= $excludeDropped['RIGHT_MARGIN'])
{
continue;
}
$arSection["TYPE"] = "S";
$arResult[] = $arSection;
if ($this->e_rights)
{
$arSectionIDs[] = $arSection['ID'];
}
}
if ($this->e_rights)
{
$arSectionRights = $this->GetPermissions('SECTION', $arSectionIDs, $this->IBLOCK_ID);
$arSectionRules = $this->GetPermissionRules('SECTION', $arSectionIDs);
foreach($arResult as $id => &$arSection)
{
if ( // if "shared folder" access is restricted
($arSection['XML_ID'] == 'SHARED_FOLDER') &&
(! isset($arSectionRights[$arSection['ID']]['element_read']))
)
{
unset($arResult[$id]);
continue;
}
if (isset($arSectionRights[$arSection['ID']]))
$arSection['E_RIGHTS'] = $arSectionRights[$arSection['ID']];
if (isset($arSectionRules[$arSection['ID']]) && $this->IsShared($arSectionRules[$arSection['ID']]))
{
$arSection['SHARED'] = true;
}
}
unset($arSection);
}
}
$arElementFilter = array (
"IBLOCK_ID" => $arFilter["IBLOCK_ID"],
"?NAME" => $arFilter["NAME"],
"SECTION_ID" => $arFilter["SECTION_ID"],
"ID" => $arFilter["ID"],
">=ID" => $arFilter["ID_1"],
"<=ID" => $arFilter["ID_2"],
">=TIMESTAMP_X" => $arFilter["TIMESTAMP_X_1"],
"<=TIMESTAMP_X" => $arFilter["TIMESTAMP_X_2"],
"EXTERNAL_ID" => $arFilter["EXTERNAL_ID"],
"MODIFIED_USER_ID" => $arFilter["MODIFIED_USER_ID"],
"MODIFIED_BY" => $arFilter["MODIFIED_BY"],
">=DATE_CREATE" => $arFilter["DATE_CREATE_1"],
"<=DATE_CREATE" => $arFilter["DATE_CREATE_2"],
"CREATED_BY" => $arFilter["CREATED_BY"],
"CREATED_USER_ID" => $arFilter["CREATED_USER_ID"],
">=DATE_ACTIVE_FROM"=> $arFilter["DATE_ACTIVE_FROM_1"],
"<=DATE_ACTIVE_FROM"=> $arFilter["DATE_ACTIVE_FROM_2"],
">=DATE_ACTIVE_TO" => $arFilter["DATE_ACTIVE_TO_1"],
"<=DATE_ACTIVE_TO" => $arFilter["DATE_ACTIVE_TO_2"],
"ACTIVE" => $arFilter["ACTIVE"],
"?SEARCHABLE_CONTENT"=> $arFilter["DESCRIPTION"],
"?TAGS" => $arFilter["?TAGS"],
"WF_STATUS" => $arFilter["WF_STATUS"],
"WF_LOCK_STATUS" => $arFilter["WF_LOCK_STATUS"],
"CHECK_PERMISSIONS" => "Y",
"MIN_PERMISSION" => "R",
"SHOW_NEW" => ($arFilter["SHOW_NEW"] !== "N"? "Y": "N"),
"SHOW_HISTORY" => ($arFilter["SHOW_HISTORY"] !== "Y"? "N": "Y"),
"SHOW_BP_NEW" => $arFilter["SHOW_BP_NEW"]
);
if ($arElementFilter["SHOW_HISTORY"] == "Y") $arElementFilter["SHOW_NEW"] = "N";
$fltSizeFrom = isset($arParams["FILTER"]["FILE_SIZE_1"]) ? $arParams["FILTER"]["FILE_SIZE_1"] : null;
$fltSizeTo = isset($arParams["FILTER"]["FILE_SIZE_2"]) ? $arParams["FILTER"]["FILE_SIZE_2"] : null;
if (($fltSizeFrom !== null || $fltSizeTo !== null) && isset($arParams["FILTER"]["FILE_SIZE_multiply"]) && in_array($arParams["FILTER"]["FILE_SIZE_multiply"], array("b","kb","mb","gb")))
{
$multiply = 1;
if ($arParams["FILTER"]["FILE_SIZE_multiply"] === "kb")
$multiply = 1024;
elseif ($arParams["FILTER"]["FILE_SIZE_multiply"] === "mb")
$multiply = 1024*1024;
elseif ($arParams["FILTER"]["FILE_SIZE_multiply"] === "gb")
$multiply = 1024*1024*1024;
if ($fltSizeFrom !== null)
{
$fltSizeFrom = $fltSizeFrom * $multiply;
$arElementFilter[">=PROPERTY_WEBDAV_SIZE"] = $fltSizeFrom;
}
if ($fltSizeTo !== null)
{
$fltSizeTo = $fltSizeTo * $multiply;
$arElementFilter["<=PROPERTY_WEBDAV_SIZE"] = $fltSizeTo;
}
}
if (isset($arFilter["timestamp_1"]) && isset($arFilter["timestamp_2"]))
{
$arElementFilter[] = array("LOGIC" => "OR",
array("LOGIC" => "AND",
">=DATE_CREATE"=>$arFilter["timestamp_1"],
"<=DATE_CREATE"=>$arFilter["timestamp_2"]),
array("LOGIC" => "AND",
">=TIMESTAMP_X"=>$arFilter["timestamp_1"],
"<=TIMESTAMP_X"=>$arFilter["timestamp_2"]),
);
unset($arFilter["timestamp_1"]);
unset($arFilter["timestamp_2"]);
}
elseif (isset($arFilter["timestamp_1"]))
{
$arElementFilter[] = array("LOGIC" => "OR", ">=DATE_CREATE"=>$arFilter["timestamp_1"], ">=TIMESTAMP_X"=>$arFilter["timestamp_1"]);
unset($arFilter["timestamp_2"]);
}
elseif (isset($arFilter["timestamp_2"]))
{
$arElementFilter[] = array("LOGIC" => "OR", "<=DATE_CREATE"=>$arFilter["timestamp_2"], "<=TIMESTAMP_X"=>$arFilter["timestamp_2"]);
unset($arFilter["timestamp_2"]);
}
if (isset($arFilter["user"]))
{
$arElementFilter[] = array("LOGIC" => "OR", "MODIFIED_BY"=>$arFilter["user"], "CREATED_BY"=>$arFilter["user"]);
unset($arFilter["user"]);
}
if($arFilter["SECTION_ID"] == '')
unset($arElementFilter["SECTION_ID"]);
if(!is_array($arSelectedFields))
{
$arSelectedFields = Array("*");
}
elseif(!in_array("PROPERTY_WEBDAV_SIZE", $arSelectedFields))
{
$arSelectedFields[] = "PROPERTY_WEBDAV_SIZE";
}
if(isset($arFilter["INCLUDE_SUBSECTIONS"]))
$arElementFilter["INCLUDE_SUBSECTIONS"] = $arFilter["INCLUDE_SUBSECTIONS"];
if(isset($arFilter["CHECK_BP_PERMISSIONS"]))
$arElementFilter["CHECK_BP_PERMISSIONS"] = $arFilter["CHECK_BP_PERMISSIONS"];
if(!empty($excludeSectionMargin))
{
$arElementFilter['!SUBSECTION'] = $excludeSectionMargin;
}
$arNavParams = isset($arParams["NAV_PARAMS"]) ? $arParams["NAV_PARAMS"] : false;
$arElementIDs = array();
$arElementResult = array();
$obElement = new CIBlockElement;
$rsElement = $obElement->GetList($arOrder, $arElementFilter, false, $arNavParams, $arSelectedFields);
while($arElement = $rsElement->Fetch())
{
$arElement["TYPE"] = "E";
$arElement["FILE"]["FILE_SIZE"] = $this->GetFileSize($arElement); //$arElement['ID']
$arElementResult[] = $arElement;
if ($this->e_rights)
{
$arElementIDs[] = $arElement['ID'];
}
}
if ($this->e_rights)
{
$arElementRights = $this->GetPermissions('ELEMENT', $arElementIDs, $this->IBLOCK_ID);
$arElementRules = $this->GetPermissionRules('ELEMENT', $arElementIDs);
foreach($arElementResult as $id=>&$arElement)
{
if (isset($arElementRights[$arElement['ID']]))
$arElement['E_RIGHTS'] = $arElementRights[$arElement['ID']];
if (isset($arElementRules[$arElement['ID']]) && $this->IsShared($arElementRules[$arElement['ID']]))
$arElement['SHARED'] = true;
}
unset($arElement);
}
$arResult = array_merge($arResult, $arElementResult);
$db_res = new CDBResult;
$db_res->InitFromArray($arResult);
}
return $db_res;
}