function MkPropertySelect($PR_ID, $db_prop, &$arIBlockLongProps, &$arIBlockConvProps, &$arJoinProps, &$arIBlockMultProps, &$arIBlockNumProps, $bWasGroup, $sGroupBy, &$sSelect, $bSort = false) { global $DB, $DBType; if ($bSort && $db_prop["PROPERTY_TYPE"] != "L") { return; } static $arJoinEFields = false; //define maximum alias length if ($DBType == "oracle" || $DBType == "mssql") { $mal = 29; } else { $mal = false; } $bSubQuery = isset($this) && is_object($this) && isset($this->subQueryProp); $arSelect = array(); //Joined elements if (is_array($PR_ID)) { if (!$arJoinEFields) { $arJoinEFields = array("ID" => "BE#i#.ID", "TIMESTAMP_X" => $DB->DateToCharFunction("BE#i#.TIMESTAMP_X"), "MODIFIED_BY" => "BE#i#.MODIFIED_BY", "DATE_CREATE" => $DB->DateToCharFunction("BE#i#.DATE_CREATE"), "CREATED_BY" => "BE#i#.CREATED_BY", "IBLOCK_ID" => "BE#i#.IBLOCK_ID", "ACTIVE" => "BE#i#.ACTIVE", "ACTIVE_FROM" => $DB->DateToCharFunction("BE#i#.ACTIVE_FROM"), "ACTIVE_TO" => $DB->DateToCharFunction("BE#i#.ACTIVE_TO"), "SORT" => "BE#i#.SORT", "NAME" => "BE#i#.NAME", "PREVIEW_PICTURE" => "BE#i#.PREVIEW_PICTURE", "PREVIEW_TEXT" => "BE#i#.PREVIEW_TEXT", "PREVIEW_TEXT_TYPE" => "BE#i#.PREVIEW_TEXT_TYPE", "DETAIL_PICTURE" => "BE#i#.DETAIL_PICTURE", "DETAIL_TEXT" => "BE#i#.DETAIL_TEXT", "DETAIL_TEXT_TYPE" => "BE#i#.DETAIL_TEXT_TYPE", "SHOW_COUNTER" => "BE#i#.SHOW_COUNTER", "SHOW_COUNTER_START" => $DB->DateToCharFunction("BE#i#.SHOW_COUNTER_START"), "CODE" => "BE#i#.CODE", "TAGS" => "BE#i#.TAGS", "XML_ID" => "BE#i#.XML_ID", "IBLOCK_SECTION_ID" => "BE#i#.IBLOCK_SECTION_ID", "IBLOCK_TYPE_ID" => "B#i#.IBLOCK_TYPE_ID", "IBLOCK_CODE" => "B#i#.CODE", "IBLOCK_NAME" => "B#i#.NAME", "IBLOCK_EXTERNAL_ID" => "B#i#.XML_ID", "DETAIL_PAGE_URL" => "\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(B#i#.DETAIL_PAGE_URL, '#ID#', BE#i#.ID)\n\t\t\t\t\t, '#ELEMENT_ID#', BE#i#.ID)\n\t\t\t\t\t, '#CODE#', " . $DB->IsNull("BE#i#.CODE", "''") . ")\n\t\t\t\t\t, '#ELEMENT_CODE#', " . $DB->IsNull("BE#i#.CODE", "''") . ")\n\t\t\t\t\t, '#EXTERNAL_ID#', " . $DB->IsNull("BE#i#.XML_ID", "''") . ")\n\t\t\t\t\t, '#IBLOCK_TYPE_ID#', B#i#.IBLOCK_TYPE_ID)\n\t\t\t\t\t, '#IBLOCK_ID#', BE#i#.IBLOCK_ID)\n\t\t\t\t\t, '#IBLOCK_CODE#', " . $DB->IsNull("B#i#.CODE", "''") . ")\n\t\t\t\t\t, '#IBLOCK_EXTERNAL_ID#', " . $DB->IsNull("B#i#.XML_ID", "''") . ")\n\t\t\t\t\t, '#SITE_DIR#', '" . $DB->ForSQL(SITE_DIR) . "')\n\t\t\t\t\t, '#SERVER_NAME#', '" . $DB->ForSQL(SITE_SERVER_NAME) . "')\n\t\t\t\t\t, '#SECTION_ID#', " . $DB->IsNull("BE#i#.IBLOCK_SECTION_ID", "''") . ")\n\t\t\t\t\t, '#SECTION_CODE#', " . $DB->IsNull("BS#i#.CODE", "''") . ")\n\t\t\t\t", "LIST_PAGE_URL" => "\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(\n\t\t\t\t\treplace(B#i#.LIST_PAGE_URL, '#IBLOCK_TYPE_ID#', B#i#.IBLOCK_TYPE_ID)\n\t\t\t\t\t, '#IBLOCK_ID#', BE#i#.IBLOCK_ID)\n\t\t\t\t\t, '#IBLOCK_CODE#', " . $DB->IsNull("B#i#.CODE", "''") . ")\n\t\t\t\t\t, '#IBLOCK_EXTERNAL_ID#', " . $DB->IsNull("B#i#.XML_ID", "''") . ")\n\t\t\t\t\t, '#SITE_DIR#', '" . $DB->ForSQL(SITE_DIR) . "')\n\t\t\t\t\t, '#SERVER_NAME#', '" . $DB->ForSQL(SITE_SERVER_NAME) . "')\n\t\t\t\t"); } //Joined Elements Fields if (array_key_exists($PR_ID[2], $arJoinEFields)) { if ($db_prop["VERSION"] == 2 && $db_prop["MULTIPLE"] == "N") { //Join properties table if needed if (!array_key_exists($db_prop["IBLOCK_ID"], $arJoinProps["FPS"])) { $arJoinProps["FPS"][$db_prop["IBLOCK_ID"]] = count($arJoinProps["FPS"]); } $iPropCnt = $arJoinProps["FPS"][$db_prop["IBLOCK_ID"]]; } else { //Join property metadata table if (!array_key_exists($db_prop["ID"], $arJoinProps["FP"])) { $arJoinProps["FP"][$db_prop["ID"]] = array("CNT" => count($arJoinProps["FP"]), "bFullJoin" => false); } //Join multiple values properties table if needed if (!array_key_exists($db_prop["ID"], $arJoinProps["FPV"])) { $arJoinProps["FPV"][$db_prop["ID"]] = array("CNT" => count($arJoinProps["FPV"]), "IBLOCK_ID" => $db_prop["IBLOCK_ID"], "MULTIPLE" => $db_prop["MULTIPLE"], "VERSION" => $db_prop["VERSION"], "ORIG_ID" => $db_prop["ORIG_ID"], "JOIN" => $arJoinProps["FP"][$db_prop["ID"]]["CNT"], "bFullJoin" => false); } $iPropCnt = $arJoinProps["FPV"][$db_prop["ID"]]["CNT"]; } //Then join elements if (!array_key_exists($db_prop["ID"], $arJoinProps["BE"])) { $arJoinProps["BE"][$db_prop["ID"]] = array("CNT" => count($arJoinProps["BE"]), "MULTIPLE" => $db_prop["MULTIPLE"], "VERSION" => $db_prop["VERSION"], "ORIG_ID" => $db_prop["ORIG_ID"], "JOIN" => $iPropCnt, "bJoinIBlock" => false, "bJoinSection" => false); } $iElCnt = $arJoinProps["BE"][$db_prop["ID"]]["CNT"]; //Check if b_iblock have to be joined also if ($PR_ID[2] == "LIST_PAGE_URL" || $PR_ID[2] == "IBLOCK_TYPE_ID" || $PR_ID[2] == "IBLOCK_CODE" || $PR_ID[2] == "IBLOCK_NAME" || $PR_ID[2] == "IBLOCK_EXTERNAL_ID") { $arJoinProps["BE"][$db_prop["ID"]]["bJoinIBlock"] = true; } //Check if b_iblock_section have to be joined also if ($PR_ID[2] == "DETAIL_PAGE_URL") { $arJoinProps["BE"][$db_prop["ID"]]["bJoinIBlock"] = true; $arJoinProps["BE"][$db_prop["ID"]]["bJoinSection"] = true; } $arSelect[str_replace("#i#", $iElCnt, $arJoinEFields[$PR_ID[2]])] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID[1] . "_" . $PR_ID[2], $arIBlockLongProps); } elseif (substr($PR_ID[2], 0, 9) == "PROPERTY_") { $jProp_ID = substr($PR_ID[2], 9); $db_jprop = CIBlockProperty::GetPropertyArray($jProp_ID, CIBlock::_MergeIBArrays($db_prop["LINK_IBLOCK_ID"])); if (is_array($db_jprop)) { if ($db_prop["VERSION"] == 2 && $db_prop["MULTIPLE"] == "N") { //Join properties table if needed if (!array_key_exists($db_prop["IBLOCK_ID"], $arJoinProps["FPS"])) { $arJoinProps["FPS"][$db_prop["IBLOCK_ID"]] = count($arJoinProps["FPS"]); } $iPropCnt = $arJoinProps["FPS"][$db_prop["IBLOCK_ID"]]; } else { //Join property metadata table if (!array_key_exists($db_prop["ID"], $arJoinProps["FP"])) { $arJoinProps["FP"][$db_prop["ID"]] = array("CNT" => count($arJoinProps["FP"]), "bFullJoin" => false); } //Join multiple values properties table if needed if (!array_key_exists($db_prop["ID"], $arJoinProps["FPV"])) { $arJoinProps["FPV"][$db_prop["ID"]] = array("CNT" => count($arJoinProps["FPV"]), "IBLOCK_ID" => $db_prop["IBLOCK_ID"], "MULTIPLE" => $db_prop["MULTIPLE"], "VERSION" => $db_prop["VERSION"], "JOIN" => $arJoinProps["FP"][$db_prop["ID"]]["CNT"], "bFullJoin" => false); } $iPropCnt = $arJoinProps["FPV"][$db_prop["ID"]]["CNT"]; } //Then join elements if (!array_key_exists($db_prop["ID"], $arJoinProps["BE"])) { $arJoinProps["BE"][$db_prop["ID"]] = array("CNT" => count($arJoinProps["BE"]), "MULTIPLE" => $db_prop["MULTIPLE"], "VERSION" => $db_prop["VERSION"], "ORIG_ID" => $db_prop["ORIG_ID"], "JOIN" => $iPropCnt, "bJoinIBlock" => false, "bJoinSection" => false); } $iElCnt = $arJoinProps["BE"][$db_prop["ID"]]["CNT"]; if ($db_jprop["USER_TYPE"] != "") { $arUserType = CIBlockProperty::GetUserType($db_jprop["USER_TYPE"]); if (array_key_exists("ConvertFromDB", $arUserType)) { $arIBlockConvProps["PROPERTY_" . $PR_ID[1] . "_" . $PR_ID[2] . "_VALUE"] = array("ConvertFromDB" => $arUserType["ConvertFromDB"], "PROPERTY" => $db_jprop); } } $comp_prop_id = $db_jprop["ID"] . "~" . $db_prop["ID"]; //Infoblock+ (property stored in separate table) if ($db_jprop["VERSION"] == 2) { //This is single value property if ($db_jprop["MULTIPLE"] == "N") { //For numbers we will need special processing in CIBlockResult::Fetch if ($db_jprop["PROPERTY_TYPE"] == "N") { $arIBlockNumProps["PROPERTY_" . $PR_ID[1] . "_" . $PR_ID[2] . "_VALUE"] = $db_prop; } //Enum single property if ($db_jprop["PROPERTY_TYPE"] == "L") { //Join properties table if needed if (!array_key_exists($db_jprop["IBLOCK_ID"], $arJoinProps["BE_FPS"])) { $arJoinProps["BE_FPS"][$db_jprop["IBLOCK_ID"]] = array("CNT" => count($arJoinProps["BE_FPS"]), "JOIN" => $iElCnt); } $ijPropCnt = $arJoinProps["BE_FPS"][$db_jprop["IBLOCK_ID"]]["CNT"]; //Then join list values table if (!array_key_exists($comp_prop_id, $arJoinProps["BE_FPEN"])) { $arJoinProps["BE_FPEN"][$comp_prop_id] = array("CNT" => count($arJoinProps["BE_FPEN"]), "MULTIPLE" => "N", "VERSION" => 2, "ORIG_ID" => $db_jprop["ORIG_ID"], "JOIN" => $ijPropCnt, "bFullJoin" => false); } $ijFpenCnt = $arJoinProps["BE_FPEN"][$comp_prop_id]["CNT"]; $arSelect["JFPEN" . $ijFpenCnt . ".VALUE"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID[1] . "_" . $PR_ID[2] . "_VALUE", $arIBlockLongProps); $arSelect["JFPEN" . $ijFpenCnt . ".ID"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID[1] . "_" . $PR_ID[2] . "_ENUM_ID", $arIBlockLongProps); } else { //Join properties table if needed if (!array_key_exists($db_jprop["IBLOCK_ID"], $arJoinProps["BE_FPS"])) { $arJoinProps["BE_FPS"][$db_jprop["IBLOCK_ID"]] = array("CNT" => count($arJoinProps["BE_FPS"]), "JOIN" => $iElCnt); } $ijPropCnt = $arJoinProps["BE_FPS"][$db_jprop["IBLOCK_ID"]]["CNT"]; $arSelect["JFPS" . $ijPropCnt . ".PROPERTY_" . $db_jprop["ORIG_ID"]] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID[1] . "_" . $PR_ID[2] . "_VALUE", $arIBlockLongProps); if ($sGroupBy == "" && $db_jprop["WITH_DESCRIPTION"] == "Y") { $arSelect["JFPS" . $ijPropCnt . ".DESCRIPTION_" . $db_jprop["ORIG_ID"]] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID[1] . "_" . $PR_ID[2] . "_DESCRIPTION", $arIBlockLongProps); } } //When there is no grouping and this is single value property for Infoblock+ if ($sGroupBy == "") { if ($DB->type == "MSSQL") { $arSelect[$DB->Concat("CAST(BE" . $iElCnt . ".ID AS VARCHAR)", "':'", "'" . $db_jprop["ORIG_ID"] . "'")] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID[1] . "_" . $PR_ID[2] . "_VALUE_ID", $arIBlockLongProps); } else { $arSelect[$DB->Concat("BE" . $iElCnt . ".ID", "':'", $db_jprop["ORIG_ID"])] = CIBlockElement::MkAlias($mal, $PR_ID[2] . "_" . $PR_ID[1] . "_VALUE_ID", $arIBlockLongProps); } } } else { //Join property metadata table if (!array_key_exists($comp_prop_id, $arJoinProps["BE_FP"])) { $arJoinProps["BE_FP"][$comp_prop_id] = array("CNT" => count($arJoinProps["BE_FP"]), "JOIN" => $iElCnt, "bFullJoin" => false); } //Join multiple values properties table if needed if (!array_key_exists($comp_prop_id, $arJoinProps["BE_FPV"])) { $arJoinProps["BE_FPV"][$comp_prop_id] = array("CNT" => count($arJoinProps["BE_FPV"]), "MULTIPLE" => "Y", "VERSION" => 2, "IBLOCK_ID" => $db_jprop["IBLOCK_ID"], "JOIN" => $arJoinProps["BE_FP"][$comp_prop_id]["CNT"], "BE_JOIN" => $iElCnt, "bFullJoin" => false); } $ijPropCnt = $arJoinProps["BE_FPV"][$comp_prop_id]["CNT"]; //For enum properties if ($db_jprop["PROPERTY_TYPE"] == "L") { //Then join list values table if (!array_key_exists($comp_prop_id, $arJoinProps["BE_FPEN"])) { $arJoinProps["BE_FPEN"][$comp_prop_id] = array("CNT" => count($arJoinProps["BE_FPEN"]), "MULTIPLE" => "Y", "VERSION" => 2, "ORIG_ID" => $db_jprop["ORIG_ID"], "JOIN" => $ijPropCnt, "bFullJoin" => false); } $ijFpenCnt = $arJoinProps["BE_FPEN"][$comp_prop_id]["CNT"]; $arSelect["JFPEN" . $ijFpenCnt . ".VALUE"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID[1] . "_" . $PR_ID[2] . "_VALUE", $arIBlockLongProps); $arSelect["JFPEN" . $ijFpenCnt . ".ID"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID[1] . "_" . $PR_ID[2] . "_ENUM_ID", $arIBlockLongProps); } else { $arSelect["JFPV" . $ijPropCnt . ".VALUE"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID[1] . "_" . $PR_ID[2] . "_VALUE", $arIBlockLongProps); } } } else { //Join property metadata table if (!array_key_exists($comp_prop_id, $arJoinProps["BE_FP"])) { $arJoinProps["BE_FP"][$comp_prop_id] = array("CNT" => count($arJoinProps["BE_FP"]), "JOIN" => $iElCnt, "bFullJoin" => false); } //Join multiple values properties table if needed if (!array_key_exists($comp_prop_id, $arJoinProps["BE_FPV"])) { $arJoinProps["BE_FPV"][$comp_prop_id] = array("CNT" => count($arJoinProps["BE_FPV"]), "MULTIPLE" => $db_jprop["MULTIPLE"], "VERSION" => 1, "IBLOCK_ID" => $db_jprop["IBLOCK_ID"], "JOIN" => $arJoinProps["BE_FP"][$comp_prop_id]["CNT"], "BE_JOIN" => $iElCnt, "bFullJoin" => false); } $ijPropCnt = $arJoinProps["BE_FPV"][$comp_prop_id]["CNT"]; //For enum properties if ($db_jprop["PROPERTY_TYPE"] == "L") { //Then join list values table if (!array_key_exists($comp_prop_id, $arJoinProps["BE_FPEN"])) { $arJoinProps["BE_FPEN"][$comp_prop_id] = array("CNT" => count($arJoinProps["BE_FPEN"]), "MULTIPLE" => $db_jprop["MULTIPLE"], "VERSION" => 1, "ORIG_ID" => $db_jprop["ORIG_ID"], "JOIN" => $ijPropCnt, "bFullJoin" => false); } $ijFpenCnt = $arJoinProps["BE_FPEN"][$comp_prop_id]["CNT"]; $arSelect["JFPEN" . $ijFpenCnt . ".VALUE"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID[1] . "_" . $PR_ID[2] . "_VALUE", $arIBlockLongProps); $arSelect["JFPEN" . $ijFpenCnt . ".ID"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID[1] . "_" . $PR_ID[2] . "_ENUM_ID", $arIBlockLongProps); } else { $arSelect["JFPV" . $ijPropCnt . ".VALUE"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID[1] . "_" . $PR_ID[2] . "_VALUE", $arIBlockLongProps); } //When there is no grouping select property value id also if ($sGroupBy == "") { $arSelect["JFPV" . $ijPropCnt . ".ID"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID[1] . "_" . $PR_ID[2] . "_VALUE_ID", $arIBlockLongProps); } } } } } else { //Define special processing for CIBlockResult::Fetch if ($db_prop["USER_TYPE"] != "") { $arUserType = CIBlockProperty::GetUserType($db_prop["USER_TYPE"]); if (array_key_exists("ConvertFromDB", $arUserType)) { $arIBlockConvProps["PROPERTY_" . $PR_ID . "_VALUE"] = array("ConvertFromDB" => $arUserType["ConvertFromDB"], "PROPERTY" => $db_prop); } } //Infoblock+ (property stored in separate table) if ($db_prop["VERSION"] == 2) { //This is single value property if ($db_prop["MULTIPLE"] == "N") { //For numbers we will need special processing in CIBlockResult::Fetch if ($db_prop["PROPERTY_TYPE"] == "N") { $arIBlockNumProps["PROPERTY_" . $PR_ID . "_VALUE"] = $db_prop; } //Enum single property if ($db_prop["PROPERTY_TYPE"] == "L") { //Join properties table if needed if (!array_key_exists($db_prop["IBLOCK_ID"], $arJoinProps["FPS"])) { $arJoinProps["FPS"][$db_prop["IBLOCK_ID"]] = count($arJoinProps["FPS"]); } $iPropCnt = $arJoinProps["FPS"][$db_prop["IBLOCK_ID"]]; //Then join list values table if (!array_key_exists($db_prop["ID"], $arJoinProps["FPEN"])) { $arJoinProps["FPEN"][$db_prop["ID"]] = array("CNT" => count($arJoinProps["FPEN"]), "MULTIPLE" => "N", "VERSION" => 2, "ORIG_ID" => $db_prop["ORIG_ID"], "JOIN" => $iPropCnt, "bFullJoin" => false); } $iFpenCnt = $arJoinProps["FPEN"][$db_prop["ID"]]["CNT"]; if ($bSort) { $arSelect["FPEN" . $iFpenCnt . ".SORT"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_SORT", $arIBlockLongProps); } $arSelect["FPEN" . $iFpenCnt . ".VALUE"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_VALUE", $arIBlockLongProps); $arSelect["FPEN" . $iFpenCnt . ".ID"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_ENUM_ID", $arIBlockLongProps); } else { //Join properties table if needed if (!array_key_exists($db_prop["IBLOCK_ID"], $arJoinProps["FPS"])) { $arJoinProps["FPS"][$db_prop["IBLOCK_ID"]] = count($arJoinProps["FPS"]); } $iPropCnt = $arJoinProps["FPS"][$db_prop["IBLOCK_ID"]]; $arSelect["FPS" . $iPropCnt . ".PROPERTY_" . $db_prop["ORIG_ID"]] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_VALUE", $arIBlockLongProps); if ($sGroupBy == "" && $db_prop["WITH_DESCRIPTION"] == "Y") { $arSelect["FPS" . $iPropCnt . ".DESCRIPTION_" . $db_prop["ORIG_ID"]] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_DESCRIPTION", $arIBlockLongProps); } } //When there is no grouping and this is single value property for Infoblock+ if ($sGroupBy == "") { if ($DB->type == "MSSQL") { $arSelect[$DB->Concat("CAST(BE.ID AS VARCHAR)", "':'", "'" . $db_prop["ORIG_ID"] . "'")] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_VALUE_ID", $arIBlockLongProps); } else { $arSelect[$DB->Concat("BE.ID", "':'", $db_prop["ORIG_ID"])] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_VALUE_ID", $arIBlockLongProps); } } } else { //There was no grouping so we can join FPS and constuct an array on CIBlockPropertyResult::Fetch if (!$bWasGroup && !$bSubQuery) { //Join single value properties table if needed if (!array_key_exists($db_prop["IBLOCK_ID"], $arJoinProps["FPS"])) { $arJoinProps["FPS"][$db_prop["IBLOCK_ID"]] = count($arJoinProps["FPS"]); } $iPropCnt = $arJoinProps["FPS"][$db_prop["IBLOCK_ID"]]; $arSelect["FPS" . $iPropCnt . ".PROPERTY_" . $db_prop["ORIG_ID"]] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_VALUE", $arIBlockLongProps); if ($sGroupBy == "" && $db_prop["WITH_DESCRIPTION"] == "Y") { $arSelect["FPS" . $iPropCnt . ".DESCRIPTION_" . $db_prop["ORIG_ID"]] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_DESCRIPTION", $arIBlockLongProps); } //And we will need extra processing in CIBlockPropertyResult::Fetch $arIBlockMultProps["PROPERTY_" . $PR_ID . "_VALUE"] = $db_prop; } else { //Join property metadata table if (!array_key_exists($db_prop["ID"], $arJoinProps["FP"])) { $arJoinProps["FP"][$db_prop["ID"]] = array("CNT" => count($arJoinProps["FP"]), "bFullJoin" => false); } //Join multiple values properties table if needed if (!array_key_exists($db_prop["ID"], $arJoinProps["FPV"])) { $arJoinProps["FPV"][$db_prop["ID"]] = array("CNT" => count($arJoinProps["FPV"]), "IBLOCK_ID" => $db_prop["IBLOCK_ID"], "MULTIPLE" => "Y", "VERSION" => 2, "JOIN" => $arJoinProps["FP"][$db_prop["ID"]]["CNT"], "bFullJoin" => false); } $iPropCnt = $arJoinProps["FPV"][$db_prop["ID"]]["CNT"]; //For enum properties if ($db_prop["PROPERTY_TYPE"] == "L") { //Then join list values table if (!array_key_exists($db_prop["ID"], $arJoinProps["FPEN"])) { $arJoinProps["FPEN"][$db_prop["ID"]] = array("CNT" => count($arJoinProps["FPEN"]), "MULTIPLE" => "Y", "VERSION" => 2, "ORIG_ID" => $db_prop["ORIG_ID"], "JOIN" => $iPropCnt, "bFullJoin" => false); } $iFpenCnt = $arJoinProps["FPEN"][$db_prop["ID"]]["CNT"]; if ($bSort) { $arSelect["FPEN" . $iFpenCnt . ".SORT"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_SORT", $arIBlockLongProps); } $arSelect["FPEN" . $iFpenCnt . ".VALUE"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_VALUE", $arIBlockLongProps); $arSelect["FPEN" . $iFpenCnt . ".ID"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_ENUM_ID", $arIBlockLongProps); } else { $arSelect["FPV" . $iPropCnt . ".VALUE"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_VALUE", $arIBlockLongProps); } } } } else { //Join property metadata table if (!array_key_exists($db_prop["ID"], $arJoinProps["FP"])) { $arJoinProps["FP"][$db_prop["ID"]] = array("CNT" => count($arJoinProps["FP"]), "bFullJoin" => false); } //Join multiple values properties table if needed if (!array_key_exists($db_prop["ID"], $arJoinProps["FPV"])) { $arJoinProps["FPV"][$db_prop["ID"]] = array("CNT" => count($arJoinProps["FPV"]), "IBLOCK_ID" => $db_prop["IBLOCK_ID"], "MULTIPLE" => $db_prop["MULTIPLE"], "VERSION" => 1, "JOIN" => $arJoinProps["FP"][$db_prop["ID"]]["CNT"], "bFullJoin" => false); } $iPropCnt = $arJoinProps["FPV"][$db_prop["ID"]]["CNT"]; //For enum properties if ($db_prop["PROPERTY_TYPE"] == "L") { //Then join list values table if (!array_key_exists($db_prop["ID"], $arJoinProps["FPEN"])) { $arJoinProps["FPEN"][$db_prop["ID"]] = array("CNT" => count($arJoinProps["FPEN"]), "MULTIPLE" => $db_prop["MULTIPLE"], "VERSION" => 1, "ORIG_ID" => $db_prop["ORIG_ID"], "JOIN" => $iPropCnt, "bFullJoin" => false); } $iFpenCnt = $arJoinProps["FPEN"][$db_prop["ID"]]["CNT"]; if ($bSort) { $arSelect["FPEN" . $iFpenCnt . ".SORT"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_SORT", $arIBlockLongProps); } $arSelect["FPEN" . $iFpenCnt . ".VALUE"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_VALUE", $arIBlockLongProps); $arSelect["FPEN" . $iFpenCnt . ".ID"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_ENUM_ID", $arIBlockLongProps); } else { $arSelect["FPV" . $iPropCnt . ".VALUE"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_VALUE", $arIBlockLongProps); } //When there is no grouping select property value id also if ($sGroupBy == "") { $arSelect["FPV" . $iPropCnt . ".ID"] = CIBlockElement::MkAlias($mal, "PROPERTY_" . $PR_ID . "_VALUE_ID", $arIBlockLongProps); } } } //If this is subquery we do not need alias and any othe columns if ($bSubQuery) { foreach ($arSelect as $column => $alias) { if (preg_match('/^(FPV\\d+)\\.VALUE/', $column, $match)) { $sSelect .= ", " . $match[1] . ".VALUE_NUM"; break; } elseif (preg_match('/^(FPS\\d+)\\.PROPERTY_/', $column)) { $sSelect .= ", " . $column; break; } } } else { foreach ($arSelect as $column => $alias) { $sSelect .= ", " . $column . " as " . $alias; } } }