function CSearchStatistic($phrase = "", $tags = "") { $phrase = ToLower(trim($phrase, " \t\n\r")); if ($l = strlen($phrase)) { if ($l > 250) { $p = strrpos($phrase, ' '); if ($p === false) { $this->_phrase = substr($phrase, 0, 250); } else { $this->_phrase = substr($phrase, 0, $p); } } else { $this->_phrase = $phrase; } } else { $this->_phrase = false; } $arTags = tags_prepare($tags); if (count($arTags)) { asort($arTags); $this->_tags = implode(", ", $arTags); } else { $this->_tags = false; } $this->_session_id = bitrix_sessid(); if (isset($_SESSION["SESS_SESSION_ID"])) { $this->_stat_sess_id = intval($_SESSION["SESS_SESSION_ID"]); } }
$arThumbsIndex[$arElement["PREVIEW_PICTURE"]] = $arElement["ID"]; // Real if ($arElement["PROPERTIES"]["REAL_PICTURE"]["VALUE"]) { $strFileId .= ',' . intVal($arElement["PROPERTIES"]["REAL_PICTURE"]["VALUE"]); $arPicturesIndex[$arElement["PROPERTIES"]["REAL_PICTURE"]["VALUE"]] = $arElement["ID"]; } elseif ($arElement["PREVIEW_PICTURE"]) { $strFileId .= ',' . $arElement["DETAIL_PICTURE"]; $arPicturesIndex[$arElement["DETAIL_PICTURE"]] = $arElement["ID"]; } //URL $arElement["~URL"] = CComponentEngine::MakePathFromTemplate($arParams["~DETAIL_URL"], array("USER_ALIAS" => $arGallery["CODE"], "SECTION_ID" => $arElement["IBLOCK_SECTION_ID"], "ELEMENT_ID" => $arElement["ID"], "USER_ID" => $arGallery["CREATED_BY"], "GROUP_ID" => $arGallery["SOCNET_GROUP_ID"], "user_alias" => $arGallery["CODE"], "section_id" => $arElement["IBLOCK_SECTION_ID"], "element_id" => $arElement["ID"], "user_id" => $arGallery["CREATED_BY"], "group_id" => $arGallery["SOCNET_GROUP_ID"])); $arElement["URL"] = htmlspecialcharsbx($arElement["~URL"]); //TAGS $arElement["TAGS_LIST"] = array(); if ($arParams["SHOW_TAGS"] && !empty($arElement["TAGS"]) && $bParseTags) { $ar = tags_prepare($arElement["~TAGS"], SITE_ID); if (!empty($ar)) { foreach ($ar as $name => $tags) { $arr = array("TAG_NAME" => $tags, "TAG_URL" => CComponentEngine::MakePathFromTemplate($arParams["~SEARCH_URL"], array())); $arr["TAG_URL"] .= (strpos($arr["TAG_URL"], "?") === false ? "?" : "&") . "tags=" . $tags; $arElement["TAGS_LIST"][] = $arr; } } } if ($arElement["PREVIEW_TEXT"] == "" && $arElement["NAME"] != "" && !preg_match('/\\d{3,}/', $arElement["NAME"])) { $arElement["~NAME"] = preg_replace(array('/\\.jpg/i', '/\\.jpeg/i', '/\\.gif/i', '/\\.png/i', '/\\.bmp/i'), '', $arElement["~NAME"]); $arElement["~PREVIEW_TEXT"] = $arElement["~NAME"]; $arElement["PREVIEW_TEXT"] = htmlspecialcharsbx($arElement["~PREVIEW_TEXT"]); } unset($arElement["DETAIL_PICTURE"]); $arElements[$arElement["ID"]] = $arElement;
function TagsIndex($arLID, $ID, $sContent) { $DB = CDatabase::GetModuleConnection('search'); $ID = intval($ID); if (!is_array($arLID)) { $arLID = array(); } $sContent = str_replace("", "", $sContent); foreach ($arLID as $site_id => $url) { $sql_site_id = $DB->ForSQL($site_id); $arTags = tags_prepare($sContent, $site_id); if (!empty($arTags)) { $strSqlPrefix = "\n\t\t\t\t\t\tinsert ignore into b_search_tags\n\t\t\t\t\t\t(SEARCH_CONTENT_ID, SITE_ID, NAME)\n\t\t\t\t\t\tvalues\n\t\t\t\t"; $maxValuesLen = 2048; $strSqlValues = ""; CSearchTags::CleanCache($arTags); foreach ($arTags as $tag) { $strSqlValues .= ",\n(" . $ID . ", '" . $sql_site_id . "', '" . $DB->ForSql($tag, 255) . "')"; if (strlen($strSqlValues) > $maxValuesLen) { $DB->Query($strSqlPrefix . substr($strSqlValues, 2), false, "File: " . __FILE__ . "<br>Line: " . __LINE__); $strSqlValues = ""; } } if (strlen($strSqlValues) > 0) { $DB->Query($strSqlPrefix . substr($strSqlValues, 2), false, "File: " . __FILE__ . "<br>Line: " . __LINE__); $strSqlValues = ""; } } } }
function CheckFields(&$arFields, $ID = false, $bCheckDiskQuota = true) { global $DB, $APPLICATION, $USER; $this->LAST_ERROR = ""; $APPLICATION->ResetException(); if ($ID === false) { $db_events = GetModuleEvents("iblock", "OnStartIBlockElementAdd", true); } else { $arFields["ID"] = $ID; $db_events = GetModuleEvents("iblock", "OnStartIBlockElementUpdate", true); } foreach ($db_events as $arEvent) { $bEventRes = ExecuteModuleEventEx($arEvent, array(&$arFields)); if ($bEventRes === false) { break; } } if (($ID === false || is_set($arFields, "NAME")) && strlen($arFields["NAME"]) <= 0) { $this->LAST_ERROR .= GetMessage("IBLOCK_BAD_ELEMENT_NAME") . "<br>"; } if (isset($arFields["ACTIVE_FROM"]) && $arFields["ACTIVE_FROM"] != '' && !$DB->IsDate($arFields["ACTIVE_FROM"], false, LANG, "FULL")) { $this->LAST_ERROR .= GetMessage("IBLOCK_BAD_ACTIVE_FROM") . "<br>"; } if (isset($arFields["ACTIVE_TO"]) && $arFields["ACTIVE_TO"] != '' && !$DB->IsDate($arFields["ACTIVE_TO"], false, LANG, "FULL")) { $this->LAST_ERROR .= GetMessage("IBLOCK_BAD_ACTIVE_TO") . "<br>"; } if (is_set($arFields, "PREVIEW_PICTURE")) { if (is_array($arFields["PREVIEW_PICTURE"]) && array_key_exists("bucket", $arFields["PREVIEW_PICTURE"]) && is_object($arFields["PREVIEW_PICTURE"]["bucket"])) { //This is trusted image from xml import } elseif (is_array($arFields["PREVIEW_PICTURE"])) { $error = CFile::CheckImageFile($arFields["PREVIEW_PICTURE"]); if (strlen($error) > 0) { $this->LAST_ERROR .= $error . "<br>"; } elseif (($error = CFile::checkForDb($arFields, "PREVIEW_PICTURE")) !== "") { $this->LAST_ERROR .= GetMessage("IBLOCK_ERR_PREVIEW_PICTURE") . "<br>" . $error . "<br>"; } } elseif (intval($arFields["PREVIEW_PICTURE"]) > 0) { if (intval($arFields["WF_PARENT_ELEMENT_ID"]) <= 0 || CIBlockElement::DeleteFile($arFields["PREVIEW_PICTURE"], $ID, "PREVIEW", intval($arFields["WF_PARENT_ELEMENT_ID"]), $arFields["IBLOCK_ID"], true) <= 0) { $this->LAST_ERROR .= GetMessage("IBLOCK_ERR_PREVIEW_PICTURE") . "<br>"; } } } if (is_set($arFields, "DETAIL_PICTURE")) { if (is_array($arFields["DETAIL_PICTURE"]) && array_key_exists("bucket", $arFields["DETAIL_PICTURE"]) && is_object($arFields["DETAIL_PICTURE"]["bucket"])) { //This is trusted image from xml import } elseif (is_array($arFields["DETAIL_PICTURE"])) { $error = CFile::CheckImageFile($arFields["DETAIL_PICTURE"]); if (strlen($error) > 0) { $this->LAST_ERROR .= $error . "<br>"; } elseif (($error = CFile::checkForDb($arFields, "DETAIL_PICTURE")) !== "") { $this->LAST_ERROR .= GetMessage("IBLOCK_ERR_DETAIL_PICTURE") . "<br>" . $error . "<br>"; } } elseif (intval($arFields["DETAIL_PICTURE"]) > 0) { if (intval($arFields["WF_PARENT_ELEMENT_ID"]) <= 0 || CIBlockElement::DeleteFile($arFields["DETAIL_PICTURE"], $ID, "DETAIL", intval($arFields["WF_PARENT_ELEMENT_ID"]), $arFields["IBLOCK_ID"], true) <= 0) { $this->LAST_ERROR .= GetMessage("IBLOCK_ERR_DETAIL_PICTURE") . "<br>"; } } } if (array_key_exists("TAGS", $arFields) && CModule::IncludeModule('search')) { $arFields["TAGS"] = implode(", ", tags_prepare($arFields["TAGS"])); } if ($ID === false && !is_set($arFields, "IBLOCK_ID")) { $this->LAST_ERROR .= GetMessage("IBLOCK_BAD_BLOCK_ID") . "<br>"; } if ($ID !== false && is_set($arFields, "XML_ID") && strlen($arFields["XML_ID"]) <= 0) { $this->LAST_ERROR .= GetMessage("IBLOCK_BAD_EXTERNAL_CODE") . "<br>"; } //Find out IBLOCK_ID from fields or from element $IBLOCK_ID = intval($arFields["IBLOCK_ID"]); if ($IBLOCK_ID <= 0) { $IBLOCK_ID = 0; $res = $DB->Query("SELECT IBLOCK_ID FROM b_iblock_element WHERE ID=" . IntVal($ID)); if ($ar = $res->Fetch()) { $IBLOCK_ID = (int) $ar["IBLOCK_ID"]; } } //Read iblock metadata static $IBLOCK_CACHE = array(); if (!isset($IBLOCK_CACHE[$IBLOCK_ID])) { if ($IBLOCK_ID > 0) { $IBLOCK_CACHE[$IBLOCK_ID] = CIBlock::GetArrayByID($IBLOCK_ID); } else { $IBLOCK_CACHE[$IBLOCK_ID] = false; } } if ($IBLOCK_CACHE[$IBLOCK_ID]) { $arFields["IBLOCK_ID"] = $IBLOCK_ID; } else { $this->LAST_ERROR .= GetMessage("IBLOCK_BAD_BLOCK_ID") . "<br>"; } if (is_set($arFields, 'IBLOCK_SECTION') && !empty($arFields['IBLOCK_SECTION'])) { if (!is_array($arFields['IBLOCK_SECTION'])) { $arFields['IBLOCK_SECTION'] = array($arFields['IBLOCK_SECTION']); } $arFields['IBLOCK_SECTION'] = array_filter($arFields['IBLOCK_SECTION']); } if ($IBLOCK_CACHE[$IBLOCK_ID]) { $ar = $IBLOCK_CACHE[$IBLOCK_ID]["FIELDS"]; if (is_array($ar)) { $WF_PARENT_ELEMENT_ID = isset($arFields["WF_PARENT_ELEMENT_ID"]) ? intval($arFields["WF_PARENT_ELEMENT_ID"]) : 0; if (($WF_PARENT_ELEMENT_ID == 0 || $WF_PARENT_ELEMENT_ID == intval($ID)) && array_key_exists("CODE", $arFields) && strlen($arFields["CODE"]) > 0 && is_array($ar["CODE"]["DEFAULT_VALUE"]) && $ar["CODE"]["DEFAULT_VALUE"]["UNIQUE"] == "Y") { $res = $DB->Query("\n\t\t\t\t\t\tSELECT ID\n\t\t\t\t\t\tFROM b_iblock_element\n\t\t\t\t\t\tWHERE IBLOCK_ID = " . $IBLOCK_ID . "\n\t\t\t\t\t\tAND CODE = '" . $DB->ForSQL($arFields["CODE"]) . "'\n\t\t\t\t\t\tAND WF_PARENT_ELEMENT_ID IS NULL\n\t\t\t\t\t\tAND ID <> " . intval($ID)); if ($res->Fetch()) { $this->LAST_ERROR .= GetMessage("IBLOCK_DUP_ELEMENT_CODE") . "<br>"; } } $arOldElement = false; foreach ($ar as $FIELD_ID => $field) { if (preg_match("/^(SECTION_|LOG_)/", $FIELD_ID)) { continue; } if ($field["IS_REQUIRED"] === "Y") { switch ($FIELD_ID) { case "NAME": case "ACTIVE": case "PREVIEW_TEXT_TYPE": case "DETAIL_TEXT_TYPE": case "SORT": //We should never check for this fields break; case "IBLOCK_SECTION": if ($ID === false || array_key_exists($FIELD_ID, $arFields)) { $sum = 0; if (is_array($arFields[$FIELD_ID])) { foreach ($arFields[$FIELD_ID] as $k => $v) { if (intval($v) > 0) { $sum += intval($v); } } } else { $sum = intval($arFields[$FIELD_ID]); } if ($sum <= 0) { $this->LAST_ERROR .= GetMessage("IBLOCK_BAD_FIELD", array("#FIELD_NAME#" => $field["NAME"])) . "<br>"; } } break; case "PREVIEW_PICTURE": case "DETAIL_PICTURE": if ($ID !== false && !$arOldElement) { $rs = $DB->Query("SELECT PREVIEW_PICTURE, DETAIL_PICTURE from b_iblock_element WHERE ID = " . intval($ID)); $arOldElement = $rs->Fetch(); } if ($arOldElement && $arOldElement[$FIELD_ID] > 0) { //There was an picture so just check that it is not deleted if (array_key_exists($FIELD_ID, $arFields) && is_array($arFields[$FIELD_ID]) && $arFields[$FIELD_ID]["del"] === "Y") { $this->LAST_ERROR .= GetMessage("IBLOCK_BAD_FIELD", array("#FIELD_NAME#" => $field["NAME"])) . "<br>"; } } else { //There was NO picture so it MUST be present if (!array_key_exists($FIELD_ID, $arFields)) { $this->LAST_ERROR .= GetMessage("IBLOCK_BAD_FIELD", array("#FIELD_NAME#" => $field["NAME"])) . "<br>"; } elseif (is_array($arFields[$FIELD_ID])) { if ($arFields[$FIELD_ID]["del"] === "Y" || array_key_exists("error", $arFields[$FIELD_ID]) && $arFields[$FIELD_ID]["error"] !== 0 || $arFields[$FIELD_ID]["size"] <= 0) { $this->LAST_ERROR .= GetMessage("IBLOCK_BAD_FIELD", array("#FIELD_NAME#" => $field["NAME"])) . "<br>"; } } else { if (intval($arFields[$FIELD_ID]) <= 0) { $this->LAST_ERROR .= GetMessage("IBLOCK_BAD_FIELD", array("#FIELD_NAME#" => $field["NAME"])) . "<br>"; } } } break; default: if ($ID === false || array_key_exists($FIELD_ID, $arFields)) { if (is_array($arFields[$FIELD_ID])) { $val = implode("", $arFields[$FIELD_ID]); } else { $val = $arFields[$FIELD_ID]; } if (strlen($val) <= 0) { $this->LAST_ERROR .= GetMessage("IBLOCK_BAD_FIELD", array("#FIELD_NAME#" => $field["NAME"])) . "<br>"; } } break; } } } } } if (array_key_exists("PROPERTY_VALUES", $arFields) && is_array($arFields["PROPERTY_VALUES"])) { //First "normalize" properties to form: //$arFields["PROPERTY_VALUES"][<PROPERTY_ID>][<PROPERTY_VALUE_ID>] => $value $arProperties = array(); foreach ($arFields["PROPERTY_VALUES"] as $key => $property_values) { $arProperties[$key] = array(); if (is_array($property_values)) { if (array_key_exists("VALUE", $property_values)) { $arProperties[$key][] = $property_values["VALUE"]; } elseif (array_key_exists("tmp_name", $property_values)) { $arProperties[$key][] = $property_values; } else { foreach ($property_values as $key2 => $property_value) { if (is_array($property_value) && array_key_exists("VALUE", $property_value)) { //each of these may be "complex" $arProperties[$key][] = $property_value["VALUE"]; } else { //or simple $arProperties[$key][] = $property_value; } } } } else { $arProperties[$key][] = $property_values; } } foreach ($arProperties as $key => $property_values) { $arProperty = CIBlockProperty::GetPropertyArray($key, $IBLOCK_ID); if ($arProperty["USER_TYPE"] != "") { $arUserType = CIBlockProperty::GetUserType($arProperty["USER_TYPE"]); } else { $arUserType = array(); } if (array_key_exists("CheckFields", $arUserType)) { foreach ($property_values as $key2 => $property_value) { $arError = call_user_func_array($arUserType["CheckFields"], array($arProperty, array("VALUE" => $property_value))); if (is_array($arError)) { foreach ($arError as $err_mess) { $this->LAST_ERROR .= $err_mess . "<br>"; } } } } //Files check $bError = false; if ($arProperty["IS_REQUIRED"] == "Y" && $arProperty['PROPERTY_TYPE'] == 'F') { //New element if ($ID === false) { $bError = true; foreach ($property_values as $key2 => $property_value) { if (is_array($property_value) && array_key_exists("tmp_name", $property_value) && array_key_exists("size", $property_value)) { if ($property_value['size'] > 0) { $bError = false; break; } } elseif (intval($property_value) > 0) { //This is history copy of the file $bError = false; break; } } } else { $dbProperty = CIBlockElement::GetProperty($arProperty["IBLOCK_ID"], $ID, "sort", "asc", array("ID" => $arProperty["ORIG_ID"], "EMPTY" => "N")); $bCount = 0; while ($a = $dbProperty->Fetch()) { if ($a["VALUE"] > 0) { $bCount++; } } foreach ($property_values as $key2 => $property_value) { if (is_array($property_value)) { if ($property_value['size'] > 0) { $bCount++; break; } elseif ($property_value['del'] == 'Y') { $bCount--; } } elseif (intval($property_value) > 0) { //This is history copy of the file $bCount++; break; } } $bError = $bCount <= 0; } } if ($arProperty["IS_REQUIRED"] == "Y" && $arProperty['PROPERTY_TYPE'] != 'F') { $len = 0; foreach ($property_values as $key2 => $property_value) { if (array_key_exists("GetLength", $arUserType)) { $len += call_user_func_array($arUserType["GetLength"], array($arProperty, array("VALUE" => $property_value))); } else { $len += strlen($property_value); } if ($len > 0) { break; } } $bError = $len <= 0; } if ($bError) { $this->LAST_ERROR .= GetMessage("IBLOCK_BAD_PROPERTY", array("#PROPERTY#" => $arProperty["NAME"])) . "<br>"; } // check file properties for correctness if ($arProperty['PROPERTY_TYPE'] == 'F') { $bImageOnly = False; $arImageExtentions = explode(",", strtoupper(CFile::GetImageExtensions())); if (strlen($arProperty["FILE_TYPE"])) { $bImageOnly = True; $arAvailTypes = explode(",", strtoupper($arProperty["FILE_TYPE"])); foreach ($arAvailTypes as $avail_type) { if (!in_array(trim($avail_type), $arImageExtentions)) { $bImageOnly = False; break; } } } foreach ($property_values as $key2 => $property_value) { if (!is_array($property_value) && intval($property_value) > 0 && intval($arFields["WF_PARENT_ELEMENT_ID"]) > 0) { if (CIBlockElement::DeleteFile($property_value, $ID, "PROPERTY", intval($arFields["WF_PARENT_ELEMENT_ID"]), $arFields["IBLOCK_ID"], true) <= 0) { $this->LAST_ERROR .= GetMessage("IBLOCK_ERR_FILE_PROPERTY") . "<br>"; } } elseif (is_array($property_value)) { if (is_object($property_value["bucket"])) { //This is trusted image from xml import $error = ""; } else { if ($bImageOnly) { $error = CFile::CheckImageFile($property_value); } else { $error = CFile::CheckFile($property_value, 0, false, $arProperty["FILE_TYPE"]); } } //For user without edit php permissions //we allow only pictures upload if (!is_object($USER) || !$USER->IsAdmin()) { if (HasScriptExtension($property_value["name"])) { $error = GetMessage("FILE_BAD_TYPE") . " (" . $property_value["name"] . ")."; } } if (strlen($error) > 0) { $this->LAST_ERROR .= $error . "<br>"; } } } } } } $APPLICATION->ResetException(); if ($ID === false) { $db_events = GetModuleEvents("iblock", "OnBeforeIBlockElementAdd", true); } else { $arFields["ID"] = $ID; $db_events = GetModuleEvents("iblock", "OnBeforeIBlockElementUpdate", true); } foreach ($db_events as $arEvent) { $bEventRes = ExecuteModuleEventEx($arEvent, array(&$arFields)); if ($bEventRes === false) { if ($err = $APPLICATION->GetException()) { $this->LAST_ERROR .= $err->GetString() . "<br>"; } else { $APPLICATION->ThrowException("Unknown error"); $this->LAST_ERROR .= "Unknown error.<br>"; } break; } } /****************************** QUOTA ******************************/ if ($bCheckDiskQuota && empty($this->LAST_ERROR) && COption::GetOptionInt("main", "disk_space") > 0) { $quota = new CDiskQuota(); if (!$quota->checkDiskQuota($arFields)) { $this->LAST_ERROR = $quota->LAST_ERROR; } } /****************************** QUOTA ******************************/ if (!empty($this->LAST_ERROR)) { return false; } return true; }
function Fetch() { static $arSite = array(); $r = parent::Fetch(); if ($r && $this->formatter) { $r = $this->formatter->format($r); if (!$r) return $this->Fetch(); } if ($r) { $site_id = $r["SITE_ID"]; if(!isset($arSite[$site_id])) { $b = "sort"; $o = "asc"; $rsSite = CSite::GetList($b, $o, array("ID"=>$site_id)); $arSite[$site_id] = $rsSite->Fetch(); } $r["DIR"] = $arSite[$site_id]["DIR"]; $r["SERVER_NAME"] = $arSite[$site_id]["SERVER_NAME"]; if(strlen($r["SITE_URL"])>0) $r["URL"] = $r["SITE_URL"]; if(substr($r["URL"], 0, 1)=="=") { foreach (GetModuleEvents("search", "OnSearchGetURL", true) as $arEvent) $r["URL"] = ExecuteModuleEventEx($arEvent, array($r)); } $r["URL"] = str_replace( array("#LANG#", "#SITE_DIR#", "#SERVER_NAME#"), array($r["DIR"], $r["DIR"], $r["SERVER_NAME"]), $r["URL"] ); $r["URL"] = preg_replace("'(?<!:)/+'s", "/", $r["URL"]); $r["URL_WO_PARAMS"] = $r["URL"]; $w = $this->Query->m_words; if(count($this->url_add_params)) { $p1 = strpos($r["URL"], "?"); if($p1 === false) $ch = "?"; else $ch = "&"; $p2 = strpos($r["URL"], "#", $p1); if($p2===false) { $r["URL"] = $r["URL"].$ch.implode("&", $this->url_add_params); } else { $r["URL"] = substr($r["URL"], 0, $p2).$ch.implode("&", $this->url_add_params).substr($r["URL"], $p2); } } if (!array_key_exists("TITLE_FORMATED", $r) && array_key_exists("TITLE", $r)) { $r["TITLE_FORMATED"] = $this->PrepareSearchResult(htmlspecialcharsex($r["TITLE"])); $r["TITLE_FORMATED_TYPE"] = "html"; $r["TAGS_FORMATED"] = tags_prepare($r["TAGS"], SITE_ID); $r["BODY_FORMATED"] = $this->PrepareSearchResult(htmlspecialcharsex($r["BODY"])); $r["BODY_FORMATED_TYPE"] = "html"; } } return $r; }
if ($arParams["SECTION_ID"] != $_REQUEST["TO_SECTION_ID"]) { CIBlockElement::RecalcSections($arParams["SECTION_ID"]); CIBlockElement::RecalcSections($_REQUEST["TO_SECTION_ID"]); } if ($arParams["AJAX_CALL"] != "Y") { } elseif ($arParams["SECTION_ID"] != $_REQUEST["TO_SECTION_ID"]) { $result = array("SECTION_ID" => intVal($_REQUEST["TO_SECTION_ID"]), "url" => CComponentEngine::MakePathFromTemplate($arParams["~DETAIL_URL"], array("USER_ALIAS" => $arParams["USER_ALIAS"], "SECTION_ID" => $_REQUEST["TO_SECTION_ID"], "ELEMENT_ID" => $arResult["ELEMENT"]["ID"]))); } else { $arSelect = array("ID", "NAME", "DETAIL_TEXT", "DETAIL_TEXT_TYPE", "TAGS", "DATE_CREATE", "CREATED_BY", "PROPERTY_PUBLIC_ELEMENT", "PROPERTY_APPROVE_ELEMENT"); $db_res = CIBlockElement::GetList(array(), array("ID" => $arParams["ELEMENT_ID"]), false, false, $arSelect); if ($db_res && ($res = $db_res->GetNext())) { $result = array("SECTION_ID" => intVal($_REQUEST["TO_SECTION_ID"]), "TAGS" => $res["TAGS"], "TITLE" => $res["NAME"], "DESCRIPTION" => $res["DETAIL_TEXT"], "_DESCRIPTION" => $res["~DETAIL_TEXT"], "PUBLIC" => $res["PROPERTY_PUBLIC_ELEMENT_VALUE"], "APPROVED" => $res["PROPERTY_APPROVE_ELEMENT_VALUE"], "DATE" => $res["DATE_CREATE"], "DATE_STR" => FormatDate('x', MakeTimeStamp($res["DATE_CREATE"], CSite::GetDateFormat()))); //TAGS $result["TAGS_LIST"] = array(); if (!empty($result["TAGS"]) && $bParseTags) { $ar = tags_prepare($result["TAGS"], SITE_ID); if (!empty($ar)) { foreach ($ar as $name => $tags) { $arr = array("TAG_NAME" => $tags, "TAG_URL" => CComponentEngine::MakePathFromTemplate($arParams["~SEARCH_URL"], array())); $arr["TAG_URL"] .= (strpos($arr["TAG_URL"], "?") === false ? "?" : "&") . "tags=" . $tags; $result["TAGS_LIST"][] = $arr; } } } } else { $result = array("SECTION_ID" => intVal($_REQUEST["TO_SECTION_ID"]), "TAGS" => htmlspecialcharsEx($_REQUEST["TAGS"]), "TITLE" => htmlspecialcharsEx($_REQUEST["TITLE"]), "DESCRIPTION" => htmlspecialcharsEx($_REQUEST["DESCRIPTION"]), "_DESCRIPTION" => htmlspecialcharsEx($_REQUEST["DESCRIPTION"]), "DATE_STR" => FormatDate('x', MakeTimeStamp($_REQUEST["DATE_CREATE"], CSite::GetDateFormat()))); } } $arResult["URL"] = CComponentEngine::MakePathFromTemplate($arParams["~DETAIL_URL"], array("USER_ALIAS" => $arParams["USER_ALIAS"], "SECTION_ID" => $_REQUEST["TO_SECTION_ID"], "ELEMENT_ID" => $arResult["ELEMENT"]["ID"])); } }
function formatRow($r) { $DB = CDatabase::GetModuleConnection('search'); $rs = $DB->Query(" select sc.ID ,sc.MODULE_ID ,sc.ITEM_ID ,sc.TITLE ,sc.TAGS ,sc.BODY ,sc.PARAM1 ,sc.PARAM2 ,sc.UPD ,sc.DATE_FROM ,sc.DATE_TO ,sc.URL ,sc.CUSTOM_RANK ,".$DB->DateToCharFunction("sc.DATE_CHANGE")." as FULL_DATE_CHANGE ,".$DB->DateToCharFunction("sc.DATE_CHANGE", "SHORT")." as DATE_CHANGE ,scsite.SITE_ID ,scsite.URL SITE_URL ".(BX_SEARCH_VERSION > 1? ",sc.USER_ID": "")." from b_search_content sc INNER JOIN b_search_content_site scsite ON sc.ID=scsite.SEARCH_CONTENT_ID where ID = ".$r["id"]." and scsite.SITE_ID = '".$DB->ForSql($this->sphinx->SITE_ID)."' "); $r = $rs->Fetch(); if ($r) { $r["TITLE_FORMATED"] = $this->buildExcerpts(htmlspecialcharsex($r["TITLE"])); $r["TITLE_FORMATED_TYPE"] = "html"; $r["TAGS_FORMATED"] = tags_prepare($r["TAGS"], SITE_ID); $r["BODY_FORMATED"] = $this->buildExcerpts(htmlspecialcharsex($r["BODY"])); $r["BODY_FORMATED_TYPE"] = "html"; } return $r; }
/** * <p>Получение списка тегов элементов поискового индекса. Метод динамичный.</p> <p>Данный метод использует технологию управляемого кеширования в случае соответствующей настройки <a href="http://dev.1c-bitrix.ru/api_help/search/constants.php">констант модуля поиска</a>: CACHED_b_search_tags и CACHED_b_search_tags_len.</p> * * * @param array $arSelect = array() Массив, содержащий поля для выборки. <br><br> Название поля может * принимать значение: <ul> <li> <b>NAME</b> - тег;</li> <li> <b>CNT</b> - частота тега, * количество элементов поискового индекса содержащих этот тег;</li> * <li> <b>DATE_CHANGE</b> - максимальная дата модификации (в полном формате) * элементов поискового индекса содержащих этот тег;</li> </ul> Не * обязательный параметр. По умолчанию равен: <pre class="syntax"> array(<br> * "NAME",<br> "CNT",<br> )<br></pre> * * @param array $arFilter = array() Массив, содержащий фильтр в виде наборов "название * поля"=>"значение фильтра". <br><br> Название поля может принимать * значение: <ul> <li> <b>SITE_ID</b> - массив идентификаторов сайтов;</li> <li> * <b>TAG</b> - начало тега, будут возвращены все теги начинающиеся с * этого значения;</li> <li> <b>MODULE_ID</b> - идентификатор модуля;</li> <li> * <b>PARAM1</b> - первый параметр элемента;</li> <li> <b>PARAM2</b> - второй параметр * элемента;</li> </ul> Пример: <pre class="syntax"> array(<br> "SITE_ID"=>array("s1"),<br> * "TAG"=>"We",<br> "MODULE_ID"=>"iblock",<br> )<br></pre> * * @param array $arOrder = array() Массив, содержащий признак сортировки в виде наборов "название * поля"=>"направление". <br><br> Название поля может принимать * значение: <ul> <li> <b>NAME</b> - тег;</li> <li> <b>CNT</b> - частота тега, количество * элементов поискового индекса содержащих этот тег;</li> <li> * <b>DATE_CHANGE</b> - максимальная дата модификации (в полном формате) * элементов поискового индекса содержащих этот тег;</li> </ul> * Направление сортировки может принимать значение: <ul> <li> <b>ASC</b> - по * возрастанию;</li> <li> <b>DESC</b> - по убыванию.</li> </ul> Не обязательный * параметр. По умолчанию равен: <pre class="syntax"> array(<br> "NAME"=>"ASC",<br> )<br></pre> * * @param int $limit = 100 Ограничение количества тегов в результатах. * * @return CDBResult <p>Возвращается результат запроса типа <a * href="http://dev.1c-bitrix.ru/api_help/main/reference/cdbresult/index.php">CDBResult</a>. При выборке из * результата методами класса CDBResult становятся доступны поля * перечисленные в параметре arSelect.</p> * * <h4>Example</h4> * <pre> * <?<br>//подключение модуля поиска<br>if(CModule::IncludeModule('search'))<br>{<br> $rsTags = CSearchTags::GetList(<br> array(),<br> array(<br> "MODULE_ID" => "iblock",<br> ),<br> array(<br> "CNT" => "DESC",<br> ),<br> 10<br> );<br> while($arTag = $rsTags->Fetch())<br> print_r($arTag);<br>}<br>?><br> * </pre> * * * <h4>See Also</h4> * <ul> <li><a href="http://dev.1c-bitrix.ru/api_help/search/constants.php">Константы модуля * поиска</a></li> </ul> <a name="examples"></a> * * * @static * @link http://dev.1c-bitrix.ru/api_help/search/classes/csearchtags/getlist.php * @author Bitrix */ public static function GetList($arSelect = array(), $arFilter = array(), $arOrder = array(), $limit = 100) { global $USER; $DB = CDatabase::GetModuleConnection('search'); static $arFilterEvents = false; $arQuerySelect = array(); if (!is_array($arSelect)) { $arSelect = array(); } if (count($arSelect) < 1) { $arSelect = array("NAME", "CNT"); } $bJoinSearchContent = false; foreach ($arSelect as $key => $value) { $value = strtoupper($value); switch ($value) { case "NAME": $arQuerySelect["NAME"] = "stags.NAME"; break; case "CNT": $arQuerySelect["CNT"] = "COUNT(DISTINCT stags.SEARCH_CONTENT_ID) as CNT"; break; case "DATE_CHANGE": $arQuerySelect["DC_TMP"] = "MAX(sc.DATE_CHANGE) as DC_TMP"; $arQuerySelect["FULL_DATE_CHANGE"] = $DB->DateToCharFunction("MAX(sc.DATE_CHANGE)", "FULL") . " as FULL_DATE_CHANGE"; $arQuerySelect["DATE_CHANGE"] = $DB->DateToCharFunction("MAX(sc.DATE_CHANGE)", "SHORT") . " as DATE_CHANGE"; $bJoinSearchContent = true; break; } } $arQueryWhere = array(); if (!is_array($arFilter)) { $arFilter = array("TAG" => $arFilter, "SITE_ID" => array(SITE_ID)); } if (empty($arFilter["SITE_ID"]) && array_key_exists("TAG", $arFilter)) { $arFilter["SITE_ID"] = array(SITE_ID); } if (array_key_exists("SITE_ID", $arFilter) && !is_array($arFilter["SITE_ID"])) { $arFilter["SITE_ID"] = array($arFilter["SITE_ID"]); } $strTag = ""; foreach ($arFilter as $key => $value) { $key = strtoupper($key); switch ($key) { case "SITE_ID": $arSites = array(); foreach ($value as $site_id) { $arSites[$DB->ForSql($site_id, 2)] = true; } $arSites = array_keys($arSites); if (count($arSites) == 1) { $arQueryWhere[] = "stags.SITE_ID = '" . $arSites[0] . "'"; } elseif (count($arSites) > 1) { $arQueryWhere[] = "stags.SITE_ID in ('" . implode("', '", $arSites) . "')"; } break; case "TAG": $arTags = tags_prepare($value, $arFilter["SITE_ID"][0]); if (count($arTags) > 0) { $strTag = array_pop($arTags); $arQueryWhere[] = "UPPER(stags.NAME) LIKE '" . $DB->ForSql(ToUpper($strTag)) . "%'"; } break; case "MODULE_ID": case "PARAM1": case "PARAM2": $arQueryWhere[] = "sc." . $key . " ='" . $DB->ForSql($value) . "'"; $bJoinSearchContent = true; break; case "PARAMS": if (is_array($value)) { foreach ($value as $p_key => $p_val) { if (is_array($p_val)) { foreach ($p_val as $i => $val2) { $p_val[$i] = $DB->ForSQL($val2); } $p_where = " in ('" . implode("', '", $p_val) . "')"; } else { $p_where = " = '" . $DB->ForSQL($p_val) . "'"; } $arQueryWhere[] = "EXISTS (SELECT * FROM b_search_content_param WHERE SEARCH_CONTENT_ID = stags.SEARCH_CONTENT_ID AND PARAM_NAME = '" . $DB->ForSQL($p_key) . "' AND PARAM_VALUE " . $p_where . ")"; } } break; default: if (!is_array($arFilterEvents)) { $arFilterEvents = GetModuleEvents("search", "OnSearchPrepareFilter", true); } //Try to get someone to make the filter sql foreach ($arFilterEvents as $arEvent) { $sql = ExecuteModuleEventEx($arEvent, array("sc.", $key, $value)); if (strlen($sql)) { $arQueryWhere[] = "(" . $sql . ")"; $bJoinSearchContent = true; break; } } } } $arQueryOrder = array(); if (!is_array($arOrder)) { $arOrder = array(); } if (count($arOrder) < 1) { $arOrder = array("NAME" => "ASC"); } foreach ($arOrder as $key => $value) { $key = strtoupper($key); $value = strtoupper($value) == "DESC" ? "DESC" : "ASC"; switch ($key) { case "NAME": case "CNT": $arQueryOrder[$key] = $key . " " . $value; break; case "DATE_CHANGE": $arQueryOrder[$key] = "DC_TMP " . $value; $arQuerySelect["DC_TMP"] = "MAX(sc.DATE_CHANGE) as DC_TMP"; $arQuerySelect["FULL_DATE_CHANGE"] = $DB->DateToCharFunction("MAX(sc.DATE_CHANGE)", "FULL") . " as FULL_DATE_CHANGE"; $arQuerySelect["DATE_CHANGE"] = $DB->DateToCharFunction("MAX(sc.DATE_CHANGE)", "SHORT") . " as DATE_CHANGE"; $bJoinSearchContent = true; break; } } if (count($arQueryOrder) < 1) { $arQueryOrder = array("NAME" => "NAME ASC"); } $strSql = "\n\t\t\tSELECT /*TOP*/\n\t\t\t\t" . implode("\n,", $arQuerySelect) . "\n\t\t\tFROM b_search_tags stags\n\t\t\t\t" . ($bJoinSearchContent ? "INNER JOIN b_search_content sc ON sc.ID = stags.SEARCH_CONTENT_ID" : "") . "\n\t\t\tWHERE\n\t\t\t\t" . CSearch::CheckPermissions("stags.SEARCH_CONTENT_ID") . "\n\t\t\t\t" . (count($arQueryWhere) > 0 ? "AND " . implode("\nAND ", $arQueryWhere) : "") . "\n\t\t\tGROUP BY stags.NAME\n\t\t\tORDER BY " . implode(", ", $arQueryOrder) . "\n\t\t"; if ($limit !== false) { $limit = intVal($limit); if ($limit <= 0 || $limit > COption::GetOptionInt("search", "max_result_size")) { $limit = COption::GetOptionInt("search", "max_result_size"); } if ($limit < 1) { $limit = 100; } $strSql = CSearch::FormatLimit($strSql, $limit); } else { $strSql = str_replace("/*TOP*/", "", $strSql); } if (CACHED_b_search_tags !== false && $limit !== false && strlen($strTag) <= CACHED_b_search_tags_len) { global $CACHE_MANAGER; $path = "b_search_tags"; while (strlen($strTag) > 0) { $path .= "/_" . ord(substr($strTag, 0, 1)); $strTag = substr($strTag, 1); } $cache_id = "search_tags:" . md5($strSql); if ($CACHE_MANAGER->Read(CACHED_b_search_tags, $cache_id, $path)) { $arTags = $CACHE_MANAGER->Get($cache_id); } else { $arTags = array(); $res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); while ($ar = $res->Fetch()) { $arTags[] = $ar; } $CACHE_MANAGER->Set($cache_id, $arTags); } $res = new CDBResult(); $res->InitFromArray($arTags); return $res; } else { return $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); } }