%PDF- %PDF-
| Direktori : /proc/self/root/home/bitrix/www/bitrix/modules/iblock/classes/general/ |
| Current File : //proc/self/root/home/bitrix/www/bitrix/modules/iblock/classes/general/section_property.php |
<?
IncludeModuleLangFile(__FILE__);
class CIBlockSectionPropertyLink
{
public static function Set($SECTION_ID, $PROPERTY_ID, $arLink = array())
{
global $DB;
$SECTION_ID = intval($SECTION_ID);
$PROPERTY_ID = intval($PROPERTY_ID);
$rs = $DB->Query("
SELECT *
FROM b_iblock_section_property
WHERE SECTION_ID = ".$SECTION_ID." AND PROPERTY_ID = ".$PROPERTY_ID."
");
$sectionProperty = $rs->Fetch();
if ($sectionProperty)
{
$ar = self::CheckProperty($SECTION_ID, $PROPERTY_ID);
if (is_array($ar))
{
$arUpdate = array();
if (
array_key_exists("SMART_FILTER", $arLink)
&& $arLink["SMART_FILTER"] !== $sectionProperty["SMART_FILTER"]
)
{
$arUpdate["SMART_FILTER"] = $arLink["SMART_FILTER"] === "Y"? "Y": false;
}
if (
array_key_exists("DISPLAY_TYPE", $arLink)
&& $arLink["DISPLAY_TYPE"] !== $sectionProperty["DISPLAY_TYPE"]
)
{
$arUpdate["DISPLAY_TYPE"] = $arLink["DISPLAY_TYPE"];
}
if (
array_key_exists("DISPLAY_EXPANDED", $arLink)
&& $arLink["DISPLAY_EXPANDED"] !== $sectionProperty["DISPLAY_EXPANDED"]
)
{
$arUpdate["DISPLAY_EXPANDED"] = $arLink["DISPLAY_EXPANDED"] === "Y"? "Y": false;
}
if (array_key_exists("FILTER_HINT", $arLink))
{
$filterHint = self::cleanFilterHint($arLink["FILTER_HINT"]);
if ($filterHint !== $sectionProperty["FILTER_HINT"])
{
$arUpdate["FILTER_HINT"] = $filterHint;
}
}
if (
array_key_exists("IBLOCK_ID", $arLink)
&& $arLink["IBLOCK_ID"] !== $sectionProperty["IBLOCK_ID"]
)
{
$arUpdate["IBLOCK_ID"] = $arLink["IBLOCK_ID"];
}
if (!empty($arUpdate))
$strUpdate = $DB->PrepareUpdate("b_iblock_section_property", $arUpdate);
else
$strUpdate = "";
if (strlen($strUpdate) > 0)
{
$DB->Query("
UPDATE b_iblock_section_property
SET ".$strUpdate."
WHERE SECTION_ID = ".$ar["SECTION_ID"]."
AND PROPERTY_ID = ".$ar["PROPERTY_ID"]."
");
if (
array_key_exists("SMART_FILTER", $arUpdate)
&& $arUpdate["SMART_FILTER"] === "Y"
)
{
\Bitrix\Iblock\PropertyIndex\Manager::markAsInvalid($arUpdate["IBLOCK_ID"]? $arUpdate["IBLOCK_ID"]: $ar["IBLOCK_ID"]);
}
}
}
}
else
{
self::Add($SECTION_ID, $PROPERTY_ID, $arLink);
}
}
public static function Add($SECTION_ID, $PROPERTY_ID, $arLink = array())
{
global $DB;
$SECTION_ID = intval($SECTION_ID);
$PROPERTY_ID = intval($PROPERTY_ID);
$rs = $DB->Query("
SELECT *
FROM b_iblock_section_property
WHERE SECTION_ID = ".$SECTION_ID." AND PROPERTY_ID = ".$PROPERTY_ID."
");
if (!$rs->Fetch())
{
$ar = self::CheckProperty($SECTION_ID, $PROPERTY_ID);
if (is_array($ar))
{
$ar["ID"] = 1;
$DB->Add("b_iblock_section_property", $ar);
$arUpdate = array();
if (array_key_exists("SMART_FILTER", $arLink))
$arUpdate["SMART_FILTER"] = $arLink["SMART_FILTER"];
if (array_key_exists("DISPLAY_TYPE", $arLink))
$arUpdate["DISPLAY_TYPE"] = $arLink["DISPLAY_TYPE"];
if (array_key_exists("DISPLAY_EXPANDED", $arLink))
$arUpdate["DISPLAY_EXPANDED"] = $arLink["DISPLAY_EXPANDED"];
if (array_key_exists("FILTER_HINT", $arLink))
$arUpdate["FILTER_HINT"] = self::cleanFilterHint($arLink["FILTER_HINT"]);
if (array_key_exists("IBLOCK_ID", $arLink))
$arUpdate["IBLOCK_ID"] = $arLink["IBLOCK_ID"];
if (!empty($arUpdate))
$strUpdate = $DB->PrepareUpdate("b_iblock_section_property", $arUpdate);
else
$strUpdate = "";
if (strlen($strUpdate) > 0)
{
$DB->Query("
UPDATE b_iblock_section_property
SET ".$strUpdate."
WHERE IBLOCK_ID = ".$ar["IBLOCK_ID"]."
AND SECTION_ID = ".$ar["SECTION_ID"]."
AND PROPERTY_ID = ".$ar["PROPERTY_ID"]."
");
if (
array_key_exists("SMART_FILTER", $arUpdate)
&& $arUpdate["SMART_FILTER"] === "Y"
&& $arLink["INVALIDATE"] !== "N"
)
{
\Bitrix\Iblock\PropertyIndex\Manager::markAsInvalid($arUpdate["IBLOCK_ID"]? $arUpdate["IBLOCK_ID"]: $ar["IBLOCK_ID"]);
}
}
}
}
}
public static function CheckProperty($SECTION_ID, $PROPERTY_ID)
{
global $DB;
$SECTION_ID = intval($SECTION_ID);
$PROPERTY_ID = intval($PROPERTY_ID);
if ($SECTION_ID == 0)
{
$rs = $DB->Query("
SELECT bp.IBLOCK_ID, 0 SECTION_ID, bp.ID PROPERTY_ID
FROM b_iblock_property bp
WHERE bp.ID = ".$PROPERTY_ID."
");
return $rs->Fetch();
}
elseif ($SECTION_ID > 0)
{
$rs = $DB->Query("
SELECT bs.IBLOCK_ID, bs.ID SECTION_ID, bp.ID PROPERTY_ID
FROM b_iblock_property bp
,b_iblock_section bs
WHERE bp.ID = ".$PROPERTY_ID."
AND bs.ID = ".$SECTION_ID."
");
return $rs->Fetch();
}
else
{
return false;
}
}
public static function Delete($SECTION_ID, $PROPERTY_ID)
{
global $DB;
$SECTION_ID = intval($SECTION_ID);
$PROPERTY_ID = intval($PROPERTY_ID);
$DB->Query("DELETE FROM b_iblock_section_property WHERE SECTION_ID = ".$SECTION_ID." AND PROPERTY_ID = ".$PROPERTY_ID);
}
public static function DeleteByIBlock($IBLOCK_ID)
{
global $DB;
$IBLOCK_ID = intval($IBLOCK_ID);
$DB->Query("DELETE FROM b_iblock_section_property WHERE IBLOCK_ID = ".$IBLOCK_ID);
$DB->Query("UPDATE b_iblock SET SECTION_PROPERTY = 'N' WHERE ID = ".$IBLOCK_ID);
\Bitrix\Iblock\PropertyIndex\Manager::deleteIndex($IBLOCK_ID);
CIBlock::CleanCache($IBLOCK_ID);
}
public static function DeleteBySection($SECTION_ID, $PROPERTY_ID = null)
{
global $DB;
$SECTION_ID = intval($SECTION_ID);
if (is_array($PROPERTY_ID))
$PROPERTY_ID = array_map("intval", $PROPERTY_ID);
elseif ($PROPERTY_ID !== null)
$PROPERTY_ID = array(intval($PROPERTY_ID));
$DB->Query("
DELETE FROM b_iblock_section_property
WHERE SECTION_ID = ".$SECTION_ID."
".($PROPERTY_ID? "AND PROPERTY_ID NOT IN (".implode(", ", $PROPERTY_ID).")": "")."
");
}
public static function DeleteByProperty($PROPERTY_ID)
{
global $DB;
$PROPERTY_ID = intval($PROPERTY_ID);
$DB->Query("DELETE FROM b_iblock_section_property WHERE PROPERTY_ID = ".$PROPERTY_ID);
}
public static function HasIBlockLinks($IBLOCK_ID)
{
global $DB;
$IBLOCK_ID = intval($IBLOCK_ID);
$rs = $DB->Query($DB->TopSQL("
SELECT
1
FROM
b_iblock B
INNER JOIN b_iblock_property BP ON BP.IBLOCK_ID = B.ID
LEFT JOIN b_iblock_section_property BSP ON BSP.IBLOCK_ID = B.ID AND BSP.PROPERTY_ID = BP.ID
WHERE
B.ID = ".$IBLOCK_ID."
AND (
BSP.SECTION_ID IS NULL
OR BSP.SECTION_ID > 0
OR BSP.SMART_FILTER = 'Y'
)
", 1));
return is_array($rs->Fetch());
}
public static function GetArray($IBLOCK_ID, $SECTION_ID = 0, $bNewSection = false)
{
global $DB;
$IBLOCK_ID = intval($IBLOCK_ID);
$SECTION_ID = intval($SECTION_ID);
$result = array();
$rs = $DB->Query("
SELECT
B.SECTION_PROPERTY,
BP.ID PROPERTY_ID,
BSP.SECTION_ID LINK_ID,
BSP.SMART_FILTER,
BSP.DISPLAY_TYPE,
BSP.DISPLAY_EXPANDED,
BSP.FILTER_HINT,
BP.SORT,
0 LEFT_MARGIN,
B.NAME LINK_TITLE,
BP.PROPERTY_TYPE,
BP.USER_TYPE,
BP.ACTIVE
FROM
b_iblock B
INNER JOIN b_iblock_property BP ON BP.IBLOCK_ID = B.ID
LEFT JOIN b_iblock_section_property BSP ON BSP.SECTION_ID = 0 AND BSP.PROPERTY_ID = BP.ID
WHERE
B.ID = ".$IBLOCK_ID."
ORDER BY
BP.SORT ASC, BP.ID ASC
");
while ($ar = $rs->Fetch())
{
$displayTypesAvailable = self::getDisplayTypes($ar["PROPERTY_TYPE"], $ar["USER_TYPE"]);
if (isset($displayTypesAvailable[$ar["DISPLAY_TYPE"]]))
$DISPLAY_TYPE = $ar["DISPLAY_TYPE"];
else
$DISPLAY_TYPE = key($displayTypesAvailable);
if ($ar["SECTION_PROPERTY"] === "Y")
{
if (strlen($ar["LINK_ID"]))
{
$result[$ar["PROPERTY_ID"]] = array(
"PROPERTY_ID" => $ar["PROPERTY_ID"],
"SMART_FILTER" => $ar["SMART_FILTER"],
"DISPLAY_TYPE" => $DISPLAY_TYPE,
"DISPLAY_EXPANDED" => $ar["DISPLAY_EXPANDED"],
"FILTER_HINT" => $ar["FILTER_HINT"],
"INHERITED" => $SECTION_ID == 0 && !$bNewSection? "N" : "Y",
"INHERITED_FROM" => 0,
"SORT" => $ar["SORT"],
"LEFT_MARGIN" => $ar["LEFT_MARGIN"],
"LINK_TITLE" => $ar["LINK_TITLE"],
"PROPERTY_TYPE" => $ar["PROPERTY_TYPE"],
"USER_TYPE" => $ar["USER_TYPE"],
"ACTIVE" => $ar["ACTIVE"],
);
}
}
else
{
$result[$ar["PROPERTY_ID"]] = array(
"PROPERTY_ID" => $ar["PROPERTY_ID"],
"SMART_FILTER" => "N",
"DISPLAY_TYPE" => $DISPLAY_TYPE,
"DISPLAY_EXPANDED" => $ar["DISPLAY_EXPANDED"],
"INHERITED" => $SECTION_ID == 0 && !$bNewSection? "N" : "Y",
"INHERITED_FROM" => 0,
"SORT" => $ar["SORT"],
"LEFT_MARGIN" => $ar["LEFT_MARGIN"],
"LINK_TITLE" => $ar["LINK_TITLE"],
"PROPERTY_TYPE" => $ar["PROPERTY_TYPE"],
"USER_TYPE" => $ar["USER_TYPE"],
"ACTIVE" => $ar["ACTIVE"],
);
}
}
if ($SECTION_ID > 0)
{
$rs = $DB->Query($s = "
SELECT
B.SECTION_PROPERTY,
BP.ID PROPERTY_ID,
BSP.SECTION_ID LINK_ID,
BSP.SMART_FILTER,
BSP.DISPLAY_TYPE,
BSP.DISPLAY_EXPANDED,
BSP.FILTER_HINT,
BP.SORT,
BS.LEFT_MARGIN,
BS.NAME LINK_TITLE,
BP.PROPERTY_TYPE,
BP.USER_TYPE,
BP.ACTIVE
FROM
b_iblock B
INNER JOIN b_iblock_property BP ON BP.IBLOCK_ID = B.ID
INNER JOIN b_iblock_section M ON M.ID = ".$SECTION_ID."
INNER JOIN b_iblock_section BS ON BS.IBLOCK_ID = M.IBLOCK_ID
AND M.LEFT_MARGIN >= BS.LEFT_MARGIN
AND M.RIGHT_MARGIN <= BS.RIGHT_MARGIN
INNER JOIN b_iblock_section_property BSP ON BSP.IBLOCK_ID = BS.IBLOCK_ID AND BSP.SECTION_ID = BS.ID AND BSP.PROPERTY_ID = BP.ID
WHERE
B.ID = ".$IBLOCK_ID."
ORDER BY
BP.SORT ASC, BP.ID ASC, BS.LEFT_MARGIN ASC
");
while ($ar = $rs->Fetch())
{
$displayTypesAvailable = self::getDisplayTypes($ar["PROPERTY_TYPE"], $ar["USER_TYPE"]);
if (isset($displayTypesAvailable[$ar["DISPLAY_TYPE"]]))
$DISPLAY_TYPE = $ar["DISPLAY_TYPE"];
else
$DISPLAY_TYPE = key($displayTypesAvailable);
$result[$ar["PROPERTY_ID"]] = array(
"PROPERTY_ID" => $ar["PROPERTY_ID"],
"SMART_FILTER" => $ar["SMART_FILTER"],
"DISPLAY_TYPE" => $DISPLAY_TYPE,
"DISPLAY_EXPANDED" => $ar["DISPLAY_EXPANDED"],
"FILTER_HINT" => $ar["FILTER_HINT"],
"INHERITED" => $SECTION_ID == $ar["LINK_ID"] ? "N" : "Y",
"INHERITED_FROM" => $ar["LINK_ID"],
"SORT" => $ar["SORT"],
"LEFT_MARGIN" => $ar["LEFT_MARGIN"],
"LINK_TITLE" => $ar["LINK_TITLE"],
"PROPERTY_TYPE" => $ar["PROPERTY_TYPE"],
"USER_TYPE" => $ar["USER_TYPE"],
"ACTIVE" => $ar["ACTIVE"],
);
}
}
if ($result)
{
\Bitrix\Main\Type\Collection::sortByColumn(
$result,
array(
"SORT" => SORT_ASC,
"PROPERTY_ID" => SORT_ASC,
),
'',
null,
true
);
}
return $result;
}
public static function getDisplayTypes($property_type, $user_type)
{
//ABCDE - for numbers
//FGHIJ - for checkboxes
//KLMNO - for radio buttons
//PQRST - for drop down
//UWXYZ - reserved
if (
$property_type == "S"
&& $user_type == "directory"
)
{
$result = array(
"F" => GetMessage("SP_DISPLAY_TYPE_F"),
"G" => GetMessage("SP_DISPLAY_TYPE_G"),
"H" => GetMessage("SP_DISPLAY_TYPE_H"),
"K" => GetMessage("SP_DISPLAY_TYPE_K"),
"P" => GetMessage("SP_DISPLAY_TYPE_P"),
"R" => GetMessage("SP_DISPLAY_TYPE_R"),
);
}
elseif (
$property_type == "S"
&& $user_type == "DateTime"
)
{
$result = array(
"U" => GetMessage("SP_DISPLAY_TYPE_U"),
"F" => GetMessage("SP_DISPLAY_TYPE_F"),
"K" => GetMessage("SP_DISPLAY_TYPE_K"),
"P" => GetMessage("SP_DISPLAY_TYPE_P"),
);
}
elseif (
$property_type == "S"
|| $property_type == "L"
|| $property_type == "E"
|| $property_type == "G"
)
{
$result = array(
"F" => GetMessage("SP_DISPLAY_TYPE_F"),
"K" => GetMessage("SP_DISPLAY_TYPE_K"),
"P" => GetMessage("SP_DISPLAY_TYPE_P"),
);
}
elseif (
$property_type == "N"
)
{
$result = array(
"A" => GetMessage("SP_DISPLAY_TYPE_A"),
"B" => GetMessage("SP_DISPLAY_TYPE_B"),
);
}
else
{
$result = array();
}
return $result;
}
public static function getDisplayTypesJsFunction()
{
//ABCDE - for numbers
//FGHIJ - for checkboxes
//KLMNO - for radio buttons
//PQRST - for drop down
//UWXYZ - reserved
$js = '
function getDisplayTypes(property_type, user_type)
{
if (
property_type == "S"
&& user_type == "directory"
)
{
result = {
"F": "'.GetMessageJS("SP_DISPLAY_TYPE_F").'",
"G": "'.GetMessageJS("SP_DISPLAY_TYPE_G").'",
"H": "'.GetMessageJS("SP_DISPLAY_TYPE_H").'",
"K": "'.GetMessageJS("SP_DISPLAY_TYPE_K").'",
"P": "'.GetMessageJS("SP_DISPLAY_TYPE_P").'",
"R": "'.GetMessageJS("SP_DISPLAY_TYPE_R").'"
};
}
else if (
property_type == "S"
|| property_type == "L"
|| property_type == "E"
|| property_type == "G"
)
{
result = {
"F": "'.GetMessageJS("SP_DISPLAY_TYPE_F").'",
"K": "'.GetMessageJS("SP_DISPLAY_TYPE_K").'",
"P": "'.GetMessageJS("SP_DISPLAY_TYPE_P").'"
};
}
else if (
property_type == "N"
)
{
result = {
"A": "'.GetMessageJS("SP_DISPLAY_TYPE_A").'",
"B": "'.GetMessageJS("SP_DISPLAY_TYPE_B").'"
};
}
else
{
result = false;
}
return result;
}
';
return $js;
}
public static function _sort($a, $b)
{
if($a["SORT"] > $b["SORT"])
return 1;
elseif($a["SORT"] < $b["SORT"])
return -1;
else
return 0;
}
public static function cleanFilterHint($filterHint)
{
$TextParser = null;
if (!$TextParser)
{
$TextParser = new CBXSanitizer();
$TextParser->SetLevel(CBXSanitizer::SECURE_LEVEL_LOW);
$TextParser->ApplyHtmlSpecChars(false);
}
$cleanHint = trim($filterHint);
if ($cleanHint)
{
$cleanHint = $TextParser->SanitizeHtml($cleanHint);
if (preg_match('/^(<br>)+$/', $cleanHint))
$cleanHint = "";
}
return $cleanHint;
}
}
?>