예제 #1
0
 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"]);
     }
 }
예제 #2
0
 $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;
예제 #3
0
 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 = "";
             }
         }
     }
 }
예제 #4
0
 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;
 }
예제 #5
0
파일: search.php 프로젝트: nycmic/bittest
	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;
	}
예제 #6
0
         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"]));
     }
 }
예제 #7
0
파일: sphinx.php 프로젝트: nycmic/bittest
	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;
	}
예제 #8
0
 /**
  * <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() Массив, содержащий фильтр в виде наборов "название
  * поля"=&gt;"значение фильтра". <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"=&gt;array("s1"),<br>
  * "TAG"=&gt;"We",<br> "MODULE_ID"=&gt;"iblock",<br> )<br></pre>
  *
  * @param array $arOrder = array() Массив, содержащий признак сортировки в виде наборов "название
  * поля"=&gt;"направление". <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"=&gt;"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>
  * &lt;?<br>//подключение модуля поиска<br>if(CModule::IncludeModule('search'))<br>{<br>	$rsTags = CSearchTags::GetList(<br>		array(),<br>		array(<br>			"MODULE_ID" =&gt; "iblock",<br>		),<br>		array(<br>			"CNT" =&gt; "DESC",<br>		),<br>		10<br>	);<br>	while($arTag = $rsTags-&gt;Fetch())<br>		print_r($arTag);<br>}<br>?&gt;<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__);
     }
 }