Your IP : 3.142.200.79
<?
use Bitrix\Main\Loader,
Bitrix\Main;
IncludeModuleLangFile(__FILE__);
class CAllIBlock
{
public $LAST_ERROR = "";
protected static $disabledCacheTag = array();
protected static $enableClearTagCache = 0;
protected static $catalogIncluded = null;
protected static $workflowIncluded = null;
public static function ShowPanel($IBLOCK_ID=0, $ELEMENT_ID=0, $SECTION_ID="", $type="news", $bGetIcons=false, $componentName="", $arLabels=array())
{
/** @global CMain $APPLICATION */
global $APPLICATION;
/** @global CUser $USER */
global $USER;
if (($USER->IsAuthorized() || $APPLICATION->ShowPanel===true) && $APPLICATION->ShowPanel!==false)
{
if (CModule::IncludeModule("iblock") && strlen($type) > 0)
{
$arButtons = CIBlock::GetPanelButtons($IBLOCK_ID, $ELEMENT_ID, $SECTION_ID, array(
"LABELS" => $arLabels,
));
$mode = $APPLICATION->GetPublicShowMode();
if($bGetIcons)
{
return CIBlock::GetComponentMenu($mode, $arButtons);
}
else
{
CIBlock::AddPanelButtons($mode, $componentName, $arButtons);
}
}
}
return null;
}
public static function AddPanelButtons($mode, $componentName, $arButtons)
{
/** @global CMain $APPLICATION */
global $APPLICATION;
$arImages = array(
"add_element" => (defined("PANEL_ADD_ELEMENT_BTN")) ? PANEL_ADD_ELEMENT_BTN : "/bitrix/images/iblock/icons/new_element.gif",
"edit_element" => (defined("PANEL_EDIT_ELEMENT_BTN")) ? PANEL_EDIT_ELEMENT_BTN : "/bitrix/images/iblock/icons/edit_element.gif",
"edit_iblock" => (defined("PANEL_EDIT_IBLOCK_BTN")) ? PANEL_EDIT_IBLOCK_BTN : "/bitrix/images/iblock/icons/edit_iblock.gif",
"history_element" => (defined("PANEL_HISTORY_ELEMENT_BTN")) ? PANEL_HISTORY_ELEMENT_BTN : "/bitrix/images/iblock/icons/history.gif",
"edit_section" => (defined("PANEL_EDIT_SECTION_BTN")) ? PANEL_EDIT_SECTION_BTN : "/bitrix/images/iblock/icons/edit_section.gif",
"add_section" => (defined("PANEL_ADD_SECTION_BTN")) ? PANEL_ADD_SECTION_BTN : "/bitrix/images/iblock/icons/new_section.gif",
"element_list" => "/bitrix/themes/.default/icons/iblock/mnu_iblock_el.gif",
"section_list" => "/bitrix/themes/.default/icons/iblock/mnu_iblock_sec.gif",
);
$componentName = (string)$componentName;
if (!empty($arButtons[$mode]) && is_array($arButtons[$mode]))
{
//Try to detect component via backtrace
if ($componentName === '' && function_exists("debug_backtrace"))
{
$arTrace = debug_backtrace();
foreach($arTrace as $arCallInfo)
{
if (isset($arCallInfo["file"]))
{
$file = strtolower(str_replace("\\", "/", $arCallInfo["file"]));
if(preg_match("#.*/bitrix/components/(.+?)/(.+?)/#", $file, $match))
{
$componentName = $match[1].":".$match[2];
break;
}
}
}
}
if ($componentName !== '')
{
$arComponentDescription = CComponentUtil::GetComponentDescr($componentName);
if(is_array($arComponentDescription) && strlen($arComponentDescription["NAME"]))
$componentName = $arComponentDescription["NAME"];
}
else
{
$componentName = GetMessage("IBLOCK_PANEL_UNKNOWN_COMPONENT");
}
$arPanelButton = array(
"SRC" => "/bitrix/images/iblock/icons/iblock.gif",
"ALT" => $componentName,
"TEXT" => $componentName,
"MAIN_SORT" => 300,
"SORT" => 30,
"MENU" => array(),
"MODE" => $mode,
);
foreach($arButtons[$mode] as $i=>$arSubButton)
{
if (isset($arImages[$i]))
$arSubButton['IMAGE'] = $arImages[$i];
if($arSubButton["DEFAULT"])
$arPanelButton["HREF"] = $arSubButton["ACTION"];
$arPanelButton["MENU"][] = $arSubButton;
}
if (!empty($arButtons["submenu"]) && is_array($arButtons["submenu"]))
{
$arSubMenu = array(
"SRC" => "/bitrix/images/iblock/icons/iblock.gif",
"ALT" => GetMessage("IBLOCK_PANEL_CONTROL_PANEL_ALT"),
"TEXT" => GetMessage("IBLOCK_PANEL_CONTROL_PANEL"),
"MENU" => array(),
"MODE" => $mode,
);
foreach($arButtons["submenu"] as $i=>$arSubButton)
{
if (isset($arImages[$i]))
$arSubButton['IMAGE'] = $arImages[$i];
$arSubMenu["MENU"][] = $arSubButton;
}
$arPanelButton["MENU"][] = array("SEPARATOR" => "Y");
$arPanelButton["MENU"][] = $arSubMenu;
}
$APPLICATION->AddPanelButton($arPanelButton);
}
if (!empty($arButtons["intranet"]) && is_array($arButtons["intranet"]) && CModule::IncludeModule("intranet"))
{
/** @global CIntranetToolbar $INTRANET_TOOLBAR */
global $INTRANET_TOOLBAR;
foreach($arButtons["intranet"] as $arButton)
$INTRANET_TOOLBAR->AddButton($arButton);
}
}
public static function GetComponentMenu($mode, $arButtons)
{
$arImages = array(
"add_element" => "/bitrix/images/iblock/icons/new_element.gif",
"edit_element" => "/bitrix/images/iblock/icons/edit_element.gif",
"edit_iblock" => "/bitrix/images/iblock/icons/edit_iblock.gif",
"history_element" => "/bitrix/images/iblock/icons/history.gif",
"edit_section" => "/bitrix/images/iblock/icons/edit_section.gif",
"add_section" => "/bitrix/images/iblock/icons/new_section.gif",
"element_list" => "/bitrix/themes/.default/icons/iblock/mnu_iblock_el.gif",
"section_list" => "/bitrix/themes/.default/icons/iblock/mnu_iblock_sec.gif",
);
$arResult = array();
foreach($arButtons[$mode] as $i=>$arButton)
{
$arButton['URL'] = $arButton['ACTION'];
unset($arButton['ACTION']);
$arButton['IMAGE'] = $arImages[$i];
$arResult[] = $arButton;
}
return $arResult;
}
public static function GetPanelButtons($IBLOCK_ID=0, $ELEMENT_ID=0, $SECTION_ID=0, $arOptions=array())
{
/** @global CMain $APPLICATION */
global $APPLICATION;
$windowParams = array('width' => 700, 'height' => 400, 'resize' => false);
$arButtons = array(
"view" => array(),
"edit" => array(),
"configure" => array(),
"submenu" => array(),
);
$bSectionButtons = !(isset($arOptions['SECTION_BUTTONS']) && $arOptions['SECTION_BUTTONS'] === false);
$bSessID = !(isset($arOptions['SESSID']) && $arOptions['SESSID'] === false);
$IBLOCK_ID = (int)$IBLOCK_ID;
$ELEMENT_ID = (int)$ELEMENT_ID;
$SECTION_ID = (int)$SECTION_ID;
if(($ELEMENT_ID > 0) && (($IBLOCK_ID <= 0) || ($bSectionButtons && $SECTION_ID == 0)))
{
$rsIBlockElement = CIBlockElement::GetList(array(), array(
"ID" => $ELEMENT_ID,
"ACTIVE_DATE" => "Y",
"ACTIVE" => "Y",
"CHECK_PERMISSIONS" => "Y",
), false, false, array("ID", "IBLOCK_ID", "IBLOCK_SECTION_ID"));
if($arIBlockElement = $rsIBlockElement->Fetch())
{
$IBLOCK_ID = $arIBlockElement["IBLOCK_ID"];
$SECTION_ID = $arIBlockElement["IBLOCK_SECTION_ID"];
}
}
if($IBLOCK_ID <= 0)
return $arButtons;
$bCatalog = false;
$useCatalogButtons = (($ELEMENT_ID <= 0 || isset($arOptions['SHOW_CATALOG_BUTTONS'])) && !empty($arOptions['USE_CATALOG_BUTTONS']) && is_array($arOptions['USE_CATALOG_BUTTONS']));
$catalogButtons = array();
if ($useCatalogButtons || (isset($arOptions["CATALOG"]) && $arOptions["CATALOG"] == true))
{
if (self::$catalogIncluded === null)
self::$catalogIncluded = \Bitrix\Main\Loader::includeModule('catalog');
$bCatalog = self::$catalogIncluded;
if (!self::$catalogIncluded)
$useCatalogButtons = false;
}
if ($useCatalogButtons)
{
if (isset($arOptions['USE_CATALOG_BUTTONS']['add_product']) && $arOptions['USE_CATALOG_BUTTONS']['add_product'] == true)
$catalogButtons['add_product'] = true;
if (isset($arOptions['USE_CATALOG_BUTTONS']['add_sku']) && $arOptions['USE_CATALOG_BUTTONS']['add_sku'] == true)
$catalogButtons['add_sku'] = true;
if (empty($catalogButtons))
$useCatalogButtons = false;
}
$return_url = array(
"add_element" => "",
"edit_element" => "",
"edit_iblock" => "",
"history_element" => "",
"edit_section" => "",
"add_section" => "",
"delete_section" => "",
"delete_element" => "",
"element_list" => "",
"section_list" => "",
);
if(isset($arOptions['RETURN_URL']))
{
if(is_array($arOptions["RETURN_URL"]))
{
foreach($arOptions["RETURN_URL"] as $key => $url)
if(!empty($url) && array_key_exists($key, $return_url))
$return_url[$key] = $url;
}
elseif(!empty($arOptions["RETURN_URL"]))
{
foreach($return_url as $key => $url)
$return_url[$key] = $arOptions["RETURN_URL"];
}
}
$str = "";
foreach($return_url as $key => $url)
{
if(empty($url))
{
if(empty($str))
{
$str = \Bitrix\Main\Context::getCurrent()->getServer()->getRequestUri();
if(defined("BX_AJAX_PARAM_ID"))
$str = CHTTP::urlDeleteParams($str, array(BX_AJAX_PARAM_ID));
}
$return_url[$key] = $str;
}
}
$arIBlock = CIBlock::GetArrayByID($IBLOCK_ID);
if (self::$workflowIncluded === null)
self::$workflowIncluded = \Bitrix\Main\Loader::includeModule('workflow');
$bWorkflow = self::$workflowIncluded && ($arIBlock["WORKFLOW"] !== "N");
$s = $bWorkflow? "&WF=Y": "";
$arLabels = $arOptions["LABELS"];
if($ELEMENT_ID > 0 && CIBlockElementRights::UserHasRightTo($IBLOCK_ID, $ELEMENT_ID, "element_edit"))
{
$url = "/bitrix/admin/".CIBlock::GetAdminElementEditLink($IBLOCK_ID, $ELEMENT_ID, array(
"force_catalog" => $bCatalog,
"filter_section" => $SECTION_ID,
"bxpublic" => "Y",
"from_module" => "iblock",
"return_url" => $return_url["edit_element"],
)).$s;
$action = $APPLICATION->GetPopupLink(
array(
"URL" => $url,
"PARAMS" => $windowParams,
)
);
$arButton = array(
"TEXT" => (strlen($arLabels["ELEMENT_EDIT_TEXT"])? $arLabels["ELEMENT_EDIT_TEXT"]: $arIBlock["ELEMENT_EDIT"]),
"TITLE" => (strlen($arLabels["ELEMENT_EDIT_TITLE"])? $arLabels["ELEMENT_EDIT_TITLE"]: $arIBlock["ELEMENT_EDIT"]),
"ACTION" => 'javascript:'.$action,
"ACTION_URL" => $url,
"ONCLICK" => $action,
"DEFAULT" => ($APPLICATION->GetPublicShowMode() != 'configure'? true: false),
"ICON" => "bx-context-toolbar-edit-icon",
"ID" => "bx-context-toolbar-edit-element"
);
$arButtons["edit"]["edit_element"] = $arButton;
$arButtons["configure"]["edit_element"] = $arButton;
$url = str_replace("&bxpublic=Y&from_module=iblock", "", $url);
$arButton["ACTION"] = "javascript:jsUtils.Redirect([], '".CUtil::JSEscape($url)."')";
unset($arButton["ONCLICK"]);
$arButtons["submenu"]["edit_element"] = $arButton;
if($bWorkflow)
{
$url = "/bitrix/admin/iblock_history_list.php?type=".$arIBlock["IBLOCK_TYPE_ID"]."&lang=".LANGUAGE_ID."&IBLOCK_ID=".$IBLOCK_ID."&ELEMENT_ID=".$ELEMENT_ID."&filter_section=".$SECTION_ID."&return_url=".UrlEncode($return_url["history_element"]);
$arButton = array(
"TEXT" => GetMessage("IBLOCK_PANEL_HISTORY_BUTTON"),
"TITLE" => GetMessage("IBLOCK_PANEL_HISTORY_BUTTON"),
"ACTION" => "javascript:jsUtils.Redirect([], '".CUtil::JSEscape($url)."')",
"ONCLICK" => "jsUtils.Redirect([], '".CUtil::JSEscape($url)."')",
"ID" => "bx-context-toolbar-history-element"
);
$arButtons["submenu"]["history_element"] = $arButton;
}
}
if(CIBlockSectionRights::UserHasRightTo($IBLOCK_ID, $SECTION_ID, "section_element_bind"))
{
$params = array(
"force_catalog" => $bCatalog,
"filter_section" => $SECTION_ID,
"IBLOCK_SECTION_ID" => $SECTION_ID,
"bxpublic" => "Y",
"from_module" => "iblock",
"return_url" => $return_url["add_element"],
);
if ($useCatalogButtons)
{
CCatalogAdminTools::setProductFormParams();
CCatalogAdminTools::setCatalogPanelButtons($arButtons, $IBLOCK_ID, $catalogButtons, $params, $windowParams);
}
else
{
$url = "/bitrix/admin/".CIBlock::GetAdminElementEditLink($IBLOCK_ID, null, $params);
$action = $APPLICATION->GetPopupLink(
array(
"URL" => $url,
"PARAMS" => $windowParams,
)
);
$arButton = array(
"TEXT" => (strlen($arLabels["ELEMENT_ADD_TEXT"]) ? $arLabels["ELEMENT_ADD_TEXT"] : $arIBlock["ELEMENT_ADD"]),
"TITLE" => (strlen($arLabels["ELEMENT_ADD_TITLE"]) ? $arLabels["ELEMENT_ADD_TITLE"] : $arIBlock["ELEMENT_ADD"]),
"ACTION" => 'javascript:'.$action,
"ACTION_URL" => $url,
"ONCLICK" => $action,
"ICON" => "bx-context-toolbar-create-icon",
"ID" => "bx-context-toolbar-add-element",
);
$arButtons["edit"]["add_element"] = $arButton;
$arButtons["configure"]["add_element"] = $arButton;
$arButtons["intranet"][] = array(
'TEXT' => $arButton["TEXT"],
'TITLE' => $arButton["TITLE"],
'ICON' => 'add',
'ONCLICK' => $arButton["ACTION"],
'SORT' => 1000,
);
$url = str_replace("&bxpublic=Y&from_module=iblock", "", $url);
$arButton["ACTION"] = "javascript:jsUtils.Redirect([], '".CUtil::JSEscape($url)."')";
unset($arButton["ONCLICK"]);
$arButtons["submenu"]["add_element"] = $arButton;
}
}
if($ELEMENT_ID > 0 && CIBlockElementRights::UserHasRightTo($IBLOCK_ID, $ELEMENT_ID, "element_delete"))
{
//Delete Element
if(!empty($arButtons["edit"]))
$arButtons["edit"][] = array("SEPARATOR" => "Y", "HREF" => "");
if(!empty($arButtons["configure"]))
$arButtons["configure"][] = array("SEPARATOR" => "Y", "HREF" => "");
if(!empty($arButtons["submenu"]))
$arButtons["submenu"][] = array("SEPARATOR" => "Y", "HREF" => "");
$url = CIBlock::GetAdminElementListLink($IBLOCK_ID, array('action'=>'delete'));
if($bSessID)
$url .= '&'.bitrix_sessid_get();
$url .= '&ID='.(preg_match('/^iblock_list_admin\.php/', $url)? "E": "").$ELEMENT_ID."&return_url=".UrlEncode($return_url["delete_element"]);
$url = "/bitrix/admin/".$url;
$arButton = array(
"TEXT" => (strlen($arLabels["ELEMENT_DELETE_TEXT"])? $arLabels["ELEMENT_DELETE_TEXT"]: $arIBlock["ELEMENT_DELETE"]),
"TITLE" => (strlen($arLabels["ELEMENT_DELETE_TITLE"])? $arLabels["ELEMENT_DELETE_TITLE"]: $arIBlock["ELEMENT_DELETE"]),
"ACTION"=>"javascript:if(confirm('".GetMessageJS("IBLOCK_PANEL_ELEMENT_DEL_CONF")."'))jsUtils.Redirect([], '".CUtil::JSEscape($url)."')",
"ACTION_URL" => $url,
"ONCLICK"=>"if(confirm('".GetMessageJS("IBLOCK_PANEL_ELEMENT_DEL_CONF")."'))jsUtils.Redirect([], '".CUtil::JSEscape($url)."')",
"ICON" => "bx-context-toolbar-delete-icon",
"ID" => "bx-context-toolbar-delete-element"
);
$arButtons["edit"]["delete_element"] = $arButton;
$arButtons["configure"]["delete_element"] = $arButton;
$arButtons["submenu"]["delete_element"] = $arButton;
}
if($ELEMENT_ID <= 0 && $bSectionButtons)
{
$rsIBTYPE = CIBlockType::GetByID($arIBlock["IBLOCK_TYPE_ID"]);
if(($arIBTYPE = $rsIBTYPE->Fetch()) && ($arIBTYPE["SECTIONS"] == "Y"))
{
if($SECTION_ID > 0 && CIBlockSectionRights::UserHasRightTo($IBLOCK_ID, $SECTION_ID, "section_edit"))
{
if(!empty($arButtons["edit"]))
$arButtons["edit"][] = array("SEPARATOR" => "Y", "HREF" => "");
if(!empty($arButtons["configure"]))
$arButtons["configure"][] = array("SEPARATOR" => "Y", "HREF" => "");
if(!empty($arButtons["submenu"]))
$arButtons["submenu"][] = array("SEPARATOR" => "Y", "HREF" => "");
$url = "/bitrix/admin/".CIBlock::GetAdminSectionEditLink($IBLOCK_ID, $SECTION_ID, array(
"force_catalog" => $bCatalog,
"filter_section" => $SECTION_ID,
"bxpublic" => "Y",
"from_module" => "iblock",
"return_url" => $return_url["edit_section"],
));
$action = $APPLICATION->GetPopupLink(
array(
"URL" => $url,
"PARAMS" => $windowParams,
)
);
$arButton = array(
"TEXT" => (strlen($arLabels["SECTION_EDIT_TEXT"])? $arLabels["SECTION_EDIT_TEXT"]: $arIBlock["SECTION_EDIT"]),
"TITLE" => (strlen($arLabels["SECTION_EDIT_TITLE"])? $arLabels["SECTION_EDIT_TITLE"]: $arIBlock["SECTION_EDIT"]),
"ACTION" => 'javascript:'.$action,
"ACTION_URL" => $url,
"ICON" => "bx-context-toolbar-edit-icon",
"ONCLICK" => $action,
"DEFAULT" => ($APPLICATION->GetPublicShowMode() != 'configure'? true: false),
"ID" => "bx-context-toolbar-edit-section"
);
$arButtons["edit"]["edit_section"] = $arButton;
$arButtons["configure"]["edit_section"] = $arButton;
$url = str_replace("&bxpublic=Y&from_module=iblock", "", $url);
$arButton["ACTION"] = "javascript:jsUtils.Redirect([], '".CUtil::JSEscape($url)."')";
unset($arButton["ONCLICK"]);
$arButtons["submenu"]["edit_section"] = $arButton;
}
if(CIBlockSectionRights::UserHasRightTo($IBLOCK_ID, $SECTION_ID, "section_section_bind"))
{
$url = "/bitrix/admin/".CIBlock::GetAdminSectionEditLink($IBLOCK_ID, null, array(
"force_catalog" => $bCatalog,
"IBLOCK_SECTION_ID" => $SECTION_ID,
"filter_section" => $SECTION_ID,
"bxpublic" => "Y",
"from_module" => "iblock",
"return_url" => $return_url["add_section"],
));
$action = $APPLICATION->GetPopupLink(
array(
"URL" => $url,
"PARAMS" => $windowParams,
)
);
$arButton = array(
"TEXT" => (strlen($arLabels["SECTION_ADD_TEXT"])? $arLabels["SECTION_ADD_TEXT"]: $arIBlock["SECTION_ADD"]),
"TITLE" => (strlen($arLabels["SECTION_ADD_TITLE"])? $arLabels["SECTION_ADD_TITLE"]: $arIBlock["SECTION_ADD"]),
"ACTION" => 'javascript:'.$action,
"ACTION_URL" => $url,
"ICON" => "bx-context-toolbar-create-icon",
"ID" => "bx-context-toolbar-add-section",
"ONCLICK" => $action
);
$arButtons["edit"]["add_section"] = $arButton;
$arButtons["configure"]["add_section"] = $arButton;
$url = str_replace("&bxpublic=Y&from_module=iblock", "", $url);
$arButton["ACTION"] = "javascript:jsUtils.Redirect([], '".CUtil::JSEscape($url)."')";
unset($arButton["ONCLICK"]);
$arButtons["submenu"]["add_section"] = $arButton;
}
//Delete section
if($SECTION_ID > 0 && CIBlockSectionRights::UserHasRightTo($IBLOCK_ID, $SECTION_ID, "section_delete"))
{
$url = CIBlock::GetAdminSectionListLink($IBLOCK_ID, Array('action'=>'delete'));
if($bSessID)
$url .= '&'.bitrix_sessid_get();
$url .= '&ID[]='.(preg_match('/^iblock_list_admin\.php/', $url)? "S": "").$SECTION_ID."&return_url=".UrlEncode($return_url["delete_section"]);
$url = "/bitrix/admin/".$url;
$arButton = array(
"TEXT" => (strlen($arLabels["SECTION_DELETE_TEXT"])? $arLabels["SECTION_DELETE_TEXT"]: $arIBlock["SECTION_DELETE"]),
"TITLE" => (strlen($arLabels["SECTION_DELETE_TITLE"])? $arLabels["SECTION_DELETE_TITLE"]: $arIBlock["SECTION_DELETE"]),
"ACTION" => "javascript:if(confirm('".GetMessageJS("IBLOCK_PANEL_SECTION_DEL_CONF")."'))jsUtils.Redirect([], '".CUtil::JSEscape($url)."')",
"ACTION_URL" => $url,
"ONCLICK" => "if(confirm('".GetMessageJS("IBLOCK_PANEL_SECTION_DEL_CONF")."'))jsUtils.Redirect([], '".CUtil::JSEscape($url)."')",
"ICON" => "bx-context-toolbar-delete-icon",
"ID" => "bx-context-toolbar-delete-section"
);
$arButtons["edit"]["delete_section"] = $arButton;
$arButtons["configure"]["delete_section"] = $arButton;
$arButtons["submenu"]["delete_section"] = $arButton;
}
}
}
if( ($IBLOCK_ID > 0) && CIBlockRights::UserHasRightTo($IBLOCK_ID, $IBLOCK_ID, "iblock_admin_display") )
{
if(!empty($arButtons["submenu"]))
$arButtons["submenu"][] = array("SEPARATOR" => "Y", "HREF" => "");
if($SECTION_ID > 0)
$url = "/bitrix/admin/".CIBlock::GetAdminElementListLink($IBLOCK_ID , array('find_section_section'=>$SECTION_ID));
else
$url = "/bitrix/admin/".CIBlock::GetAdminElementListLink($IBLOCK_ID , array(
'find_el_y'=>'Y', 'clear_filter'=>'Y', 'apply_filter'=>'Y'));
$arButton = array(
"TEXT" => (strlen($arLabels["ELEMENTS_NAME_TEXT"])? $arLabels["ELEMENTS_NAME_TEXT"]: $arIBlock["ELEMENTS_NAME"]),
"TITLE" => (strlen($arLabels["ELEMENTS_NAME_TITLE"])? $arLabels["ELEMENTS_NAME_TITLE"]: $arIBlock["ELEMENTS_NAME"]),
"ACTION" => "javascript:jsUtils.Redirect([], '".CUtil::JSEscape($url)."')",
"ACTION_URL" => $url,
"ONCLICK" => "jsUtils.Redirect([], '".CUtil::JSEscape($url)."')",
"ID" => "bx-context-toolbar-elements-list"
);
$arButtons["submenu"]["element_list"] = $arButton;
$arButtons["intranet"]["element_list"] = array(
'TEXT' => $arButton["TEXT"],
'TITLE' => $arButton["TITLE"],
'ICON' => 'settings',
'ONCLICK' => $arButton["ACTION"],
'SORT' => 1010,
);
$url = "/bitrix/admin/".CIBlock::GetAdminSectionListLink($IBLOCK_ID, array('find_section_section'=>$SECTION_ID));
$arButton = array(
"TEXT" => (strlen($arLabels["SECTIONS_NAME_TEXT"])? $arLabels["SECTIONS_NAME_TEXT"]: $arIBlock["SECTIONS_NAME"]),
"TITLE" => (strlen($arLabels["SECTIONS_NAME_TITLE"])? $arLabels["SECTIONS_NAME_TITLE"]: $arIBlock["SECTIONS_NAME"]),
"ACTION" => "javascript:jsUtils.Redirect([], '".CUtil::JSEscape($url)."')",
"ACTION_URL" => $url,
"ONCLICK" => "jsUtils.Redirect([], '".CUtil::JSEscape($url)."')",
"ID" => "bx-context-toolbar-sections-list"
);
$arButtons["submenu"]["section_list"] = $arButton;
if(CIBlockRights::UserHasRightTo($IBLOCK_ID, $IBLOCK_ID, "iblock_edit"))
{
$url = "/bitrix/admin/iblock_edit.php?type=".$arIBlock["IBLOCK_TYPE_ID"]."&lang=".LANGUAGE_ID."&ID=".$IBLOCK_ID."&return_url=".UrlEncode($return_url["edit_iblock"]);
$arButton = array(
"TEXT" => GetMessage("IBLOCK_PANEL_EDIT_IBLOCK_BUTTON", array("#IBLOCK_NAME#"=>$arIBlock["NAME"])),
"TITLE" => GetMessage("IBLOCK_PANEL_EDIT_IBLOCK_BUTTON", array("#IBLOCK_NAME#"=>$arIBlock["NAME"])),
"ACTION" => "javascript:jsUtils.Redirect([], '".CUtil::JSEscape($url)."')",
"ACTION_URL" => $url,
"ONCLICK" => "jsUtils.Redirect([], '".CUtil::JSEscape($url)."')",
"ID" => "bx-context-toolbar-edit-iblock"
);
$arButtons["submenu"]["edit_iblock"] = $arButton;
}
}
return $arButtons;
}
/**
* @param int $iblock_id
* @return CDBResult
*/
public static function GetSite($iblock_id)
{
/** @global CDatabase $DB */
global $DB;
$strSql = "SELECT L.*, BS.* FROM b_iblock_site BS, b_lang L WHERE L.LID=BS.SITE_ID AND BS.IBLOCK_ID=".IntVal($iblock_id);
return $DB->Query($strSql);
}
///////////////////////////////////////////////////////////////////
// Block by ID
///////////////////////////////////////////////////////////////////
public static function GetByID($ID)
{
return CIBlock::GetList(Array(), Array("ID"=>$ID));
}
/**
* @param int $ID
* @param string $FIELD
* @return mixed
*/
public static function GetArrayByID($ID, $FIELD = "")
{
/** @global CDatabase $DB */
global $DB;
$ID = (int)$ID;
if ($ID <= 0)
return false;
if(CACHED_b_iblock === false)
{
$res = $DB->Query("
SELECT b_iblock.*,".$DB->DateToCharFunction("TIMESTAMP_X")." TIMESTAMP_X
from b_iblock
WHERE ID = ".$ID
);
$arResult = $res->Fetch();
if($arResult)
{
$arMessages = CIBlock::GetMessages($ID);
$arResult = array_merge($arResult, $arMessages);
$arResult["FIELDS"] = CIBlock::GetFields($ID);
}
}
else
{
global $CACHE_MANAGER;
$bucket_size = intval(CACHED_b_iblock_bucket_size);
if($bucket_size<=0) $bucket_size = 20;
$bucket = intval($ID/$bucket_size);
$cache_id = $bucket_size."iblock".$bucket;
if($CACHE_MANAGER->Read(CACHED_b_iblock, $cache_id, "b_iblock"))
{
$arIBlocks = $CACHE_MANAGER->Get($cache_id);
}
else
{
$arIBlocks = array();
$res = $DB->Query("
SELECT b_iblock.*,".$DB->DateToCharFunction("TIMESTAMP_X")." TIMESTAMP_X
from b_iblock
WHERE ID between ".($bucket*$bucket_size)." AND ".(($bucket+1)*$bucket_size-1)
);
while($arIBlock = $res->Fetch())
{
$arMessages = CIBlock::GetMessages($arIBlock["ID"]);
$arIBlock = array_merge($arIBlock, $arMessages);
$arIBlock["FIELDS"] = CIBlock::GetFields($arIBlock["ID"]);
$arIBlocks[$arIBlock["ID"]] = $arIBlock;
}
$CACHE_MANAGER->Set($cache_id, $arIBlocks);
}
if(isset($arIBlocks[$ID]))
{
$arResult = $arIBlocks[$ID];
if(!array_key_exists("ELEMENT_DELETE", $arResult))
{
$arMessages = CIBlock::GetMessages($ID);
$arResult = array_merge($arResult, $arMessages);
CIBlock::CleanCache($ID);
}
if (
!array_key_exists("FIELDS", $arResult)
|| !is_array($arResult["FIELDS"]["IBLOCK_SECTION"]["DEFAULT_VALUE"])
)
{
$arResult["FIELDS"] = CIBlock::GetFields($ID);
CIBlock::CleanCache($ID);
}
}
else
{
$arResult = false;
}
}
if (empty($arResult))
return false;
if ($FIELD)
{
if (array_key_exists($FIELD, $arResult))
return $arResult[$FIELD];
else
return null;
}
else
{
return $arResult;
}
}
public static function CleanCache($ID)
{
/** @global CCacheManager $CACHE_MANAGER */
global $CACHE_MANAGER;
$ID = intval($ID);
if(CACHED_b_iblock !== false)
{
$bucket_size = intval(CACHED_b_iblock_bucket_size);
if($bucket_size<=0) $bucket_size = 20;
$bucket = intval($ID/$bucket_size);
$cache_id = $bucket_size."iblock".$bucket;
$CACHE_MANAGER->Clean($cache_id, "b_iblock");
}
}
///////////////////////////////////////////////////////////////////
// New block
///////////////////////////////////////////////////////////////////
function Add($arFields)
{
/** @global CCacheManager $CACHE_MANAGER */
global $CACHE_MANAGER;
/** @global CDatabase $DB */
global $DB;
$SAVED_PICTURE = null;
//Default Yes
$arFields["ACTIVE"] = isset($arFields["ACTIVE"]) && $arFields["ACTIVE"] === "N"? "N": "Y";
$arFields["WORKFLOW"] = isset($arFields["WORKFLOW"]) && $arFields["WORKFLOW"] === "N"? "N": "Y";
$arFields["INDEX_ELEMENT"] = isset($arFields["INDEX_ELEMENT"]) && $arFields["INDEX_ELEMENT"] === "N"? "N": "Y";
//Default No
$arFields["BIZPROC"] = isset($arFields["BIZPROC"]) && $arFields["BIZPROC"] === "Y"? "Y": "N";
$arFields["INDEX_SECTION"] = isset($arFields["INDEX_SECTION"]) && $arFields["INDEX_SECTION"] === "Y"? "Y": "N";
if(!isset($arFields["SECTION_CHOOSER"]))
$arFields["SECTION_CHOOSER"] = "L";
elseif($arFields["SECTION_CHOOSER"] !== "D" && $arFields["SECTION_CHOOSER"] !== "P")
$arFields["SECTION_CHOOSER"] = "L";
if(!isset($arFields["DESCRIPTION_TYPE"]) || $arFields["DESCRIPTION_TYPE"] !== "html")
$arFields["DESCRIPTION_TYPE"] = "text";
$arFields["VERSION"] = isset($arFields["VERSION"]) && intval($arFields["VERSION"]) === 2? "2": "1";
if(isset($arFields["RIGHTS_MODE"]))
$arFields["RIGHTS_MODE"] = $arFields["RIGHTS_MODE"] === "E"? "E": "S";
elseif(isset($arFields["RIGHTS"]))
$arFields["RIGHTS_MODE"] = "E";
else
$arFields["RIGHTS_MODE"] = "S";
if(array_key_exists("PICTURE", $arFields))
{
if(
!is_array($arFields["PICTURE"])
|| (
strlen($arFields["PICTURE"]["name"]) <= 0
&& strlen($arFields["PICTURE"]["del"]) <= 0
)
)
unset($arFields["PICTURE"]);
else
$arFields["PICTURE"]["MODULE_ID"] = "iblock";
}
if(array_key_exists("SITE_ID", $arFields))
{
$arFields["LID"] = $arFields["SITE_ID"];
unset($arFields["SITE_ID"]);
}
if(array_key_exists("EXTERNAL_ID", $arFields))
{
$arFields["XML_ID"] = $arFields["EXTERNAL_ID"];
unset($arFields["EXTERNAL_ID"]);
}
if(array_key_exists("SECTION_PROPERTY", $arFields))
$arFields["SECTION_PROPERTY"] = "Y";
unset($arFields["ID"]);
if(!$this->CheckFields($arFields))
{
$Result = false;
$arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
}
else
{
$arLID = array();
if(array_key_exists("LID", $arFields))
{
if(is_array($arFields["LID"]))
{
foreach($arFields["LID"] as $site_id)
$arLID[$site_id] = $DB->ForSQL($site_id);
}
else
{
$arLID[$arFields["LID"]] = $DB->ForSQL($arFields["LID"]);
}
}
if(empty($arLID))
unset($arFields["LID"]);
else
$arFields["LID"] = end($arLID);
if(array_key_exists("PICTURE", $arFields))
{
$SAVED_PICTURE = $arFields["PICTURE"];
CFile::SaveForDB($arFields, "PICTURE", "iblock");
}
$ID = $DB->Add("b_iblock", $arFields, array("DESCRIPTION"), "iblock");
if(array_key_exists("PICTURE", $arFields))
{
$arFields["PICTURE"] = $SAVED_PICTURE;
}
$this->SetMessages($ID, $arFields);
if(array_key_exists("FIELDS", $arFields) && is_array($arFields["FIELDS"]))
$this->SetFields($ID, $arFields["FIELDS"]);
if($arFields["RIGHTS_MODE"] === "E")
{
if(
!array_key_exists("RIGHTS", $arFields)
&& array_key_exists("GROUP_ID", $arFields)
&& is_array($arFields["GROUP_ID"])
)
{
$obIBlockRights = new CIBlockRights($ID);
$obIBlockRights->SetRights($obIBlockRights->ConvertGroups($arFields["GROUP_ID"]));
}
elseif(
array_key_exists("RIGHTS", $arFields)
&& is_array($arFields["RIGHTS"])
)
{
$obIBlockRights = new CIBlockRights($ID);
$obIBlockRights->SetRights($arFields["RIGHTS"]);
}
}
else
{
if(array_key_exists("GROUP_ID", $arFields) && is_array($arFields["GROUP_ID"]))
$this->SetPermission($ID, $arFields["GROUP_ID"]);
}
if (array_key_exists("IPROPERTY_TEMPLATES", $arFields))
{
$ipropTemplates = new \Bitrix\Iblock\InheritedProperty\IblockTemplates($ID);
$ipropTemplates->set($arFields["IPROPERTY_TEMPLATES"]);
}
if(!empty($arLID))
{
$DB->Query("
DELETE FROM b_iblock_site WHERE IBLOCK_ID = ".$ID."
", false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
$DB->Query("
INSERT INTO b_iblock_site(IBLOCK_ID, SITE_ID)
SELECT ".$ID.", LID
FROM b_lang
WHERE LID IN ('".implode("', '", $arLID)."')
", false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
}
if($arFields["VERSION"] == 2)
{
if($this->_Add($ID))
{
$Result = $ID;
$arFields["ID"] = &$ID;
}
else
{
$this->LAST_ERROR = GetMessage("IBLOCK_TABLE_CREATION_ERROR");
$Result = false;
$arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
}
}
else
{
$Result = $ID;
$arFields["ID"] = &$ID;
}
$_SESSION["SESS_RECOUNT_DB"] = "Y";
$this->CleanCache($ID);
}
$arFields["RESULT"] = &$Result;
foreach(GetModuleEvents("iblock", "OnAfterIBlockAdd", true) as $arEvent)
ExecuteModuleEventEx($arEvent, array(&$arFields));
if(defined("BX_COMP_MANAGED_CACHE") && self::isEnabledClearTagCache())
$CACHE_MANAGER->ClearByTag("iblock_id_new");
return $Result;
}
///////////////////////////////////////////////////////////////////
// Update
///////////////////////////////////////////////////////////////////
function Update($ID, $arFields)
{
/** @global CDatabase $DB */
global $DB;
$ID = (int)$ID;
$SAVED_PICTURE = null;
if(is_set($arFields, "EXTERNAL_ID"))
$arFields["XML_ID"] = $arFields["EXTERNAL_ID"];
if(is_set($arFields, "PICTURE"))
{
if(strlen($arFields["PICTURE"]["name"])<=0 && strlen($arFields["PICTURE"]["del"])<=0)
{
unset($arFields["PICTURE"]);
}
else
{
$pic_res = $DB->Query("SELECT PICTURE FROM b_iblock WHERE ID=".$ID);
if($pic_res = $pic_res->Fetch())
$arFields["PICTURE"]["old_file"]=$pic_res["PICTURE"];
$arFields["PICTURE"]["MODULE_ID"] = "iblock";
}
}
if(is_set($arFields, "ACTIVE") && $arFields["ACTIVE"]!="Y")
$arFields["ACTIVE"]="N";
if(is_set($arFields, "WORKFLOW") && $arFields["WORKFLOW"]!="N")
$arFields["WORKFLOW"]="Y";
if(is_set($arFields, "BIZPROC") && $arFields["BIZPROC"]!="Y")
$arFields["BIZPROC"]="N";
if(is_set($arFields, "SECTION_CHOOSER") && $arFields["SECTION_CHOOSER"]!="D" && $arFields["SECTION_CHOOSER"]!="P")
$arFields["SECTION_CHOOSER"]="L";
if(is_set($arFields, "INDEX_SECTION") && $arFields["INDEX_SECTION"]!="Y")
$arFields["INDEX_SECTION"]="N";
if(is_set($arFields, "INDEX_ELEMENT") && $arFields["INDEX_ELEMENT"]!="Y")
$arFields["INDEX_ELEMENT"]="N";
if(is_set($arFields, "DESCRIPTION_TYPE") && $arFields["DESCRIPTION_TYPE"]!="html")
$arFields["DESCRIPTION_TYPE"] = "text";
if(is_set($arFields, "SITE_ID"))
$arFields["LID"] = $arFields["SITE_ID"];
if(is_set($arFields, "SECTION_PROPERTY"))
$arFields["SECTION_PROPERTY"] = "Y";
if(is_set($arFields, "PROPERTY_INDEX") && $arFields["PROPERTY_INDEX"]!="I" && $arFields["PROPERTY_INDEX"]!="Y")
$arFields["SECTION_PROPERTY"] = "N";
$RIGHTS_MODE = CIBlock::GetArrayByID($ID, "RIGHTS_MODE");
if(!$this->CheckFields($arFields, $ID))
{
$Result = false;
$arFields["RESULT_MESSAGE"] = &$this->LAST_ERROR;
}
else
{
$arLID = array();
$str_LID = "";
if(is_set($arFields, "LID"))
{
if(is_array($arFields["LID"]))
$arLID = $arFields["LID"];
else
$arLID[] = $arFields["LID"];
$arFields["LID"] = false;
$str_LID = "''";
foreach($arLID as $v)
{
$arFields["LID"] = $v;
$str_LID .= ", '".$DB->ForSql($v)."'";
}
}
unset($arFields["ID"]);
unset($arFields["VERSION"]);
if(array_key_exists("PICTURE", $arFields))
{
$SAVED_PICTURE = $arFields["PICTURE"];
CFile::SaveForDB($arFields, "PICTURE", "iblock");
}
$strUpdate = $DB->PrepareUpdate("b_iblock", $arFields, "iblock");
if(array_key_exists("PICTURE", $arFields))
$arFields["PICTURE"] = $SAVED_PICTURE;
$arBinds=Array();
if(is_set($arFields, "DESCRIPTION"))
$arBinds["DESCRIPTION"] = $arFields["DESCRIPTION"];
if(strlen($strUpdate) > 0)
{
$strSql = "UPDATE b_iblock SET ".$strUpdate." WHERE ID=".$ID;
$DB->QueryBind($strSql, $arBinds);
}
$this->SetMessages($ID, $arFields);
if(isset($arFields["FIELDS"]) && is_array($arFields["FIELDS"]))
$this->SetFields($ID, $arFields["FIELDS"]);
if(array_key_exists("RIGHTS_MODE", $arFields))
{
if($arFields["RIGHTS_MODE"] === "E" && $RIGHTS_MODE !== "E")
{
CIBlock::SetPermission($ID, array());
}
elseif($arFields["RIGHTS_MODE"] !== "E" && $RIGHTS_MODE === "E")
{
$obIBlockRights = new CIBlockRights($ID);
$obIBlockRights->DeleteAllRights();
}
if($arFields["RIGHTS_MODE"] === "E")
$RIGHTS_MODE = "E";
}
if($RIGHTS_MODE === "E")
{
if(
!array_key_exists("RIGHTS", $arFields)
&& array_key_exists("GROUP_ID", $arFields)
&& is_array($arFields["GROUP_ID"])
)
{
$obIBlockRights = new CIBlockRights($ID);
$obIBlockRights->SetRights($obIBlockRights->ConvertGroups($arFields["GROUP_ID"]));
}
elseif(
array_key_exists("RIGHTS", $arFields)
&& is_array($arFields["RIGHTS"])
)
{
$obIBlockRights = new CIBlockRights($ID);
$obIBlockRights->SetRights($arFields["RIGHTS"]);
}
}
else
{
if(array_key_exists("GROUP_ID", $arFields) && is_array($arFields["GROUP_ID"]))
CIBlock::SetPermission($ID, $arFields["GROUP_ID"]);
}
if (array_key_exists("IPROPERTY_TEMPLATES", $arFields))
{
$ipropTemplates = new \Bitrix\Iblock\InheritedProperty\IblockTemplates($ID);
$ipropTemplates->set($arFields["IPROPERTY_TEMPLATES"]);
}
if(!empty($arLID))
{
$strSql = "DELETE FROM b_iblock_site WHERE IBLOCK_ID=".$ID;
$DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
$strSql =
"INSERT INTO b_iblock_site(IBLOCK_ID, SITE_ID) ".
"SELECT ".$ID.", LID ".
"FROM b_lang ".
"WHERE LID IN (".$str_LID.") ";
$DB->Query($strSql, false, "FILE: ".__FILE__."<br> LINE: ".__LINE__);
}
if(CModule::IncludeModule("search"))
{
$dbAfter = $DB->Query("SELECT ACTIVE FROM b_iblock WHERE ID=".$ID);
$arAfter = $dbAfter->Fetch();
if($arAfter["ACTIVE"] != "Y")
CSearch::DeleteIndex("iblock", false, false, $ID);
}
$_SESSION["SESS_RECOUNT_DB"] = "Y";
$Result = true;
}
$this->CleanCache($ID);
$arFields["ID"] = $ID;
$arFields["RESULT"] = &$Result;
foreach (GetModuleEvents("iblock", "OnAfterIBlockUpdate", true) as $arEvent)
ExecuteModuleEventEx($arEvent, array(&$arFields));
self::clearIblockTagCache($ID);
return $Result;
}
///////////////////////////////////////////////////////////////////
// Function deletes iblock by ID
///////////////////////////////////////////////////////////////////
public static function Delete($ID)
{
$err_mess = "FILE: ".__FILE__."<br>LINE: ";
/** @global CDatabase $DB */
global $DB;
/** @global CMain $APPLICATION */
global $APPLICATION;
/** @global CUserTypeManager $USER_FIELD_MANAGER */
global $USER_FIELD_MANAGER;
$ID = (int)$ID;
$APPLICATION->ResetException();
foreach(GetModuleEvents("iblock", "OnBeforeIBlockDelete", true) as $arEvent)
{
if(ExecuteModuleEventEx($arEvent, array($ID)) === false)
{
$err = GetMessage("MAIN_BEFORE_DEL_ERR").' '.$arEvent['TO_NAME'];
$ex = $APPLICATION->GetException();
if(is_object($ex))
$err .= ': '.$ex->GetString();
$APPLICATION->throwException($err);
return false;
}
}
foreach (GetModuleEvents("iblock", "OnIBlockDelete", true) as $arEvent)
ExecuteModuleEventEx($arEvent, array($ID));
$iblockSections = CIBlockSection::GetList(Array(), Array(
"IBLOCK_ID" => $ID,
"DEPTH_LEVEL" => 1,
"CHECK_PERMISSIONS" => "N",
), false, Array("ID"));
while($iblockSection = $iblockSections->Fetch())
{
if(!CIBlockSection::Delete($iblockSection["ID"], false))
return false;
}
$iblockElements = CIBlockElement::GetList(Array(), Array(
"IBLOCK_ID" => $ID,
"SHOW_NEW" => "Y",
"CHECK_PERMISSIONS" => "N",
), false, false, array("IBLOCK_ID", "ID"));
while($iblockElement = $iblockElements->Fetch())
{
if(!CIBlockElement::Delete($iblockElement["ID"]))
return false;
}
$props = CIBlockProperty::GetList(array(), array(
"IBLOCK_ID" => $ID,
"CHECK_PERMISSIONS" =>"N",
));
while($property = $props->Fetch())
{
if(!CIBlockProperty::Delete($property["ID"]))
return false;
}
CFile::Delete(self::GetArrayByID($ID , "PICTURE"));
$seq = new CIBlockSequence($ID);
$seq->Drop(true);
$obIBlockRights = new CIBlockRights($ID);
$obIBlockRights->DeleteAllRights();
$ipropTemplates = new \Bitrix\Iblock\InheritedProperty\IblockTemplates($ID);
$ipropTemplates->delete();
CIBlockSectionPropertyLink::DeleteByIBlock($ID);
$DB->Query("delete from b_iblock_offers_tmp where PRODUCT_IBLOCK_ID=".$ID, false, $err_mess.__LINE__);
$DB->Query("delete from b_iblock_offers_tmp where OFFERS_IBLOCK_ID=".$ID, false, $err_mess.__LINE__);
if(!$DB->Query("DELETE FROM b_iblock_messages WHERE IBLOCK_ID = ".$ID, false, $err_mess.__LINE__))
return false;
if(!$DB->Query("DELETE FROM b_iblock_fields WHERE IBLOCK_ID = ".$ID, false, $err_mess.__LINE__))
return false;
$USER_FIELD_MANAGER->OnEntityDelete("IBLOCK_".$ID."_SECTION");
if(!$DB->Query("DELETE FROM b_iblock_group WHERE IBLOCK_ID=".$ID, false, $err_mess.__LINE__))
return false;
if(!$DB->Query("DELETE FROM b_iblock_rss WHERE IBLOCK_ID=".$ID, false, $err_mess.__LINE__))
return false;
if(!$DB->Query("DELETE FROM b_iblock_site WHERE IBLOCK_ID=".$ID, false, $err_mess.__LINE__))
return false;
if(!$DB->Query("DELETE FROM b_iblock WHERE ID=".$ID, false, $err_mess.__LINE__))
return false;
$DB->DDL("DROP TABLE b_iblock_element_prop_s".$ID, true, $err_mess.__LINE__);
$DB->DDL("DROP TABLE b_iblock_element_prop_m".$ID, true, $err_mess.__LINE__);
$DB->DDL("DROP SEQUENCE sq_b_iblock_element_prop_m".$ID, true, $err_mess.__LINE__);
CIBlock::CleanCache($ID);
foreach(GetModuleEvents("iblock", "OnAfterIBlockDelete", true) as $arEvent)
ExecuteModuleEventEx($arEvent, array($ID));
self::clearIblockTagCache($ID);
$_SESSION["SESS_RECOUNT_DB"] = "Y";
return true;
}
///////////////////////////////////////////////////////////////////
// Check function called from Add and Update
///////////////////////////////////////////////////////////////////
function CheckFields(&$arFields, $ID=false)
{
/** @global CMain $APPLICATION */
global $APPLICATION;
$this->LAST_ERROR = "";
$NAME = isset($arFields["NAME"])? $arFields["NAME"]: "";
if(
($ID===false || array_key_exists("NAME", $arFields))
&& strlen($NAME) <= 0
)
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_NAME")."<br>";
if($ID===false && !is_set($arFields, "IBLOCK_TYPE_ID"))
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_BLOCK_TYPE")."<br>";
if($ID===false)
{
//For new record take default values
$WORKFLOW = array_key_exists("WORKFLOW", $arFields)? $arFields["WORKFLOW"]: "Y";
$BIZPROC = array_key_exists("BIZPROC", $arFields)? $arFields["BIZPROC"]: "N";
}
else
{
//For existing one read old values
$arIBlock = CIBlock::GetArrayByID($ID);
$WORKFLOW = array_key_exists("WORKFLOW", $arFields)? $arFields["WORKFLOW"]: $arIBlock["WORKFLOW"];
$BIZPROC = array_key_exists("BIZPROC", $arFields)? $arFields["BIZPROC"]: $arIBlock["BIZPROC"];
if($BIZPROC != "Y") $BIZPROC = "N";//This is cache compatibility issue
}
if($WORKFLOW == "Y" && $BIZPROC == "Y")
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_WORKFLOW_AND_BIZPROC")."<br>";
if(is_set($arFields, "IBLOCK_TYPE_ID"))
{
$r = CIBlockType::GetByID($arFields["IBLOCK_TYPE_ID"]);
if(!$r->Fetch())
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_BLOCK_TYPE_ID")."<br>";
}
if(
is_array($arFields["PICTURE"])
&& array_key_exists("bucket", $arFields["PICTURE"])
&& is_object($arFields["PICTURE"]["bucket"])
)
{
//This is trusted image from xml import
}
elseif(
isset($arFields["PICTURE"])
&& is_array($arFields["PICTURE"])
&& isset($arFields["PICTURE"]["name"])
)
{
$error = CFile::CheckImageFile($arFields["PICTURE"]);
if (strlen($error) > 0)
$this->LAST_ERROR .= $error."<br>";
}
if(
($ID===false && !is_set($arFields, "LID")) ||
(is_set($arFields, "LID")
&& (
(is_array($arFields["LID"]) && count($arFields["LID"])<=0)
||
(!is_array($arFields["LID"]) && strlen($arFields["LID"])<=0)
)
)
)
{
$this->LAST_ERROR .= GetMessage("IBLOCK_BAD_SITE_ID_NA")."<br>";
}
elseif(is_set($arFields, "LID"))
{
if(!is_array($arFields["LID"]))
$arFields["LID"] = Array($arFields["LID"]);
foreach($arFields["LID"] as $v)
{
$r = CSite::GetByID($v);
if(!$r->Fetch())
$this->LAST_ERROR .= "'".$v."' - ".GetMessage("IBLOCK_BAD_SITE_ID")."<br>";
}
}
$APPLICATION->ResetException();
if($ID===false)
$db_events = GetModuleEvents("iblock", "OnBeforeIBlockAdd", true);
else
{
$arFields["ID"] = $ID;
$db_events = GetModuleEvents("iblock", "OnBeforeIBlockUpdate", 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(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(strlen($this->LAST_ERROR)>0)
return false;
return true;
}
public static function SetPermission($IBLOCK_ID, $arGROUP_ID)
{
/** @global CDatabase $DB */
global $DB;
$IBLOCK_ID = (int)$IBLOCK_ID;
static $letters = array(
'E' => true,
'R' => true,
'S' => true,
'T' => true,
'U' => true,
'W' => true,
'X' => true
);
$arToDelete = array();
$arToInsert = array();
if(is_array($arGROUP_ID))
{
foreach($arGROUP_ID as $group_id => $perm)
{
$group_id = (int)$group_id;
if ($group_id > 0 && isset($letters[$perm]))
{
$arToInsert[$group_id] = $perm;
}
}
}
$rs = $DB->Query("
SELECT GROUP_ID, PERMISSION
FROM b_iblock_group
WHERE IBLOCK_ID = ".$IBLOCK_ID."
", false, "File: ".__FILE__."<br>Line: ".__LINE__);
while($ar = $rs->Fetch())
{
$group_id = (int)$ar["GROUP_ID"];
if(isset($arToInsert[$group_id]) && $arToInsert[$group_id] === $ar["PERMISSION"])
{
unset($arToInsert[$group_id]); //This already in DB
}
else
{
$arToDelete[] = $group_id;
}
}
if(!empty($arToDelete))
{
$DB->Query("
DELETE FROM b_iblock_group
WHERE IBLOCK_ID = ".$IBLOCK_ID."
AND GROUP_ID in (".implode(", ", $arToDelete).")
", false, "File: ".__FILE__."<br>Line: ".__LINE__); //And this should be deleted
}
if(!empty($arToInsert))
{
foreach($arToInsert as $group_id => $perm)
{
$DB->Query("
INSERT INTO b_iblock_group(IBLOCK_ID, GROUP_ID, PERMISSION)
SELECT ".$IBLOCK_ID.", ID, '".$perm."'
FROM b_group
WHERE ID = ".$group_id."
");
}
}
if(!empty($arToDelete) || !empty($arToInsert))
{
if(CModule::IncludeModule("search"))
{
$arGroups = CIBlock::GetGroupPermissions($IBLOCK_ID);
if(isset($arGroups[2]))
CSearch::ChangePermission("iblock", array(2), false, false, $IBLOCK_ID);
else
CSearch::ChangePermission("iblock", $arGroups, false, false, $IBLOCK_ID);
}
}
}
function SetMessages($ID, $arFields)
{
/** @global CDatabase $DB */
global $DB;
$ID = intval($ID);
if($ID > 0)
{
$arMessages = array(
"ELEMENT_NAME",
"ELEMENTS_NAME",
"ELEMENT_ADD",
"ELEMENT_EDIT",
"ELEMENT_DELETE",
"SECTION_NAME",
"SECTIONS_NAME",
"SECTION_ADD",
"SECTION_EDIT",
"SECTION_DELETE",
);
$arUpdate = array();
foreach($arMessages as $MESSAGE_ID)
{
if(array_key_exists($MESSAGE_ID, $arFields))
$arUpdate[] = $MESSAGE_ID;
}
if(count($arUpdate) > 0)
{
$res = $DB->Query("
DELETE FROM b_iblock_messages
WHERE IBLOCK_ID = ".$ID."
AND MESSAGE_ID in ('".implode("', '", $arUpdate)."')
");
if($res)
{
foreach($arUpdate as $MESSAGE_ID)
{
$MESSAGE_TEXT = trim($arFields[$MESSAGE_ID]);
if(strlen($MESSAGE_TEXT) > 0)
$DB->Add("b_iblock_messages", array(
"ID" => 1, //FAKE field for not use sequence
"IBLOCK_ID" => $ID,
"MESSAGE_ID" => $MESSAGE_ID,
"MESSAGE_TEXT" => $MESSAGE_TEXT,
));
}
}
}
}
}
public static function GetMessages($ID, $type="")
{
/** @global CDatabase $DB */
global $DB;
$ID = intval($ID);
$arMessages = array(
"ELEMENT_NAME" => GetMessage("IBLOCK_MESS_ELEMENT_NAME"),
"ELEMENTS_NAME" => "",
"ELEMENT_ADD" => GetMessage("IBLOCK_MESS_ELEMENT_ADD"),
"ELEMENT_EDIT" => GetMessage("IBLOCK_MESS_ELEMENT_EDIT"),
"ELEMENT_DELETE" => GetMessage("IBLOCK_MESS_ELEMENT_DELETE"),
"SECTION_NAME" => GetMessage("IBLOCK_MESS_SECTION_NAME"),
"SECTIONS_NAME" => "",
"SECTION_ADD" => GetMessage("IBLOCK_MESS_SECTION_ADD"),
"SECTION_EDIT" => GetMessage("IBLOCK_MESS_SECTION_EDIT"),
"SECTION_DELETE" => GetMessage("IBLOCK_MESS_SECTION_DELETE"),
);
$res = $DB->Query("
SELECT
B.IBLOCK_TYPE_ID
,M.IBLOCK_ID
,M.MESSAGE_ID
,M.MESSAGE_TEXT
FROM
b_iblock B
LEFT JOIN b_iblock_messages M ON B.ID = M.IBLOCK_ID
WHERE
B.ID = ".$ID."
");
while($ar = $res->Fetch())
{
$type = $ar["IBLOCK_TYPE_ID"];
if($ar["MESSAGE_ID"])
$arMessages[$ar["MESSAGE_ID"]] = $ar["MESSAGE_TEXT"];
}
if((strlen($arMessages["ELEMENTS_NAME"]) <= 0) || (strlen($arMessages["SECTIONS_NAME"]) <= 0))
{
if($type)
{
$arType = CIBlockType::GetByIDLang($type, LANGUAGE_ID);
if($arType)
{
if(strlen($arMessages["ELEMENTS_NAME"]) <= 0)
$arMessages["ELEMENTS_NAME"] = $arType["ELEMENT_NAME"];
if(strlen($arMessages["SECTIONS_NAME"]) <= 0)
$arMessages["SECTIONS_NAME"] = $arType["SECTION_NAME"];
}
}
}
if(strlen($arMessages["ELEMENTS_NAME"]) <= 0)
$arMessages["ELEMENTS_NAME"] = GetMessage("IBLOCK_MESS_ELEMENTS_NAME");
if(strlen($arMessages["SECTIONS_NAME"]) <= 0)
$arMessages["SECTIONS_NAME"] = GetMessage("IBLOCK_MESS_SECTIONS_NAME");
return $arMessages;
}
public static function GetFieldsDefaults()
{
/*************
REQ
+ IBLOCK_SECTION_ID int(11),
ACTIVE char(1) not null default 'Y',
+ ACTIVE_FROM datetime,
+ ACTIVE_TO datetime,
SORT int(11) not null default '500',
NAME varchar(255) not null,
+ PREVIEW_PICTURE int(18),
+ PREVIEW_TEXT text,
PREVIEW_TEXT_TYPE varchar(4) not null default 'text',
+ DETAIL_PICTURE int(18),
+ DETAIL_TEXT longtext,
DETAIL_TEXT_TYPE varchar(4) not null default 'text',
+ XML_ID varchar(255),
+ CODE varchar(255),
+ TAGS varchar(255),
**************/
static $res = false;
if (!$res)
{
$jpgQuality = self::getDefaultJpegQuality();
$res = array(
"IBLOCK_SECTION" => array(
"NAME" => GetMessage("IBLOCK_FIELD_SECTIONS"),
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => serialize(array(
"KEEP_IBLOCK_SECTION_ID" => "N",
)),
),
"ACTIVE" => array(
"NAME" => GetMessage("IBLOCK_FIELD_ACTIVE"),
"IS_REQUIRED" => "Y",
),
"ACTIVE_FROM" => array(
"NAME" => GetMessage("IBLOCK_FIELD_ACTIVE_PERIOD_FROM"),
"IS_REQUIRED" => false,
),
"ACTIVE_TO" => array(
"NAME" => GetMessage("IBLOCK_FIELD_ACTIVE_PERIOD_TO"),
"IS_REQUIRED" => false,
),
"SORT" => array(
"NAME" => GetMessage("IBLOCK_FIELD_SORT"),
"IS_REQUIRED" => false,
),
"NAME" => array(
"NAME" => GetMessage("IBLOCK_FIELD_NAME"),
"IS_REQUIRED" => "Y",
),
"PREVIEW_PICTURE" => array(
"NAME" => GetMessage("IBLOCK_FIELD_PREVIEW_PICTURE"),
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => serialize(array(
"METHOD" => "resample",
"COMPRESSION" => $jpgQuality,
)),
),
"PREVIEW_TEXT_TYPE" => array(
"NAME" => GetMessage("IBLOCK_FIELD_PREVIEW_TEXT_TYPE"),
"IS_REQUIRED" => "Y",
),
"PREVIEW_TEXT" => array(
"NAME" => GetMessage("IBLOCK_FIELD_PREVIEW_TEXT"),
"IS_REQUIRED" => false,
),
"DETAIL_PICTURE" => array(
"NAME" => GetMessage("IBLOCK_FIELD_DETAIL_PICTURE"),
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => serialize(array(
"METHOD" => "resample",
"COMPRESSION" => $jpgQuality,
)),
),
"DETAIL_TEXT_TYPE" => array(
"NAME" => GetMessage("IBLOCK_FIELD_DETAIL_TEXT_TYPE"),
"IS_REQUIRED" => "Y",
),
"DETAIL_TEXT" => array(
"NAME" => GetMessage("IBLOCK_FIELD_DETAIL_TEXT"),
"IS_REQUIRED" => false,
),
"XML_ID" => array(
"NAME" => GetMessage("IBLOCK_FIELD_XML_ID"),
"IS_REQUIRED" => "Y",
),
"CODE" => array(
"NAME" => GetMessage("IBLOCK_FIELD_CODE"),
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => serialize(array(
"UNIQUE" => "N",
"TRANSLITERATION" => "N",
"TRANS_LEN" => 100,
"TRANS_CASE" => "L",
"TRANS_SPACE" => "-",
"TRANS_OTHER" => "-",
"TRANS_EAT" => "Y",
"USE_GOOGLE" => "N",
)),
),
"TAGS" => array(
"NAME" => GetMessage("IBLOCK_FIELD_TAGS"),
"IS_REQUIRED" => false,
),
"SECTION_NAME" => array(
"NAME" => GetMessage("IBLOCK_FIELD_NAME"),
"IS_REQUIRED" => "Y",
),
"SECTION_PICTURE" => array(
"NAME" => GetMessage("IBLOCK_FIELD_PREVIEW_PICTURE"),
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => serialize(array(
"METHOD" => "resample",
"COMPRESSION" => $jpgQuality,
)),
),
"SECTION_DESCRIPTION_TYPE" => array(
"NAME" => GetMessage("IBLOCK_FIELD_SECTION_DESCRIPTION_TYPE"),
"IS_REQUIRED" => "Y",
),
"SECTION_DESCRIPTION" => array(
"NAME" => GetMessage("IBLOCK_FIELD_SECTION_DESCRIPTION"),
"IS_REQUIRED" => false,
),
"SECTION_DETAIL_PICTURE" => array(
"NAME" => GetMessage("IBLOCK_FIELD_DETAIL_PICTURE"),
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => serialize(array(
"METHOD" => "resample",
"COMPRESSION" => $jpgQuality,
)),
),
"SECTION_XML_ID" => array(
"NAME" => GetMessage("IBLOCK_FIELD_XML_ID"),
"IS_REQUIRED" => false,
),
"SECTION_CODE" => array(
"NAME" => GetMessage("IBLOCK_FIELD_CODE"),
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => serialize(array(
"UNIQUE" => "N",
"TRANSLITERATION" => "N",
"TRANS_LEN" => 100,
"TRANS_CASE" => "L",
"TRANS_SPACE" => "-",
"TRANS_OTHER" => "-",
"TRANS_EAT" => "Y",
"USE_GOOGLE" => "N",
)),
),
"LOG_SECTION_ADD" => array(
"NAME" => "LOG_SECTION_ADD",
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => false,
),
"LOG_SECTION_EDIT" => array(
"NAME" => "LOG_SECTION_EDIT",
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => false,
),
"LOG_SECTION_DELETE" => array(
"NAME" => "LOG_SECTION_DELETE",
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => false,
),
"LOG_ELEMENT_ADD" => array(
"NAME" => "LOG_ELEMENT_ADD",
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => false,
),
"LOG_ELEMENT_EDIT" => array(
"NAME" => "LOG_ELEMENT_EDIT",
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => false,
),
"LOG_ELEMENT_DELETE" => array(
"NAME" => "LOG_ELEMENT_DELETE",
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => false,
),
"XML_IMPORT_START_TIME" => array(
"NAME" => "XML_IMPORT_START_TIME",
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => false,
"VISIBLE" => "N",
),
"DETAIL_TEXT_TYPE_ALLOW_CHANGE" => array(
"NAME" => "DETAIL_TEXT_TYPE_ALLOW_CHANGE",
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => "Y",
"VISIBLE" => "N",
),
"PREVIEW_TEXT_TYPE_ALLOW_CHANGE" => array(
"NAME" => "PREVIEW_TEXT_TYPE_ALLOW_CHANGE",
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => "Y",
"VISIBLE" => "N",
),
"SECTION_DESCRIPTION_TYPE_ALLOW_CHANGE" => array(
"NAME" => "SECTION_DESCRIPTION_TYPE_ALLOW_CHANGE",
"IS_REQUIRED" => false,
"DEFAULT_VALUE" => "Y",
"VISIBLE" => "N",
),
);
}
return $res;
}
public static function SetFields($ID, $arFields)
{
/** @global CDatabase $DB */
global $DB;
$ID = intval($ID);
if($ID > 0)
{
$arDefFields = CIBlock::GetFieldsDefaults();
$res = $DB->Query("
SELECT * FROM b_iblock_fields
WHERE IBLOCK_ID = ".$ID."
");
if(array_key_exists("PREVIEW_PICTURE", $arFields))
{
$arDef = &$arFields["PREVIEW_PICTURE"]["DEFAULT_VALUE"];
if(is_array($arDef))
{
$arDef = serialize(array(
"FROM_DETAIL" => $arDef["FROM_DETAIL"] === "Y"? "Y": "N",
"SCALE" => $arDef["SCALE"] === "Y"? "Y": "N",
"WIDTH" => intval($arDef["WIDTH"]) > 0? intval($arDef["WIDTH"]): "",
"HEIGHT" => intval($arDef["HEIGHT"]) > 0? intval($arDef["HEIGHT"]): "",
"IGNORE_ERRORS" => $arDef["IGNORE_ERRORS"] === "Y"? "Y": "N",
"METHOD" => $arDef["METHOD"] === "resample"? "resample": "",
"COMPRESSION" => intval($arDef["COMPRESSION"]) > 100? 100: (intval($arDef["COMPRESSION"]) > 0? intval($arDef["COMPRESSION"]): ""),
"DELETE_WITH_DETAIL" => $arDef["DELETE_WITH_DETAIL"] === "Y"? "Y": "N",
"UPDATE_WITH_DETAIL" => $arDef["UPDATE_WITH_DETAIL"] === "Y"? "Y": "N",
"USE_WATERMARK_TEXT" => $arDef["USE_WATERMARK_TEXT"] === "Y"? "Y": "N",
"WATERMARK_TEXT" => $arDef["WATERMARK_TEXT"],
"WATERMARK_TEXT_FONT" => $arDef["WATERMARK_TEXT_FONT"],
"WATERMARK_TEXT_COLOR" => $arDef["WATERMARK_TEXT_COLOR"],
"WATERMARK_TEXT_SIZE" => intval($arDef["WATERMARK_TEXT_SIZE"]) > 0? intval($arDef["WATERMARK_TEXT_SIZE"]): "",
"WATERMARK_TEXT_POSITION" => $arDef["WATERMARK_TEXT_POSITION"],
"USE_WATERMARK_FILE" => $arDef["USE_WATERMARK_FILE"] === "Y"? "Y": "N",
"WATERMARK_FILE" => $arDef["WATERMARK_FILE"],
"WATERMARK_FILE_ALPHA" => intval($arDef["WATERMARK_FILE_ALPHA"]) > 0? intval($arDef["WATERMARK_FILE_ALPHA"]): "",
"WATERMARK_FILE_POSITION" => $arDef["WATERMARK_FILE_POSITION"],
"WATERMARK_FILE_ORDER" => $arDef["WATERMARK_FILE_ORDER"],
));
}
else
{
$arDef = "";
}
}
if(array_key_exists("DETAIL_PICTURE", $arFields))
{
$arDef = &$arFields["DETAIL_PICTURE"]["DEFAULT_VALUE"];
if(is_array($arDef))
{
$arDef = serialize(array(
"SCALE" => $arDef["SCALE"] === "Y"? "Y": "N",
"WIDTH" => intval($arDef["WIDTH"]) > 0? intval($arDef["WIDTH"]): "",
"HEIGHT" => intval($arDef["HEIGHT"]) > 0? intval($arDef["HEIGHT"]): "",
"IGNORE_ERRORS" => $arDef["IGNORE_ERRORS"] === "Y"? "Y": "N",
"METHOD" => $arDef["METHOD"] === "resample"? "resample": "",
"COMPRESSION" => intval($arDef["COMPRESSION"]) > 100? 100: (intval($arDef["COMPRESSION"]) > 0? intval($arDef["COMPRESSION"]): ""),
"USE_WATERMARK_TEXT" => $arDef["USE_WATERMARK_TEXT"] === "Y"? "Y": "N",
"WATERMARK_TEXT" => $arDef["WATERMARK_TEXT"],
"WATERMARK_TEXT_FONT" => $arDef["WATERMARK_TEXT_FONT"],
"WATERMARK_TEXT_COLOR" => $arDef["WATERMARK_TEXT_COLOR"],
"WATERMARK_TEXT_SIZE" => intval($arDef["WATERMARK_TEXT_SIZE"]) > 0? intval($arDef["WATERMARK_TEXT_SIZE"]): "",
"WATERMARK_TEXT_POSITION" => $arDef["WATERMARK_TEXT_POSITION"],
"USE_WATERMARK_FILE" => $arDef["USE_WATERMARK_FILE"] === "Y"? "Y": "N",
"WATERMARK_FILE" => $arDef["WATERMARK_FILE"],
"WATERMARK_FILE_ALPHA" => intval($arDef["WATERMARK_FILE_ALPHA"]) > 0? intval($arDef["WATERMARK_FILE_ALPHA"]): "",
"WATERMARK_FILE_POSITION" => $arDef["WATERMARK_FILE_POSITION"],
"WATERMARK_FILE_ORDER" => $arDef["WATERMARK_FILE_ORDER"],
));
}
else
{
$arDef = "";
}
}
if(array_key_exists("CODE", $arFields))
{
$arDef = &$arFields["CODE"]["DEFAULT_VALUE"];
if(is_array($arDef))
{
$trans_len = intval($arDef["TRANS_LEN"]);
if($trans_len > 255)
$trans_len = 255;
elseif($trans_len < 1)
$trans_len = 100;
$arDef = serialize(array(
"UNIQUE" => $arDef["UNIQUE"] === "Y"? "Y": "N",
"TRANSLITERATION" => $arDef["TRANSLITERATION"] === "Y"? "Y": "N",
"TRANS_LEN" => $trans_len,
"TRANS_CASE" => $arDef["TRANS_CASE"] == "U"? "U": ($arDef["TRANS_CASE"] == ""? "": "L"),
"TRANS_SPACE" => substr($arDef["TRANS_SPACE"], 0, 1),
"TRANS_OTHER" => substr($arDef["TRANS_OTHER"], 0, 1),
"TRANS_EAT" => $arDef["TRANS_EAT"] === "N"? "N": "Y",
"USE_GOOGLE" => $arDef["USE_GOOGLE"] === "Y"? "Y": "N",
));
}
else
{
$arDef = "";
}
}
if(array_key_exists("SECTION_PICTURE", $arFields))
{
$arDef = &$arFields["SECTION_PICTURE"]["DEFAULT_VALUE"];
if(is_array($arDef))
{
$arDef = serialize(array(
"FROM_DETAIL" => $arDef["FROM_DETAIL"] === "Y"? "Y": "N",
"SCALE" => $arDef["SCALE"] === "Y"? "Y": "N",
"WIDTH" => intval($arDef["WIDTH"]) > 0? intval($arDef["WIDTH"]): "",
"HEIGHT" => intval($arDef["HEIGHT"]) > 0? intval($arDef["HEIGHT"]): "",
"IGNORE_ERRORS" => $arDef["IGNORE_ERRORS"] === "Y"? "Y": "N",
"METHOD" => $arDef["METHOD"] === "resample"? "resample": "",
"COMPRESSION" => intval($arDef["COMPRESSION"]) > 100? 100: (intval($arDef["COMPRESSION"]) > 0? intval($arDef["COMPRESSION"]): ""),
"DELETE_WITH_DETAIL" => $arDef["DELETE_WITH_DETAIL"] === "Y"? "Y": "N",
"UPDATE_WITH_DETAIL" => $arDef["UPDATE_WITH_DETAIL"] === "Y"? "Y": "N",
"USE_WATERMARK_TEXT" => $arDef["USE_WATERMARK_TEXT"] === "Y"? "Y": "N",
"WATERMARK_TEXT" => $arDef["WATERMARK_TEXT"],
"WATERMARK_TEXT_FONT" => $arDef["WATERMARK_TEXT_FONT"],
"WATERMARK_TEXT_COLOR" => $arDef["WATERMARK_TEXT_COLOR"],
"WATERMARK_TEXT_SIZE" => intval($arDef["WATERMARK_TEXT_SIZE"]) > 0? intval($arDef["WATERMARK_TEXT_SIZE"]): "",
"WATERMARK_TEXT_POSITION" => $arDef["WATERMARK_TEXT_POSITION"],
"USE_WATERMARK_FILE" => $arDef["USE_WATERMARK_FILE"] === "Y"? "Y": "N",
"WATERMARK_FILE" => $arDef["WATERMARK_FILE"],
"WATERMARK_FILE_ALPHA" => intval($arDef["WATERMARK_FILE_ALPHA"]) > 0? intval($arDef["WATERMARK_FILE_ALPHA"]): "",
"WATERMARK_FILE_POSITION" => $arDef["WATERMARK_FILE_POSITION"],
"WATERMARK_FILE_ORDER" => $arDef["WATERMARK_FILE_ORDER"],
));
}
else
{
$arDef = "";
}
}
if(array_key_exists("SECTION_DETAIL_PICTURE", $arFields))
{
$arDef = &$arFields["SECTION_DETAIL_PICTURE"]["DEFAULT_VALUE"];
if(is_array($arDef))
{
$arDef = serialize(array(
"SCALE" => $arDef["SCALE"] === "Y"? "Y": "N",
"WIDTH" => intval($arDef["WIDTH"]) > 0? intval($arDef["WIDTH"]): "",
"HEIGHT" => intval($arDef["HEIGHT"]) > 0? intval($arDef["HEIGHT"]): "",
"IGNORE_ERRORS" => $arDef["IGNORE_ERRORS"] === "Y"? "Y": "N",
"METHOD" => $arDef["METHOD"] === "resample"? "resample": "",
"COMPRESSION" => intval($arDef["COMPRESSION"]) > 100? 100: (intval($arDef["COMPRESSION"]) > 0? intval($arDef["COMPRESSION"]): ""),
"USE_WATERMARK_TEXT" => $arDef["USE_WATERMARK_TEXT"] === "Y"? "Y": "N",
"WATERMARK_TEXT" => $arDef["WATERMARK_TEXT"],
"WATERMARK_TEXT_FONT" => $arDef["WATERMARK_TEXT_FONT"],
"WATERMARK_TEXT_COLOR" => $arDef["WATERMARK_TEXT_COLOR"],
"WATERMARK_TEXT_SIZE" => intval($arDef["WATERMARK_TEXT_SIZE"]) > 0? intval($arDef["WATERMARK_TEXT_SIZE"]): "",
"WATERMARK_TEXT_POSITION" => $arDef["WATERMARK_TEXT_POSITION"],
"USE_WATERMARK_FILE" => $arDef["USE_WATERMARK_FILE"] === "Y"? "Y": "N",
"WATERMARK_FILE" => $arDef["WATERMARK_FILE"],
"WATERMARK_FILE_ALPHA" => intval($arDef["WATERMARK_FILE_ALPHA"]) > 0? intval($arDef["WATERMARK_FILE_ALPHA"]): "",
"WATERMARK_FILE_POSITION" => $arDef["WATERMARK_FILE_POSITION"],
"WATERMARK_FILE_ORDER" => $arDef["WATERMARK_FILE_ORDER"],
));
}
else
{
$arDef = "";
}
}
if(array_key_exists("SECTION_CODE", $arFields))
{
$arDef = &$arFields["SECTION_CODE"]["DEFAULT_VALUE"];
if(is_array($arDef))
{
$trans_len = intval($arDef["TRANS_LEN"]);
if($trans_len > 255)
$trans_len = 255;
elseif($trans_len < 1)
$trans_len = 100;
$arDef = serialize(array(
"UNIQUE" => $arDef["UNIQUE"] === "Y"? "Y": "N",
"TRANSLITERATION" => $arDef["TRANSLITERATION"] === "Y"? "Y": "N",
"TRANS_LEN" => $trans_len,
"TRANS_CASE" => $arDef["TRANS_CASE"] == "U"? "U": ($arDef["TRANS_CASE"] == ""? "": "L"),
"TRANS_SPACE" => substr($arDef["TRANS_SPACE"], 0, 1),
"TRANS_OTHER" => substr($arDef["TRANS_OTHER"], 0, 1),
"TRANS_EAT" => $arDef["TRANS_EAT"] === "N"? "N": "Y",
"USE_GOOGLE" => $arDef["USE_GOOGLE"] === "Y"? "Y": "N",
));
}
else
{
$arDef = "";
}
}
if(array_key_exists("SORT", $arFields))
{
$arFields["SORT"]["DEFAULT_VALUE"] = intval($arFields["SORT"]["DEFAULT_VALUE"]);
}
if(array_key_exists("IBLOCK_SECTION", $arFields))
{
$arDef = &$arFields["IBLOCK_SECTION"]["DEFAULT_VALUE"];
if(is_array($arDef))
{
$arDef = serialize(array(
"KEEP_IBLOCK_SECTION_ID" => $arDef["KEEP_IBLOCK_SECTION_ID"] === "Y"? "Y": "N",
));
}
else
{
$arDef = "";
}
}
while($ar = $res->Fetch())
{
if(array_key_exists($ar["FIELD_ID"], $arFields) && array_key_exists($ar["FIELD_ID"], $arDefFields))
{
if($arDefFields[$ar["FIELD_ID"]]["IS_REQUIRED"] === false)
$IS_REQUIRED = $arFields[$ar["FIELD_ID"]]["IS_REQUIRED"];
else
$IS_REQUIRED = $arDefFields[$ar["FIELD_ID"]]["IS_REQUIRED"];
$IS_REQUIRED = ($IS_REQUIRED === "Y"? "Y": "N");
if(
$ar["IS_REQUIRED"] !== $IS_REQUIRED
|| $ar["DEFAULT_VALUE"] !== $arFields[$ar["FIELD_ID"]]["DEFAULT_VALUE"]
)
{
$arUpdate = array(
"IS_REQUIRED" => $IS_REQUIRED,
"DEFAULT_VALUE" => $arFields[$ar["FIELD_ID"]]["DEFAULT_VALUE"],
);
}
else
{
$arUpdate = array(
);
}
unset($arDefFields[$ar["FIELD_ID"]]);
}
elseif(array_key_exists($ar["FIELD_ID"], $arDefFields))
{
$IS_REQUIRED = $arDefFields[$ar["FIELD_ID"]]["IS_REQUIRED"];
$IS_REQUIRED = ($IS_REQUIRED === "Y"? "Y": "N");
if($ar["IS_REQUIRED"] !== $IS_REQUIRED)
{
$arUpdate = array(
"IS_REQUIRED" => $IS_REQUIRED,
"DEFAULT_VALUE" => "",
);
}
else
{
$arUpdate = array(
);
}
unset($arDefFields[$ar["FIELD_ID"]]);
}
else
{
$DB->Query("DELETE FROM b_iblock_fields WHERE IBLOCK_ID = ".$ID." AND FIELD_ID = '".$DB->ForSQL($ar["FIELD_ID"])."'");
$arUpdate = array(
);
}
$strUpdate = $DB->PrepareUpdate("b_iblock_fields", $arUpdate);
if($strUpdate != "")
{
$strSql = "UPDATE b_iblock_fields SET ".$strUpdate." WHERE IBLOCK_ID = ".$ID." AND FIELD_ID = '".$ar["FIELD_ID"]."'";
$arBinds = array(
"DEFAULT_VALUE" => $arUpdate["DEFAULT_VALUE"],
);
$DB->QueryBind($strSql, $arBinds);
}
}
foreach($arDefFields as $FIELD_ID => $arDefaults)
{
if(array_key_exists($FIELD_ID, $arFields))
{
if($arDefaults["IS_REQUIRED"] === false)
$IS_REQUIRED = $arFields[$FIELD_ID]["IS_REQUIRED"];
else
$IS_REQUIRED = $arDefaults["IS_REQUIRED"];
$DEFAULT_VALUE = $arFields[$FIELD_ID]["DEFAULT_VALUE"];
}
else
{
$IS_REQUIRED = $arDefaults["IS_REQUIRED"];
$DEFAULT_VALUE = false;
}
$IS_REQUIRED = ($IS_REQUIRED === "Y"? "Y": "N");
$arAdd = array(
"ID" => 1,
"IBLOCK_ID" => $ID,
"FIELD_ID" => $FIELD_ID,
"IS_REQUIRED" => $IS_REQUIRED,
"DEFAULT_VALUE" => $DEFAULT_VALUE,
);
$DB->Add("b_iblock_fields", $arAdd, array("DEFAULT_VALUE"));
}
CIBlock::CleanCache($ID);
}
}
public static function GetFields($ID)
{
/** @global CDatabase $DB */
global $DB;
$ID = intval($ID);
$arDefFields = CIBlock::GetFieldsDefaults();
$res = $DB->Query("
SELECT
F.*
FROM
b_iblock B
LEFT JOIN b_iblock_fields F ON B.ID = F.IBLOCK_ID
WHERE
B.ID = ".$ID."
");
while($ar = $res->Fetch())
{
if(array_key_exists($ar["FIELD_ID"], $arDefFields))
{
if($arDefFields[$ar["FIELD_ID"]]["IS_REQUIRED"] === false)
$arDefFields[$ar["FIELD_ID"]]["IS_REQUIRED"] = $ar["IS_REQUIRED"] === "Y"? "Y": "N";
$arDefFields[$ar["FIELD_ID"]]["DEFAULT_VALUE"] = $ar["DEFAULT_VALUE"];
}
}
foreach($arDefFields as $FIELD_ID => $default)
{
if($default["IS_REQUIRED"] === false)
$arDefFields[$FIELD_ID]["IS_REQUIRED"] = "N";
if(
$FIELD_ID == "DETAIL_PICTURE"
|| $FIELD_ID == "PREVIEW_PICTURE"
|| $FIELD_ID == "CODE"
|| $FIELD_ID == "SECTION_PICTURE"
|| $FIELD_ID == "SECTION_DETAIL_PICTURE"
|| $FIELD_ID == "SECTION_CODE"
|| $FIELD_ID == "IBLOCK_SECTION"
)
{
$a = &$arDefFields[$FIELD_ID]["DEFAULT_VALUE"];
$a = strlen($a)? unserialize($a): array();
if(array_key_exists("TRANS_LEN", $a))
{
$trans_len = intval($a["TRANS_LEN"]);
if($trans_len > 255)
$trans_len = 255;
elseif($trans_len < 1)
$trans_len = 100;
$a["TRANS_LEN"] = $trans_len;
}
}
}
return $arDefFields;
}
public static function GetProperties($ID, $arOrder = array(), $arFilter = array())
{
$props = new CIBlockProperty();
$arFilter["IBLOCK_ID"] = $ID;
return $props->GetList($arOrder, $arFilter);
}
public static function GetGroupPermissions($ID)
{
/** @global CDatabase $DB */
global $DB;
$arRes = array();
$ID = (int)$ID;
if ($ID <= 0)
return $arRes;
$dbres = $DB->Query("
SELECT GROUP_ID, PERMISSION
FROM b_iblock_group
WHERE IBLOCK_ID = ".$ID."
");
while($res = $dbres->Fetch())
$arRes[$res["GROUP_ID"]] = $res["PERMISSION"];
unset($res);
unset($dbres);
return $arRes;
}
function GetPermission($IBLOCK_ID, $FOR_USER_ID = false)
{
/** @global CDatabase $DB */
global $DB;
/** @global CUser $USER */
global $USER;
static $CACHE = array();
$USER_ID = is_object($USER)? intval($USER->GetID()): 0;
if($FOR_USER_ID > 0 && $FOR_USER_ID != $USER_ID)
{
$arGroups = CUser::GetUserGroup($FOR_USER_ID);
if(
in_array(1, $arGroups)
&& COption::GetOptionString("main", "controller_member", "N") != "Y"
&& COption::GetOptionString("main", "~controller_limited_admin", "N") != "Y"
)
return "X";
$USER_GROUPS = implode(",", $arGroups);
}
elseif(is_object($USER))
{
if($USER->IsAdmin())
return "X";
$USER_GROUPS = $USER->GetGroups();
}
else
{
$USER_GROUPS = "2";
}
$IBLOCK_ID = intval($IBLOCK_ID);
$CACHE_KEY = $IBLOCK_ID."|".$USER_GROUPS;
if(!array_key_exists($CACHE_KEY, $CACHE))
{
//Deny by default
$CACHE[$CACHE_KEY] = "D";
//Now check database
$strSql = "
SELECT MAX(IBG.PERMISSION) as P
FROM b_iblock_group IBG
WHERE IBG.IBLOCK_ID=".$IBLOCK_ID."
AND IBG.GROUP_ID IN (".$USER_GROUPS.")
";
$res = $DB->Query($strSql);
if($r = $res->Fetch())
{
if(strlen($r['P']) > 0)
{
//Overwrite default value
$CACHE[$CACHE_KEY] = $r["P"];
}
}
}
return $CACHE[$CACHE_KEY];
}
function OnBeforeLangDelete($lang)
{
/** @global CDatabase $DB */
global $DB;
/** @global CMain $APPLICATION */
global $APPLICATION;
$r = $DB->Query("
SELECT IBLOCK_ID
FROM b_iblock_site
WHERE SITE_ID='".$DB->ForSQL($lang, 2)."'
ORDER BY IBLOCK_ID
");
$arIBlocks = array();
while($a = $r->Fetch())
$arIBlocks[] = $a["IBLOCK_ID"];
if(count($arIBlocks) > 0)
{
$APPLICATION->ThrowException(GetMessage("IBLOCK_SITE_LINKS_EXISTS", array("#ID_LIST#" => implode(", ", $arIBlocks))));
return false;
}
else
{
return true;
}
}
function OnLangDelete($lang)
{
return true;
}
function OnGroupDelete($group_id)
{
/** @global CDatabase $DB */
global $DB;
return $DB->Query("DELETE FROM b_iblock_group WHERE GROUP_ID=".IntVal($group_id), true);
}
public static function MkOperationFilter($key)
{
static $operations = array(
"!><" => "NB", //not between
"!=" => "NI", //not Identical
"!%" => "NS", //not substring
"><" => "B", //between
">=" => "GE", //greater or equal
"<=" => "LE", //less or equal
"=" => "I", //Identical
"%" => "S", //substring
"?" => "?", //logical
">" => "G", //greater
"<" => "L", //less
"!" => "N", // not field LIKE val
"*" => "FT", // partial full text match
"*=" => "FTI", // identical full text match
"*%" => "FTL", // partial full text match based on LIKE
);
$key = (string)$key;
if ($key == '')
return array("FIELD"=>$key, "OPERATION"=>"E"); // zero key
for ($i = 3; $i > 0; $i--)
{
$op = substr($key, 0, $i);
if ($op && isset($operations[$op]))
{
return array(
"FIELD" => substr($key, $i),
"OPERATION" => $operations[$op],
);
}
}
return array("FIELD"=>$key, "OPERATION"=>"E"); // field LIKE val
}
public static function FilterCreate($field_name, $values, $type, $cOperationType=false, $bSkipEmpty = true)
{
return CIBlock::FilterCreateEx($field_name, $values, $type, $bFullJoin, $cOperationType, $bSkipEmpty);
}
function ForLIKE($str)
{
/** @global CDatabase $DB */
global $DB;
return str_replace("%", "\\%", str_replace("_", "\\_", $DB->ForSQL($str)));
}
public static function FilterCreateEx($fname, $vals, $type, &$bFullJoin, $cOperationType=false, $bSkipEmpty = true)
{
/** @global CDatabase $DB */
global $DB;
if(!is_array($vals))
$vals=Array($vals);
if(count($vals)<1)
return "";
if(is_bool($cOperationType))
{
if($cOperationType===true)
$cOperationType = "N";
else
$cOperationType = "E";
}
if($cOperationType=="E") // most req operation
$strOperation = "=";
elseif($cOperationType=="G")
$strOperation = ">";
elseif($cOperationType=="GE")
$strOperation = ">=";
elseif($cOperationType=="LE")
$strOperation = "<=";
elseif($cOperationType=="L")
$strOperation = "<";
elseif($cOperationType=='B')
$strOperation = array('BETWEEN', 'AND');
elseif($cOperationType=='NB')
$strOperation = array('BETWEEN', 'AND');
else
$strOperation = "=";
if($cOperationType=='B' || $cOperationType=='NB')
{
if(count($vals)==2 && !is_array($vals[0]))
$vals = array($vals);
}
$bNegative = substr($cOperationType, 0, 1)=="N";
$bFullJoin = false;
$bWasLeftJoin = false;
$arIn = Array(); //This will gather equality number conditions
$bWasNull = false;
$res = Array();
foreach($vals as $val)
{
if(
!$bSkipEmpty
|| (is_array($strOperation) && is_array($val))
|| (is_bool($val) && $val===false)
|| strlen($val)>0
)
{
switch ($type)
{
case "string_equal":
if($cOperationType=="?")
{
if(strlen($val)>0)
$res[] = GetFilterQuery($fname, $val, "N");
}
elseif($cOperationType=="S" || $cOperationType=="NS")
$res[] = ($cOperationType=="NS"?" ".$fname." IS NULL OR NOT ":"")."(".CIBlock::_Upper($fname)." LIKE ".CIBlock::_Upper("'%".CIBlock::ForLIKE($val)."%'").")";
elseif(($cOperationType=="B" || $cOperationType=="NB") && is_array($val) && count($val)==2)
$res[] = ($cOperationType=="NB"?" ".$fname." IS NULL OR NOT ":"")."(".CIBlock::_Upper($fname)." ".$strOperation[0]." '".CIBlock::_Upper($DB->ForSql($val[0]))."' ".$strOperation[1]." '".CIBlock::_Upper($DB->ForSql($val[1]))."')";
else
{
if(strlen($val)<=0)
$res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL OR ".$DB->Length($fname)."<=0)";
else
$res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".CIBlock::_Upper($fname).$strOperation.CIBlock::_Upper("'".$DB->ForSql($val)."'").")";
}
break;
case "string":
if($cOperationType=="?")
{
if(strlen($val)>0)
{
$sr = GetFilterQuery($fname, $val, "Y", array(), ($fname=="BE.SEARCHABLE_CONTENT" || $fname=="BE.DETAIL_TEXT" ? "Y" : "N"));
if($sr != "0")
$res[] = $sr;
}
}
elseif(($cOperationType=="B" || $cOperationType=="NB") && is_array($val) && count($val)==2)
{
$res[] = ($cOperationType=="NB"?" ".$fname." IS NULL OR NOT ":"")."(".CIBlock::_Upper($fname)." ".$strOperation[0]." '".CIBlock::_Upper($DB->ForSql($val[0]))."' ".$strOperation[1]." '".CIBlock::_Upper($DB->ForSql($val[1]))."')";
}
elseif($cOperationType=="S" || $cOperationType=="NS")
$res[] = ($cOperationType=="NS"?" ".$fname." IS NULL OR NOT ":"")."(".CIBlock::_Upper($fname)." LIKE ".CIBlock::_Upper("'%".CIBlock::ForLIKE($val)."%'").")";
elseif($cOperationType=="FTL")
{
$sqlWhere = new CSQLWhere();
$res[] = $sqlWhere->matchLike($fname, $val);
}
else
{
if(strlen($val)<=0)
$res[] = ($bNegative? "NOT": "")."(".$fname." IS NULL OR ".$DB->Length($fname)."<=0)";
else
if($strOperation=="=" && $cOperationType!="I" && $cOperationType!="NI")
$res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".($DB->type=="ORACLE"?CIBlock::_Upper($fname)." LIKE ".CIBlock::_Upper("'".$DB->ForSqlLike($val)."'")." ESCAPE '\\'" : $fname." LIKE '".$DB->ForSqlLike($val)."'").")";
else
$res[] = ($bNegative? " ".$fname." IS NULL OR NOT ": "")."(".($DB->type=="ORACLE"?CIBlock::_Upper($fname)." ".$strOperation." ".CIBlock::_Upper("'".$DB->ForSql($val)."'")." " : $fname." ".$strOperation." '".$DB->ForSql($val)."'").")";
}
break;
case "date":
if(!is_array($val) && strlen($val)<=0)
$res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL)";
elseif(($cOperationType=="B" || $cOperationType=="NB") && is_array($val) && count($val)==2)
$res[] = ($cOperationType=='NB'?' '.$fname.' IS NULL OR NOT ':'').'('.$fname.' '.$strOperation[0].' '.$DB->CharToDateFunction($DB->ForSql($val[0]), "FULL").' '.$strOperation[1].' '.$DB->CharToDateFunction($DB->ForSql($val[1]), "FULL").')';
else
$res[] = ($bNegative? " ".$fname." IS NULL OR NOT ": "")."(".$fname." ".$strOperation." ".$DB->CharToDateFunction($DB->ForSql($val), "FULL").")";
break;
case "number":
if(!is_array($val) && strlen($val)<=0)
{
$res[] = $fname." IS ".($bNegative? "NOT NULL": " NULL");
$bWasNull = true;
}
elseif($cOperationType=="B" || $cOperationType=="NB")
{
if(is_array($val))
{
if(count($val)==2)
$res[] = ($cOperationType=='NB'?' '.$fname.' IS NULL OR NOT ':'').'('.$fname.' '.$strOperation[0].' \''.DoubleVal($val[0]).'\' '.$strOperation[1].' \''.DoubleVal($val[1]).'\')';
else
$res[] = ($cOperationType=='NB'?' '.$fname.' IS NULL OR NOT ':'').'('.$fname.' = \''.DoubleVal(array_pop($val[0])).'\')';
}
else
{
$res[] = ($cOperationType=='NB'?' '.$fname.' IS NULL OR NOT ':'').'('.$fname.' = \''.DoubleVal($val).'\')';
}
}
elseif($bNegative)
{
$res[] = " ".$fname." IS NULL OR NOT (".$fname." ".$strOperation." '".DoubleVal($val)."')";
if($strOperation == '=')
$arIn[] = DoubleVal($val);
}
else
{
$res[] = "(".$fname." ".$strOperation." '".DoubleVal($val)."')";
if($strOperation == '=')
$arIn[] = DoubleVal($val);
}
break;
case "number_above":
if(strlen($val)<=0)
$res[] = ($cOperationType=="N"?"NOT":"")."(".$fname." IS NULL)";
else
$res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".$fname." ".$strOperation." '".$DB->ForSql($val)."')";
break;
case "fulltext":
if($cOperationType=="FT" || $cOperationType=="FTI")
{
$sqlWhere = new CSQLWhere();
$res[] = $sqlWhere->match($fname, $val, $cOperationType=="FT");
}
elseif($cOperationType=="FTL")
{
$sqlWhere = new CSQLWhere();
$res[] = $sqlWhere->matchLike($fname, $val);
}
elseif($cOperationType=="?")
{
if(strlen($val)>0)
{
$sr = GetFilterQuery($fname, $val, "Y", array(), ($fname=="BE.SEARCHABLE_CONTENT" || $fname=="BE.DETAIL_TEXT" ? "Y" : "N"));
if($sr != "0")
$res[] = $sr;
}
}
elseif(($cOperationType=="B" || $cOperationType=="NB") && is_array($val) && count($val)==2)
{
$res[] = ($cOperationType=="NB"?" ".$fname." IS NULL OR NOT ":"")."(".CIBlock::_Upper($fname)." ".$strOperation[0]." '".CIBlock::_Upper($DB->ForSql($val[0]))."' ".$strOperation[1]." '".CIBlock::_Upper($DB->ForSql($val[1]))."')";
}
elseif($cOperationType=="S" || $cOperationType=="NS")
$res[] = ($cOperationType=="NS"?" ".$fname." IS NULL OR NOT ":"")."(".CIBlock::_Upper($fname)." LIKE ".CIBlock::_Upper("'%".CIBlock::ForLIKE($val)."%'").")";
else
{
if(strlen($val)<=0)
$res[] = ($bNegative? "NOT": "")."(".$fname." IS NULL OR ".$DB->Length($fname)."<=0)";
else
if($strOperation=="=" && $cOperationType!="I" && $cOperationType!="NI")
$res[] = ($cOperationType=="N"?" ".$fname." IS NULL OR NOT ":"")."(".($DB->type=="ORACLE"?CIBlock::_Upper($fname)." LIKE ".CIBlock::_Upper("'".$DB->ForSqlLike($val)."'")." ESCAPE '\\'" : $fname." LIKE '".$DB->ForSqlLike($val)."'").")";
else
$res[] = ($bNegative? " ".$fname." IS NULL OR NOT ": "")."(".($DB->type=="ORACLE"?CIBlock::_Upper($fname)." ".$strOperation." ".CIBlock::_Upper("'".$DB->ForSql($val)."'")." " : $fname." ".$strOperation." '".$DB->ForSql($val)."'").")";
}
break;
}
if((is_array($val) || strlen($val) > 0) && !$bNegative)
$bFullJoin = true;
else
$bWasLeftJoin = true;
}
}
$strResult = "";
$cntIn = count($arIn);
if(
!$bWasNull
&& $cntIn > 1
&& (
$cntIn < 2000
|| $DB->type == "MYSQL"
)
)
{
if($bNegative)
$res = array($fname." IS NULL OR NOT (".$fname." IN ('".implode("', '", $arIn)."'))");
else
$res = array($fname." IN ('".implode("', '", $arIn)."')");
}
foreach($res as $i=>$val)
{
if($i>0)
$strResult .= ($bNegative? " AND ": " OR ");
$strResult .= "(".$val.")";
}
if($strResult!="")
$strResult = "(".$strResult.")";
if($bFullJoin && $bWasLeftJoin && !$bNegative)
$bFullJoin = false;
return $strResult;
}
public static function _MergeIBArrays($iblock_id, $iblock_code = false, $iblock_id2 = false, $iblock_code2 = false)
{
if(!is_array($iblock_id))
{
if(is_numeric($iblock_id) || strlen($iblock_id) > 0)
$iblock_id = Array($iblock_id);
elseif(is_array($iblock_id2))
$iblock_id = $iblock_id2;
elseif(is_numeric($iblock_id2) || strlen($iblock_id2) > 0)
$iblock_id = Array($iblock_id2);
}
if(!is_array($iblock_code))
{
if(is_numeric($iblock_code) || strlen($iblock_code) > 0)
$iblock_code = Array($iblock_code);
elseif(is_array($iblock_code2))
$iblock_code = $iblock_code2;
elseif(is_numeric($iblock_code2) || strlen($iblock_code2) > 0)
$iblock_code = Array($iblock_code2);
}
if(is_array($iblock_code) && is_array($iblock_id))
return array_merge($iblock_code, $iblock_id);
if(is_array($iblock_code))
return $iblock_code;
if(is_array($iblock_id))
return $iblock_id;
return array();
}
function OnSearchGetURL($arFields)
{
/** @global CDatabase $DB */
global $DB;
static $arIBlockCache = array();
if($arFields["MODULE_ID"] !== "iblock" || substr($arFields["URL"], 0, 1) !== "=")
return $arFields["URL"];
$IBLOCK_ID = IntVal($arFields["PARAM2"]);
if(!array_key_exists($IBLOCK_ID, $arIBlockCache))
{
$res = $DB->Query("
SELECT
DETAIL_PAGE_URL,
SECTION_PAGE_URL,
CODE as IBLOCK_CODE,
XML_ID as IBLOCK_EXTERNAL_ID,
IBLOCK_TYPE_ID
FROM
b_iblock
WHERE ID = ".$IBLOCK_ID."
");
$arIBlockCache[$IBLOCK_ID] = $res->Fetch();
}
if(!is_array($arIBlockCache[$IBLOCK_ID]))
return "";
$arFields["URL"] = LTrim($arFields["URL"], " =");
parse_str($arFields["URL"], $arr);
$arr = $arIBlockCache[$IBLOCK_ID] + $arr;
$arr["LANG_DIR"] = $arFields["DIR"];
if(substr($arFields["ITEM_ID"], 0, 1) !== 'S')
return CIBlock::ReplaceDetailUrl($arIBlockCache[$IBLOCK_ID]["DETAIL_PAGE_URL"], $arr, false, "E");
else
return CIBlock::ReplaceDetailUrl($arIBlockCache[$IBLOCK_ID]["SECTION_PAGE_URL"], $arr, false, "S");
}
public static function ReplaceSectionUrl($url, $arr, $server_name = false, $arrType = false)
{
$url = str_replace("#ID#", "#SECTION_ID#", $url);
$url = str_replace("#CODE#", "#SECTION_CODE#", $url);
return CIBlock::ReplaceDetailUrl($url, $arr, $server_name, $arrType);
}
function _GetProductUrl($OF_ELEMENT_ID, $OF_IBLOCK_ID, $server_name = false, $arrType = false)
{
static $arIBlockCache = array();
static $arElementCache = array();
static $arSectionCache = array();
static $catalogIncluded = null;
$product_url = "";
$OF_ELEMENT_ID = (int)$OF_ELEMENT_ID;
$OF_IBLOCK_ID = (int)$OF_IBLOCK_ID;
if ($catalogIncluded === null)
$catalogIncluded = Loader::includeModule('catalog');
if(
$arrType === "E"
&& $OF_IBLOCK_ID > 0
&& $OF_ELEMENT_ID > 0
&& $catalogIncluded
)
{
if (!isset($arIBlockCache[$OF_IBLOCK_ID]))
{
$arIBlockCache[$OF_IBLOCK_ID] = CCatalogSku::GetInfoByOfferIBlock($OF_IBLOCK_ID);
if (is_array($arIBlockCache[$OF_IBLOCK_ID]))
$arIBlockCache[$OF_IBLOCK_ID]["PRODUCT_IBLOCK"] = CIBlock::GetArrayByID($arIBlockCache[$OF_IBLOCK_ID]["PRODUCT_IBLOCK_ID"]);
}
if (is_array($arIBlockCache[$OF_IBLOCK_ID]))
{
if(!isset($arElementCache[$OF_ELEMENT_ID]))
{
$OF_PROP_ID = $arIBlockCache[$OF_IBLOCK_ID]["SKU_PROPERTY_ID"];
$rsOffer = CIBlockElement::GetList(
array(),
array(
"IBLOCK_ID" => $arIBlockCache[$OF_IBLOCK_ID]["IBLOCK_ID"],
"=ID" => $OF_ELEMENT_ID,
),
false, false,
array(
"LANG_DIR",
"PROPERTY_".$OF_PROP_ID.".ID",
"PROPERTY_".$OF_PROP_ID.".CODE",
"PROPERTY_".$OF_PROP_ID.".XML_ID",
"PROPERTY_".$OF_PROP_ID.".IBLOCK_ID",
"PROPERTY_".$OF_PROP_ID.".IBLOCK_SECTION_ID",
)
);
if($arOffer = $rsOffer->Fetch())
{
$arOffer["PROPERTY_".$OF_PROP_ID."_IBLOCK_SECTION_CODE"] = '';
$sectionId = (int)$arOffer["PROPERTY_".$OF_PROP_ID."_IBLOCK_SECTION_ID"];
if ($sectionId > 0)
{
if (!isset($arSectionCache[$sectionId]))
{
$arSectionCache[$sectionId] = array(
'ID' => $sectionId,
'CODE' => ''
);
$rsSections = CIBlockSection::GetList(
array(),
array('ID' => $sectionId),
false,
array('ID', 'IBLOCK_ID', 'CODE')
);
if ($arSection = $rsSections->Fetch())
{
$arSectionCache[$sectionId]['CODE'] = $arSection['CODE'];
}
unset($arSection);
unset($rsSections);
}
$arOffer["PROPERTY_".$OF_PROP_ID."_IBLOCK_SECTION_CODE"] = $arSectionCache[$sectionId]['CODE'];
}
unset($sectionId);
$arElementCache[$OF_ELEMENT_ID] = array(
"LANG_DIR" => $arOffer["LANG_DIR"],
"ID" => $arOffer["PROPERTY_".$OF_PROP_ID."_ID"],
"ELEMENT_ID" => $arOffer["PROPERTY_".$OF_PROP_ID."_ID"],
"CODE" => $arOffer["PROPERTY_".$OF_PROP_ID."_CODE"],
"ELEMENT_CODE" => $arOffer["PROPERTY_".$OF_PROP_ID."_CODE"],
"EXTERNAL_ID" => $arOffer["PROPERTY_".$OF_PROP_ID."_XML_ID"],
"IBLOCK_TYPE_ID" => $arIBlockCache[$OF_IBLOCK_ID]["PRODUCT_IBLOCK"]["IBLOCK_TYPE_ID"],
"IBLOCK_ID" => $arOffer["PROPERTY_".$OF_PROP_ID."_IBLOCK_ID"],
"IBLOCK_CODE" => $arIBlockCache[$OF_IBLOCK_ID]["PRODUCT_IBLOCK"]["CODE"],
"IBLOCK_EXTERNAL_ID" => $arIBlockCache[$OF_IBLOCK_ID]["PRODUCT_IBLOCK"]["XML_ID"],
"IBLOCK_SECTION_ID" => $arOffer["PROPERTY_".$OF_PROP_ID."_IBLOCK_SECTION_ID"],
"SECTION_CODE" => $arOffer["PROPERTY_".$OF_PROP_ID."_IBLOCK_SECTION_CODE"],
);
}
}
if(is_array($arElementCache[$OF_ELEMENT_ID]))
{
$product_url = CIBlock::ReplaceDetailUrl($arIBlockCache[$OF_IBLOCK_ID]["PRODUCT_IBLOCK"]["DETAIL_PAGE_URL"], $arElementCache[$OF_ELEMENT_ID], $server_name, $arrType);
}
}
}
return $product_url;
}
public static function ReplaceDetailUrl($url, $arr, $server_name = false, $arrType = false)
{
/** @global CDatabase $DB */
global $DB;
if($server_name)
{
$url = str_replace("#LANG#", $arr["LANG_DIR"], $url);
if((defined("ADMIN_SECTION") && ADMIN_SECTION===true) || !defined("BX_STARTED"))
{
static $cache = array();
if(!isset($cache[$arr["LID"]]))
{
$db_lang = CLang::GetByID($arr["LID"]);
$arLang = $db_lang->Fetch();
$cache[$arr["LID"]] = $arLang;
}
$arLang = $cache[$arr["LID"]];
$url = str_replace("#SITE_DIR#", $arLang["DIR"], $url);
$url = str_replace("#SERVER_NAME#", $arLang["SERVER_NAME"], $url);
}
else
{
$url = str_replace("#SITE_DIR#", SITE_DIR, $url);
$url = str_replace("#SERVER_NAME#", SITE_SERVER_NAME, $url);
}
}
$id = (int)$arr["ID"];
$preparedId = $id > 0 ? $id : '';
if(strpos($url, "#PRODUCT_URL#") !== false)
$url = str_replace("#PRODUCT_URL#", CIBlock::_GetProductUrl($id, $arr["IBLOCK_ID"], $server_name, $arrType), $url);
static $arSearch = array(
/*Thees come from GetNext*/
"#SITE_DIR#",
"#ID#",
"#CODE#",
"#EXTERNAL_ID#",
"#IBLOCK_TYPE_ID#",
"#IBLOCK_ID#",
"#IBLOCK_CODE#",
"#IBLOCK_EXTERNAL_ID#",
/*And thees was born during components 2 development*/
"#ELEMENT_ID#",
"#ELEMENT_CODE#",
"#SECTION_ID#",
"#SECTION_CODE#",
"#SECTION_CODE_PATH#",
);
$arReplace = array(
$arr["LANG_DIR"],
$preparedId,
rawurlencode(isset($arr["~CODE"])? $arr["~CODE"]: $arr["CODE"]),
rawurlencode(isset($arr["~EXTERNAL_ID"])? $arr["~EXTERNAL_ID"]: $arr["EXTERNAL_ID"]),
rawurlencode(isset($arr["~IBLOCK_TYPE_ID"])? $arr["~IBLOCK_TYPE_ID"]: $arr["IBLOCK_TYPE_ID"]),
intval($arr["IBLOCK_ID"]) > 0? intval($arr["IBLOCK_ID"]): "",
rawurlencode(isset($arr["~IBLOCK_CODE"])? $arr["~IBLOCK_CODE"]: $arr["IBLOCK_CODE"]),
rawurlencode(isset($arr["~IBLOCK_EXTERNAL_ID"])? $arr["~IBLOCK_EXTERNAL_ID"]: $arr["IBLOCK_EXTERNAL_ID"]),
);
if($arrType === "E")
{
$arReplace[] = $preparedId;
$arReplace[] = rawurlencode(isset($arr["~CODE"])? $arr["~CODE"]: $arr["CODE"]);
#Deal with symbol codes
$SECTION_ID = intval($arr["IBLOCK_SECTION_ID"]);
$SECTION_CODE = "";
if(
$SECTION_ID > 0
&& strpos($url, "#SECTION_CODE#") !== false
)
{
$SECTION_CODE = CIBlockSection::getSectionCode($SECTION_ID);
}
$SECTION_CODE_PATH = "";
if(
$SECTION_ID > 0
&& strpos($url, "#SECTION_CODE_PATH#") !== false
)
{
$SECTION_CODE_PATH = CIBlockSection::getSectionCodePath($SECTION_ID);
}
$arReplace[] = $SECTION_ID > 0? $SECTION_ID: "";
$arReplace[] = $SECTION_CODE;
$arReplace[] = $SECTION_CODE_PATH;
}
elseif($arrType === "S")
{
$SECTION_ID = $id;
$SECTION_CODE_PATH = "";
if(
$SECTION_ID > 0
&& strpos($url, "#SECTION_CODE_PATH#") !== false
)
{
$SECTION_CODE_PATH = CIBlockSection::getSectionCodePath($SECTION_ID);
}
$arReplace[] = "";
$arReplace[] = "";
$arReplace[] = $SECTION_ID > 0? $SECTION_ID: "";
$arReplace[] = rawurlencode(isset($arr["~CODE"])? $arr["~CODE"]: $arr["CODE"]);
$arReplace[] = $SECTION_CODE_PATH;
}
else
{
$arReplace[] = intval($arr["ELEMENT_ID"]) > 0? intval($arr["ELEMENT_ID"]): "";
$arReplace[] = rawurlencode(isset($arr["~ELEMENT_CODE"])? $arr["~ELEMENT_CODE"]: $arr["ELEMENT_CODE"]);
$arReplace[] = intval($arr["IBLOCK_SECTION_ID"]) > 0? intval($arr["IBLOCK_SECTION_ID"]): "";
$arReplace[] = rawurlencode(isset($arr["~SECTION_CODE"])? $arr["~SECTION_CODE"]: $arr["SECTION_CODE"]);
$arReplace[] = "";
}
$url = str_replace($arSearch, $arReplace, $url);
return preg_replace("'(?<!:)/+'s", "/", $url);
}
function OnSearchReindex($NS=Array(), $oCallback=NULL, $callback_method="")
{
/** @global CUserTypeManager $USER_FIELD_MANAGER */
global $USER_FIELD_MANAGER;
/** $global CDatabase $DB */
global $DB;
$strNSJoin1 = "";
$strNSFilter1 = "";
$strNSFilter2 = "";
$strNSFilter3 = "";
$arResult = Array();
if($NS["MODULE"]=="iblock" && strlen($NS["ID"])>0)
{
$arrTmp = explode(".", $NS["ID"]);
$strNSFilter1 = " AND B.ID>=".IntVal($arrTmp[0])." ";
if(substr($arrTmp[1], 0, 1)!='S')
{
$strNSFilter2 = " AND BE.ID>".IntVal($arrTmp[1])." ";
}
else
{
$strNSFilter2 = false;
$strNSFilter3 = " AND BS.ID>".IntVal(substr($arrTmp[1], 1))." ";
}
}
if($NS["SITE_ID"]!="")
{
$strNSJoin1 .= " INNER JOIN b_iblock_site BS ON BS.IBLOCK_ID=B.ID ";
$strNSFilter1 .= " AND BS.SITE_ID='".$DB->ForSQL($NS["SITE_ID"])."' ";
}
$strSql = "
SELECT B.ID, B.IBLOCK_TYPE_ID, B.INDEX_ELEMENT, B.INDEX_SECTION, B.RIGHTS_MODE,
B.IBLOCK_TYPE_ID, B.CODE as IBLOCK_CODE, B.XML_ID as IBLOCK_EXTERNAL_ID,
B.SOCNET_GROUP_ID
FROM b_iblock B
".$strNSJoin1."
WHERE B.ACTIVE = 'Y'
AND (B.INDEX_ELEMENT='Y' OR B.INDEX_SECTION='Y')
".$strNSFilter1."
ORDER BY B.ID
";
$dbrIBlock = $DB->Query($strSql);
while($arIBlock = $dbrIBlock->Fetch())
{
$IBLOCK_ID = $arIBlock["ID"];
$arGroups = Array();
$strSql =
"SELECT GROUP_ID ".
"FROM b_iblock_group ".
"WHERE IBLOCK_ID= ".$IBLOCK_ID." ".
" AND PERMISSION>='R' ".
" AND GROUP_ID>1 ".
"ORDER BY GROUP_ID";
$dbrIBlockGroup = $DB->Query($strSql);
while($arIBlockGroup = $dbrIBlockGroup->Fetch())
{
$arGroups[] = $arIBlockGroup["GROUP_ID"];
if($arIBlockGroup["GROUP_ID"]==2) break;
}
$arSITE = Array();
$strSql =
"SELECT SITE_ID ".
"FROM b_iblock_site ".
"WHERE IBLOCK_ID= ".$IBLOCK_ID;
$dbrIBlockSite = $DB->Query($strSql);
while($arIBlockSite = $dbrIBlockSite->Fetch())
$arSITE[] = $arIBlockSite["SITE_ID"];
if($arIBlock["INDEX_ELEMENT"]=='Y' && ($strNSFilter2 !== false))
{
$strSql =
"SELECT BE.ID, BE.NAME, BE.TAGS, ".
" ".$DB->DateToCharFunction("BE.ACTIVE_FROM")." as DATE_FROM, ".
" ".$DB->DateToCharFunction("BE.ACTIVE_TO")." as DATE_TO, ".
" ".$DB->DateToCharFunction("BE.TIMESTAMP_X")." as LAST_MODIFIED, ".
" BE.PREVIEW_TEXT_TYPE, BE.PREVIEW_TEXT, ".
" BE.DETAIL_TEXT_TYPE, BE.DETAIL_TEXT, ".
" BE.XML_ID as EXTERNAL_ID, BE.CODE, ".
" BE.IBLOCK_SECTION_ID ".
"FROM b_iblock_element BE ".
"WHERE BE.IBLOCK_ID=".$IBLOCK_ID." ".
" AND BE.ACTIVE='Y' ".
CIBlockElement::WF_GetSqlLimit("BE.", "N").
$strNSFilter2.
"ORDER BY BE.ID ";
//For MySQL we have to solve client out of memory
//problem by limiting the query
if($DB->type=="MYSQL")
{
$limit = 1000;
$strSql .= " LIMIT ".$limit;
}
else
{
$limit = false;
}
$dbrIBlockElement = $DB->Query($strSql);
while($arIBlockElement = $dbrIBlockElement->Fetch())
{
$DETAIL_URL =
"=ID=".urlencode($arIBlockElement["ID"]).
"&EXTERNAL_ID=".urlencode($arIBlockElement["EXTERNAL_ID"]).
"&CODE=".urlencode($arIBlockElement["CODE"]).
"&IBLOCK_SECTION_ID=".urlencode($arIBlockElement["IBLOCK_SECTION_ID"]).
"&IBLOCK_TYPE_ID=".urlencode($arIBlock["IBLOCK_TYPE_ID"]).
"&IBLOCK_ID=".urlencode($IBLOCK_ID).
"&IBLOCK_CODE=".urlencode($arIBlock["IBLOCK_CODE"]).
"&IBLOCK_EXTERNAL_ID=".urlencode($arIBlock["IBLOCK_EXTERNAL_ID"]);
$BODY =
($arIBlockElement["PREVIEW_TEXT_TYPE"]=="html" ?
CSearch::KillTags($arIBlockElement["PREVIEW_TEXT"]) :
$arIBlockElement["PREVIEW_TEXT"]
)."\r\n".
($arIBlockElement["DETAIL_TEXT_TYPE"]=="html" ?
CSearch::KillTags($arIBlockElement["DETAIL_TEXT"]) :
$arIBlockElement["DETAIL_TEXT"]
);
$dbrProperties = CIBlockElement::GetProperty($IBLOCK_ID, $arIBlockElement["ID"], "sort", "asc", array("ACTIVE"=>"Y", "SEARCHABLE"=>"Y"));
while($arProperties = $dbrProperties->Fetch())
{
$BODY .= "\r\n";
if(strlen($arProperties["USER_TYPE"]) > 0)
$UserType = CIBlockProperty::GetUserType($arProperties["USER_TYPE"]);
else
$UserType = array();
if(array_key_exists("GetSearchContent", $UserType))
{
$BODY .= CSearch::KillTags(
call_user_func_array($UserType["GetSearchContent"],
array(
$arProperties,
array("VALUE" => $arProperties["VALUE"]),
array(),
)
)
);
}
elseif(array_key_exists("GetPublicViewHTML", $UserType))
{
$BODY .= CSearch::KillTags(
call_user_func_array($UserType["GetPublicViewHTML"],
array(
$arProperties,
array("VALUE" => $arProperties["VALUE"]),
array(),
)
)
);
}
elseif($arProperties["PROPERTY_TYPE"]=='L')
{
$BODY .= $arProperties["VALUE_ENUM"];
}
elseif($arProperties["PROPERTY_TYPE"]=='F')
{
$arFile = CIBlockElement::__GetFileContent($arProperties["VALUE"]);
if(is_array($arFile))
{
$BODY .= $arFile["CONTENT"];
$arIBlockElement["TAGS"] .= ",".$arFile["PROPERTIES"][COption::GetOptionString("search", "page_tag_property")];
}
}
else
{
$BODY .= $arProperties["VALUE"];
}
}
if($arIBlock["RIGHTS_MODE"] !== "E")
$arPermissions = $arGroups;
else
{
$obElementRights = new CIBlockElementRights($IBLOCK_ID, $arIBlockElement["ID"]);
$arPermissions = $obElementRights->GetGroups(array("element_read"));
}
$Result = array(
"ID" => $arIBlockElement["ID"],
"LAST_MODIFIED" => (strlen($arIBlockElement["DATE_FROM"])>0? $arIBlockElement["DATE_FROM"]: $arIBlockElement["LAST_MODIFIED"]),
"TITLE" => $arIBlockElement["NAME"],
"BODY" => $BODY,
"TAGS" => $arIBlockElement["TAGS"],
"SITE_ID" => $arSITE,
"PARAM1" => $arIBlock["IBLOCK_TYPE_ID"],
"PARAM2" => $IBLOCK_ID,
"DATE_FROM" => (strlen($arIBlockElement["DATE_FROM"])>0? $arIBlockElement["DATE_FROM"] : false),
"DATE_TO" => (strlen($arIBlockElement["DATE_TO"])>0? $arIBlockElement["DATE_TO"] : false),
"PERMISSIONS" => $arPermissions,
"URL" => $DETAIL_URL
);
if ($arIBlock["SOCNET_GROUP_ID"] > 0)
$Result["PARAMS"] = array(
"socnet_group" => $arIBlock["SOCNET_GROUP_ID"],
);
if($oCallback)
{
$res = call_user_func(array($oCallback, $callback_method), $Result);
if(!$res)
return $IBLOCK_ID.".".$arIBlockElement["ID"];
}
else
{
$arResult[] = $Result;
}
if($limit !== false)
{
$limit--;
if($limit <= 0)
return $IBLOCK_ID.".".$arIBlockElement["ID"];
}
}
}
if($arIBlock["INDEX_SECTION"]=='Y')
{
$strSql =
"SELECT BS.ID, BS.NAME, ".
" ".$DB->DateToCharFunction("BS.TIMESTAMP_X")." as LAST_MODIFIED, ".
" BS.DESCRIPTION_TYPE, BS.DESCRIPTION, BS.XML_ID as EXTERNAL_ID, BS.CODE, ".
" BS.IBLOCK_ID ".
"FROM b_iblock_section BS ".
"WHERE BS.IBLOCK_ID=".$IBLOCK_ID." ".
" AND BS.GLOBAL_ACTIVE='Y' ".
$strNSFilter3.
"ORDER BY BS.ID ";
$dbrIBlockSection = $DB->Query($strSql);
while($arIBlockSection = $dbrIBlockSection->Fetch())
{
$DETAIL_URL =
"=ID=".$arIBlockSection["ID"].
"&EXTERNAL_ID=".$arIBlockSection["EXTERNAL_ID"].
"&CODE=".$arIBlockSection["CODE"].
"&IBLOCK_TYPE_ID=".$arIBlock["IBLOCK_TYPE_ID"].
"&IBLOCK_ID=".$arIBlockSection["IBLOCK_ID"].
"&IBLOCK_CODE=".$arIBlock["IBLOCK_CODE"].
"&IBLOCK_EXTERNAL_ID=".$arIBlock["IBLOCK_EXTERNAL_ID"];
$BODY =
($arIBlockSection["DESCRIPTION_TYPE"]=="html" ?
CSearch::KillTags($arIBlockSection["DESCRIPTION"])
:
$arIBlockSection["DESCRIPTION"]
);
$BODY .= $USER_FIELD_MANAGER->OnSearchIndex("IBLOCK_".$arIBlockSection["IBLOCK_ID"]."_SECTION", $arIBlockSection["ID"]);
if($arIBlock["RIGHTS_MODE"] !== "E")
$arPermissions = $arGroups;
else
{
$obSectionRights = new CIBlockSectionRights($IBLOCK_ID, $arIBlockSection["ID"]);
$arPermissions = $obSectionRights->GetGroups(array("section_read"));
}
$Result = Array(
"ID" => "S".$arIBlockSection["ID"],
"LAST_MODIFIED" => $arIBlockSection["LAST_MODIFIED"],
"TITLE" => $arIBlockSection["NAME"],
"BODY" => $BODY,
"SITE_ID" => $arSITE,
"PARAM1" => $arIBlock["IBLOCK_TYPE_ID"],
"PARAM2" => $IBLOCK_ID,
"PERMISSIONS" => $arPermissions,
"URL" => $DETAIL_URL,
);
if ($arIBlock["SOCNET_GROUP_ID"] > 0)
$Result["PARAMS"] = array(
"socnet_group" => $arIBlock["SOCNET_GROUP_ID"],
);
if($oCallback)
{
$res = call_user_func(array($oCallback, $callback_method), $Result);
if(!$res)
return $IBLOCK_ID.".S".$arIBlockSection["ID"];
}
else
{
$arResult[] = $Result;
}
}
}
$strNSFilter2="";
$strNSFilter3="";
}
if($oCallback)
return false;
return $arResult;
}
function GetElementCount($iblock_id)
{
/** @global CDatabase $DB */
global $DB;
$res = $DB->Query("
SELECT COUNT('x') as C
FROM b_iblock_element BE
WHERE BE.IBLOCK_ID=".intval($iblock_id)."
AND (
(BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL)
OR BE.WF_NEW='Y'
)
");
$ar = $res->Fetch();
return intval($ar["C"]);
}
public static function ResizePicture($arFile, $arResize)
{
if(strlen($arFile["tmp_name"]) <= 0)
return $arFile;
if(array_key_exists("error", $arFile) && $arFile["error"] !== 0)
return GetMessage("IBLOCK_BAD_FILE_ERROR");
$file = $arFile["tmp_name"];
if(!file_exists($file) && !is_file($file))
return GetMessage("IBLOCK_BAD_FILE_NOT_FOUND");
$width = intval($arResize["WIDTH"]);
$height = intval($arResize["HEIGHT"]);
if($width <= 0 && $height <= 0)
return $arFile;
$orig = CFile::GetImageSize($file, true);
if(!is_array($orig))
return GetMessage("IBLOCK_BAD_FILE_NOT_PICTURE");
$width_orig = $orig[0];
$height_orig = $orig[1];
$orientation = 0;
$exifData = array();
$image_type = $orig[2];
if($image_type == IMAGETYPE_JPEG)
{
$exifData = CFile::ExtractImageExif($file);
if ($exifData && isset($exifData['Orientation']))
{
$orientation = $exifData['Orientation'];
if ($orientation >= 5 && $orientation <= 8)
{
$width_orig = $orig[1];
$height_orig = $orig[0];
}
}
}
if(($width > 0 && $orig[0] > $width) || ($height > 0 && $orig[1] > $height))
{
if($arFile["COPY_FILE"] == "Y")
{
$new_file = CTempFile::GetFileName(basename($file));
CheckDirPath($new_file);
$arFile["copy"] = true;
if(copy($file, $new_file))
$file = $new_file;
else
return GetMessage("IBLOCK_BAD_FILE_NOT_FOUND");
}
if($width <= 0)
$width = $width_orig;
if($height <= 0)
$height = $height_orig;
$height_new = $height_orig;
if($width_orig > $width)
$height_new = $width * $height_orig / $width_orig;
if($height_new > $height)
$width = $height * $width_orig / $height_orig;
else
$height = $height_new;
$image_type = $orig[2];
if($image_type == IMAGETYPE_JPEG)
{
$image = imagecreatefromjpeg($file);
if ($image === false)
{
ini_set('gd.jpeg_ignore_warning', 1);
$image = imagecreatefromjpeg($file);
}
if ($orientation > 1)
{
if ($orientation == 7 || $orientation == 8)
$image = imagerotate($image, 90, null);
elseif ($orientation == 3 || $orientation == 4)
$image = imagerotate($image, 180, null);
elseif ($orientation == 5 || $orientation == 6)
$image = imagerotate($image, 270, null);
if (
$orientation == 2 || $orientation == 7
|| $orientation == 4 || $orientation == 5
)
{
CFile::ImageFlipHorizontal($image);
}
}
}
elseif($image_type == IMAGETYPE_GIF)
$image = imagecreatefromgif($file);
elseif($image_type == IMAGETYPE_PNG)
$image = imagecreatefrompng($file);
else
return GetMessage("IBLOCK_BAD_FILE_UNSUPPORTED");
$image_p = imagecreatetruecolor($width, $height);
if($image_type == IMAGETYPE_JPEG)
{
if($arResize["METHOD"] === "resample")
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
else
imagecopyresized($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
if($arResize["COMPRESSION"] > 0)
imagejpeg($image_p, $file, $arResize["COMPRESSION"]);
else
imagejpeg($image_p, $file);
}
elseif($image_type == IMAGETYPE_GIF && function_exists("imagegif"))
{
imagetruecolortopalette($image_p, true, imagecolorstotal($image));
imagepalettecopy($image_p, $image);
//Save transparency for GIFs
$transparentColor = imagecolortransparent($image);
if($transparentColor >= 0 && $transparentColor < imagecolorstotal($image))
{
$transparentColor = imagecolortransparent($image_p, $transparentColor);
imagefilledrectangle($image_p, 0, 0, $width, $height, $transparentColor);
}
if($arResize["METHOD"] === "resample")
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
else
imagecopyresized($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
imagegif($image_p, $file);
}
else
{
//Save transparency for PNG
$transparentColor = imagecolorallocatealpha($image_p, 0, 0, 0, 127);
imagefilledrectangle($image_p, 0, 0, $width, $height, $transparentColor);
$transparentColor = imagecolortransparent($image_p, $transparentColor);
imagealphablending($image_p, false);
if($arResize["METHOD"] === "resample")
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
else
imagecopyresized($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
imagesavealpha($image_p, true);
imagepng($image_p, $file);
}
imagedestroy($image);
imagedestroy($image_p);
$arFile["size"] = filesize($file);
$arFile["tmp_name"] = $file;
return $arFile;
}
else
{
return $arFile;
}
}
public static function FilterPicture($filePath, $arFilter)
{
if (!file_exists($filePath))
return false;
$arFileSize = CFile::GetImageSize($filePath, true);
if(!is_array($arFileSize))
return false;
if ($arFilter["type"] === "text" && strlen($arFilter["text"]) > 1 && $arFilter["coefficient"] > 0)
{
$arFilter["text_width"] = ($arFileSize[0]-5) * $arFilter["coefficient"] / 100;
}
switch ($arFileSize[2])
{
case IMAGETYPE_GIF:
$picture = imagecreatefromgif($filePath);
$bHasAlpha = true;
break;
case IMAGETYPE_PNG:
$picture = imagecreatefrompng($filePath);
$bHasAlpha = true;
break;
case IMAGETYPE_JPEG:
$picture = imagecreatefromjpeg($filePath);
$orientation = 0;
$exifData = CFile::ExtractImageExif($filePath);
if ($exifData && isset($exifData['Orientation']))
{
$orientation = $exifData['Orientation'];
}
if ($orientation > 1)
{
if ($orientation == 7 || $orientation == 8)
$picture = imagerotate($picture, 90, null);
elseif ($orientation == 3 || $orientation == 4)
$picture = imagerotate($picture, 180, null);
elseif ($orientation == 5 || $orientation == 6)
$picture = imagerotate($picture, 270, null);
if (
$orientation == 2 || $orientation == 7
|| $orientation == 4 || $orientation == 5
)
{
CFile::ImageFlipHorizontal($picture);
}
}
$bHasAlpha = false;
break;
default:
$picture = false;
$bHasAlpha = false;
break;
}
if (!is_resource($picture))
return false;
$bNeedCreatePicture = CFile::ApplyImageFilter($picture, $arFilter, $bHasAlpha);
if ($bNeedCreatePicture)
{
switch ($arFileSize[2])
{
case IMAGETYPE_GIF:
imagegif($picture, $filePath);
break;
case IMAGETYPE_PNG:
imagealphablending($picture, false);
imagesavealpha($picture, true);
imagepng($picture, $filePath);
break;
case IMAGETYPE_JPEG:
$jpgQuality = self::getDefaultJpegQuality();
imagejpeg($picture, $filePath, $jpgQuality);
break;
}
}
imagedestroy($picture);
return true;
}
public static function NumberFormat($num)
{
if (strlen($num) > 0)
{
$res = preg_replace("#\\.([0-9]*?)(0+)\$#", ".\\1", $num);
return rtrim($res, ".");
}
else
{
return "";
}
}
public static function _Order($by, $order, $default_order, $nullable = true)
{
static $arOrder = array(
"nulls,asc" => array(true, "asc" ),
"asc,nulls" => array(false, "asc" ),
"nulls,desc" => array(true, "desc"),
"desc,nulls" => array(false, "desc"),
"asc" => array(true, "asc" ),
"desc" => array(false, "desc"),
);
$order = strtolower(trim($order));
if(array_key_exists($order, $arOrder))
$o = $arOrder[$order];
elseif(array_key_exists($default_order, $arOrder))
$o = $arOrder[$default_order];
else
$o = $arOrder["desc,nulls"];
//There is no need to "reverse" nulls order when
//column can not contain nulls
if(!$nullable)
{
if($o[1] == "asc")
$o[0] = true;
else
$o[0] = false;
}
return $o;
}
public static function GetAdminIBlockEditLink($IBLOCK_ID, $arParams = array(), $strAdd = "")
{
if (
(defined("CATALOG_PRODUCT") || $arParams["force_catalog"] || array_key_exists('catalog', $arParams))
&& !array_key_exists("menu", $arParams)
)
{
$url = "cat_catalog_edit.php";
$param = "IBLOCK_ID";
}
else
{
$url = "iblock_edit.php";
$param = "ID";
}
$url.= "?".$param."=".intval($IBLOCK_ID);
$url.= "&type=".urlencode(CIBlock::GetArrayByID($IBLOCK_ID, "IBLOCK_TYPE_ID"));
$url.= "&admin=Y";
$url.= "&lang=".urlencode(LANGUAGE_ID);
foreach ($arParams as $name => $value)
if (isset($value))
$url.= "&".urlencode($name)."=".urlencode($value);
if ($arParams["replace_script_name"])
{
$url = self::replaceScriptName($url);
}
$url = str_replace("&skip_public=1", "", $url);
return $url.$strAdd;
}
public static function GetAdminSectionEditLink($IBLOCK_ID, $SECTION_ID, $arParams = array(), $strAdd = "")
{
if (
(defined("CATALOG_PRODUCT") || $arParams["force_catalog"] || array_key_exists('catalog', $arParams))
&& !array_key_exists("menu", $arParams)
)
$url = "cat_section_edit.php";
else
$url = "iblock_section_edit.php";
$url.= "?IBLOCK_ID=".intval($IBLOCK_ID);
$url.= "&type=".urlencode(CIBlock::GetArrayByID($IBLOCK_ID, "IBLOCK_TYPE_ID"));
if($SECTION_ID !== null)
$url.= "&ID=".intval($SECTION_ID);
$url.= "&lang=".urlencode(LANGUAGE_ID);
foreach ($arParams as $name => $value)
if (isset($value))
$url.= "&".urlencode($name)."=".urlencode($value);
if ($arParams["replace_script_name"])
{
$url = self::replaceScriptName($url);
}
$url = str_replace("&skip_public=1", "", $url);
return $url.$strAdd;
}
public static function GetAdminElementEditLink($IBLOCK_ID, $ELEMENT_ID, $arParams = array(), $strAdd = "")
{
if (
(defined("CATALOG_PRODUCT") || $arParams["force_catalog"])
&& !array_key_exists("menu", $arParams)
)
$url = "cat_product_edit.php";
else
$url = "iblock_element_edit.php";
$url.= "?IBLOCK_ID=".intval($IBLOCK_ID);
$url.= "&type=".urlencode(CIBlock::GetArrayByID($IBLOCK_ID, "IBLOCK_TYPE_ID"));
if($ELEMENT_ID !== null)
$url.= "&ID=".intval($ELEMENT_ID);
$url.= "&lang=".urlencode(LANGUAGE_ID);
foreach ($arParams as $name => $value)
if (isset($value))
$url.= "&".urlencode($name)."=".urlencode($value);
if ($arParams["replace_script_name"])
{
$url = self::replaceScriptName($url);
}
$url = str_replace("&skip_public=1", "", $url);
return $url.$strAdd;
}
public static function GetAdminSubElementEditLink($IBLOCK_ID, $ELEMENT_ID, $SUBELEMENT_ID, $arParams = array(), $strAdd = '', $absoluteUrl = false)
{
$absoluteUrl = ($absoluteUrl === true);
$selfFolderUrl = (defined("SELF_FOLDER_URL") ? SELF_FOLDER_URL : "/bitrix/admin/");
$url = ($absoluteUrl ? $selfFolderUrl : '').'iblock_subelement_edit.php?IBLOCK_ID='.(int)$IBLOCK_ID.'&type='.urlencode(CIBlock::GetArrayByID($IBLOCK_ID, 'IBLOCK_TYPE_ID'));
$url .= '&PRODUCT_ID='.(int)$ELEMENT_ID.'&ID='.(int)$SUBELEMENT_ID.'&lang='.LANGUAGE_ID;
foreach ($arParams as $name => $value)
if (isset($value))
$url.= '&'.urlencode($name).'='.urlencode($value);
if ($arParams["replace_script_name"])
{
$url = self::replaceScriptName($url);
}
$url = str_replace("&skip_public=1", "", $url);
return $url.$strAdd;
}
public static function GetAdminElementListLink($IBLOCK_ID, $arParams = array(), $strAdd = "")
{
$url = self::GetAdminElementListScriptName($IBLOCK_ID, $arParams);
$url.= "?IBLOCK_ID=".intval($IBLOCK_ID);
$url.= "&type=".urlencode(CIBlock::GetArrayByID($IBLOCK_ID, "IBLOCK_TYPE_ID"));
$url.= "&lang=".urlencode(LANGUAGE_ID);
foreach ($arParams as $name => $value)
if (isset($value))
$url.= "&".urlencode($name)."=".urlencode($value);
if ($arParams["replace_script_name"])
{
$url = self::replaceScriptName($url);
}
$url = str_replace("&skip_public=1", "", $url);
return $url.$strAdd;
}
public static function GetAdminElementListScriptName($IBLOCK_ID, $arParams = array())
{
if (!isset($arParams["skip_public"]))
{
if (defined("PUBLIC_MODE") && PUBLIC_MODE == 1 || self::isPublicSidePanel())
{
return "menu_catalog_" . $IBLOCK_ID . "/";
}
}
if (defined("CATALOG_PRODUCT") && !array_key_exists("menu", $arParams))
{
if (CIBlock::GetAdminListMode($IBLOCK_ID) == 'C')
$url = "cat_product_list.php";
else
$url = "cat_product_admin.php";
}
else
{
if (CIBlock::GetAdminListMode($IBLOCK_ID) == 'C')
$url = "iblock_list_admin.php";
else
$url = "iblock_element_admin.php";
}
return $url;
}
public static function GetAdminSectionListLink($IBLOCK_ID, $arParams = array(), $strAdd = "")
{
$url = self::GetAdminSectionListScriptName($IBLOCK_ID, $arParams);
$url.= "?IBLOCK_ID=".intval($IBLOCK_ID);
$url.= "&type=".urlencode(CIBlock::GetArrayByID($IBLOCK_ID, "IBLOCK_TYPE_ID"));
$url.= "&lang=".urlencode(LANGUAGE_ID);
foreach ($arParams as $name => $value)
if (isset($value))
$url.= "&".urlencode($name)."=".urlencode($value);
if ($arParams["replace_script_name"])
{
$url = self::replaceScriptName($url);
}
$url = str_replace("&skip_public=1", "", $url);
return $url.$strAdd;
}
public static function GetAdminSectionListScriptName($IBLOCK_ID, $arParams = array())
{
if (!isset($arParams["skip_public"]))
{
if (defined("PUBLIC_MODE") && PUBLIC_MODE == 1 || self::isPublicSidePanel())
{
return "menu_catalog_category_".$IBLOCK_ID."/";
}
}
if ((defined("CATALOG_PRODUCT") || array_key_exists('catalog', $arParams)) && !array_key_exists("menu", $arParams))
{
if (CIBlock::GetAdminListMode($IBLOCK_ID) == 'C')
$url = "cat_product_list.php";
else
$url = "cat_section_admin.php";
}
else
{
if (CIBlock::GetAdminListMode($IBLOCK_ID) == 'C')
$url = "iblock_list_admin.php";
else
$url = "iblock_section_admin.php";
}
return $url;
}
private static function isPublicSidePanel()
{
return ((isset($_REQUEST["IFRAME"]) && $_REQUEST["IFRAME"] === "Y") && ($_REQUEST["publicSidePanel"] === "Y"
|| $_REQUEST["IFRAME_TYPE"] == "PUBLIC_FRAME"));
}
private static function replaceScriptName($url)
{
if (defined("PUBLIC_MODE") && PUBLIC_MODE == 1 || self::isPublicSidePanel())
{
$url = str_replace(".php", "/", $url);
}
$url = str_replace("&replace_script_name=1", "", $url);
return $url;
}
public static function GetAdminListMode($IBLOCK_ID)
{
$list_mode = CIBlock::GetArrayByID($IBLOCK_ID, "LIST_MODE");
if($list_mode == 'S' || $list_mode == 'C')
return $list_mode;
elseif(COption::GetOptionString("iblock","combined_list_mode")=="Y")
return 'C';
else
return 'S';
}
public static function CheckForIndexes($IBLOCK_ID)
{
global $DB;
$arIBlock = CIBlock::GetArrayByID($IBLOCK_ID);
$ar = $arIBlock["FIELDS"]["CODE"]["DEFAULT_VALUE"];
if (
is_array($ar)
&& $ar["UNIQUE"] == "Y"
&& !$DB->IndexExists("b_iblock_element", array("IBLOCK_ID", "CODE"))
)
$DB->DDL("create index ix_iblock_element_code on b_iblock_element (IBLOCK_ID, CODE)");
$ar = $arIBlock["FIELDS"]["SECTION_CODE"]["DEFAULT_VALUE"];
if (
is_array($ar)
&& $ar["UNIQUE"] == "Y"
&& !$DB->IndexExists("b_iblock_section", array("IBLOCK_ID", "CODE"))
)
$DB->DDL("create index ix_iblock_section_code on b_iblock_section (IBLOCK_ID, CODE)");
}
public static function GetAuditTypes()
{
return array(
"IBLOCK_SECTION_ADD" => "[IBLOCK_SECTION_ADD] ".GetMessage("IBLOCK_SECTION_ADD"),
"IBLOCK_SECTION_EDIT" => "[IBLOCK_SECTION_EDIT] ".GetMessage("IBLOCK_SECTION_EDIT"),
"IBLOCK_SECTION_DELETE" => "[IBLOCK_SECTION_DELETE] ".GetMessage("IBLOCK_SECTION_DELETE"),
"IBLOCK_ELEMENT_ADD" => "[IBLOCK_ELEMENT_ADD] ".GetMessage("IBLOCK_ELEMENT_ADD"),
"IBLOCK_ELEMENT_EDIT" => "[IBLOCK_ELEMENT_EDIT] ".GetMessage("IBLOCK_ELEMENT_EDIT"),
"IBLOCK_ELEMENT_DELETE" => "[IBLOCK_ELEMENT_DELETE] ".GetMessage("IBLOCK_ELEMENT_DELETE"),
"IBLOCK_ADD" => "[IBLOCK_ADD] ".GetMessage("IBLOCK_ADD"),
"IBLOCK_EDIT" => "[IBLOCK_EDIT] ".GetMessage("IBLOCK_EDIT"),
"IBLOCK_DELETE" => "[IBLOCK_DELETE] ".GetMessage("IBLOCK_DELETE"),
);
}
public static function roundDB($value)
{
$len = 18;
$dec = 4;
$eps = 1.00 / pow(10, $len + 4);
$rounded = round(doubleval($value) + $eps, $len);
if (is_nan($rounded) || is_infinite($rounded))
$rounded = 0;
$result = sprintf("%01.".$dec."f", $rounded);
if (strlen($result) > ($len - $dec))
$result = trim(substr($result, 0, $len - $dec), ".");
return $result;
}
public static function _transaction_lock($IBLOCK_ID)
{
/** @global CDatabase $DB */
global $DB;
$DB->Query("UPDATE b_iblock set TMP_ID = '".md5(mt_rand())."' WHERE ID = ".$IBLOCK_ID);
}
function isShortDate($strDate)
{
$arDate = ParseDateTime($strDate, FORMAT_DATETIME);
unset($arDate["DD"]);
unset($arDate["MMMM"]);
unset($arDate["MM"]);
unset($arDate["M"]);
unset($arDate["YYYY"]);
return array_sum($arDate) == 0;
}
public static function _Upper($str)
{
return $str;
}
function _Add($ID)
{
return false;
}
public static function _NotEmpty($column)
{
return "";
}
public static function makeFilePropArray($data, $del = false, $description = null, $options = array())
{
if (is_array($data) && array_key_exists("VALUE", $data))
{
$data["VALUE"] = self::makeFileArray($data["VALUE"], $del, $description, $options);
}
else
{
$data = array(
"VALUE" => self::makeFileArray($data, $del, $description, $options),
);
}
if (array_key_exists("description", $data["VALUE"]))
{
$data["DESCRIPTION"] = $data["VALUE"]["description"];
}
return $data;
}
public static function makeFileArray($data, $del = false, $description = null, $options = array())
{
$emptyFile = array(
"name" => null,
"type" => null,
"tmp_name" => null,
"error" => 4,
"size" => 0,
);
if ($del)
{
$result = $emptyFile;
$result["del"] = "Y";
}
elseif (is_null($data))
{
$result = $emptyFile;
}
elseif (is_numeric($data))
{
$result = self::makeFileArrayFromId($data, $description, $options);
if ($result === false)
$result = $emptyFile;
}
elseif (is_string($data))
{
$result = self::makeFileArrayFromPath($data, $description, $options);
if ($result === false)
$result = $emptyFile;
}
elseif (is_array($data))
{
$result = self::makeFileArrayFromArray($data, $description, $options);
if ($result === false)
$result = $emptyFile;
}
else
{
$result = $emptyFile;
}
return $result;
}
private static function makeFileArrayFromId($file_id, $description = null, $options = array())
{
$result = false;
if (is_set($options["allow_file_id"]) && $options["allow_file_id"] === true)
{
$result = CFile::MakeFileArray($file_id);
}
if (!is_null($description))
{
$result = ($result === false ? array(
"name" => null,
"type" => null,
"tmp_name" => null,
"error" => 4,
"size" => 0,
) : $result);
$result["description"] = $description;
}
return $result;
}
private static function makeFileArrayFromPath($file_path, $description = null, $options = array())
{
/** @global CMain $APPLICATION */
global $APPLICATION;
$result = false;
if (preg_match("/^https?:\\/\\//", $file_path))
{
$result = CFile::MakeFileArray($file_path);
}
else
{
$io = CBXVirtualIo::GetInstance();
$normPath = $io->CombinePath("/", $file_path);
$absPath = $io->CombinePath($_SERVER["DOCUMENT_ROOT"], $normPath);
if ($io->ValidatePathString($absPath) && $io->FileExists($absPath))
{
$physicalName = $io->GetPhysicalName($absPath);
$uploadDir = $io->GetPhysicalName(preg_replace("#[\\\\\\/]+#", "/", $_SERVER['DOCUMENT_ROOT'].'/'.(COption::GetOptionString('main', 'upload_dir', 'upload')).'/'));
if (strpos($physicalName, $uploadDir) === 0)
{
$result = CFile::MakeFileArray($physicalName);
}
else
{
$perm = $APPLICATION->GetFileAccessPermission($normPath);
if ($perm >= "W")
{
$result = CFile::MakeFileArray($physicalName);
}
}
}
}
if (is_array($result))
{
if (!is_null($description))
$result["description"] = $description;
}
return $result;
}
private static function makeFileArrayFromArray($file_array, $description = null, $options = array())
{
$result = false;
if (is_uploaded_file($file_array["tmp_name"]))
{
$result = $file_array;
if (!is_null($description))
$result["description"] = $description;
}
elseif (
strlen($file_array["tmp_name"]) > 0
&& strpos($file_array["tmp_name"], CTempFile::GetAbsoluteRoot()) === 0
)
{
$io = CBXVirtualIo::GetInstance();
$absPath = $io->CombinePath("/", $file_array["tmp_name"]);
$tmpPath = CTempFile::GetAbsoluteRoot()."/";
if (strpos($absPath, $tmpPath) === 0 || (($absPath = ltrim($absPath, "/")) && strpos($absPath, $tmpPath) === 0))
{
$result = $file_array;
$result["tmp_name"] = $absPath;
$result["error"] = intval($result["error"]);
if (!is_null($description))
$result["description"] = $description;
}
}
elseif (strlen($file_array["tmp_name"]) > 0)
{
$io = CBXVirtualIo::GetInstance();
$normPath = $io->CombinePath("/", $file_array["tmp_name"]);
$absPath = $io->CombinePath(CTempFile::GetAbsoluteRoot(), $normPath);
$tmpPath = CTempFile::GetAbsoluteRoot()."/";
if (strpos($absPath, $tmpPath) === 0 && $io->FileExists($absPath) ||
($absPath = $io->CombinePath($_SERVER["DOCUMENT_ROOT"], $normPath)) && strpos($absPath, $tmpPath) === 0)
{
$result = $file_array;
$result["tmp_name"] = $absPath;
$result["error"] = intval($result["error"]);
if (!is_null($description))
$result["description"] = $description;
}
}
else
{
$emptyFile = array(
"name" => null,
"type" => null,
"tmp_name" => null,
"error" => 4,
"size" => 0,
);
if ($file_array == $emptyFile)
{
$result = $emptyFile;
if (!is_null($description))
$result["description"] = $description;
}
}
return $result;
}
public static function disableTagCache($iblock_id)
{
$iblock_id = (int)$iblock_id;
if ($iblock_id > 0)
self::$disabledCacheTag[$iblock_id] = $iblock_id;
}
public static function enableTagCache($iblock_id)
{
$iblock_id = (int)$iblock_id;
if (isset(self::$disabledCacheTag[$iblock_id]))
unset(self::$disabledCacheTag[$iblock_id]);
}
public static function clearIblockTagCache($iblock_id)
{
global $CACHE_MANAGER;
$iblock_id = (int)$iblock_id;
if (defined("BX_COMP_MANAGED_CACHE") && $iblock_id > 0 && self::isEnabledClearTagCache())
$CACHE_MANAGER->ClearByTag('iblock_id_'.$iblock_id);
}
public static function registerWithTagCache($iblock_id)
{
global $CACHE_MANAGER;
$iblock_id = (int)$iblock_id;
if ($iblock_id > 0 && !isset(self::$disabledCacheTag[$iblock_id]))
$CACHE_MANAGER->RegisterTag("iblock_id_".$iblock_id);
}
public static function enableClearTagCache()
{
self::$enableClearTagCache++;
}
public static function disableClearTagCache()
{
self::$enableClearTagCache--;
}
public static function isEnabledClearTagCache()
{
return (self::$enableClearTagCache >= 0);
}
public static function getDefaultJpegQuality()
{
$jpgQuality = (int)Main\Config\Option::get('main', 'image_resize_quality', '95');
if ($jpgQuality <= 0 || $jpgQuality > 100)
$jpgQuality = 95;
return $jpgQuality;
}
}