use Bitrix\Main\Localization\Loc,
Bitrix\Iblock;
Loc::loadMessages(__FILE__);
class CIBlockPropertyElementList
{
const USER_TYPE = 'EList';
public static function GetUserTypeDescription()
{
return array(
"PROPERTY_TYPE" => Iblock\PropertyTable::TYPE_ELEMENT,
"USER_TYPE" => self::USER_TYPE,
"DESCRIPTION" => Loc::getMessage("IBLOCK_PROP_ELIST_DESC"),
"GetPropertyFieldHtml" => array(__CLASS__, "GetPropertyFieldHtml"),
"GetPropertyFieldHtmlMulty" => array(__CLASS__, "GetPropertyFieldHtmlMulty"),
"GetPublicEditHTML" => array(__CLASS__, "GetPropertyFieldHtml"),
"GetPublicEditHTMLMulty" => array(__CLASS__, "GetPropertyFieldHtmlMulty"),
"GetPublicViewHTML" => array(__CLASS__, "GetPublicViewHTML"),
"GetUIFilterProperty" => array(__CLASS__, "GetUIFilterProperty"),
"GetAdminFilterHTML" => array(__CLASS__, "GetAdminFilterHTML"),
"PrepareSettings" =>array(__CLASS__, "PrepareSettings"),
"GetSettingsHTML" =>array(__CLASS__, "GetSettingsHTML"),
"GetExtendedValue" => array(__CLASS__, "GetExtendedValue"),
'GetUIEntityEditorProperty' => array(__CLASS__, 'GetUIEntityEditorProperty'),
);
}
public static function PrepareSettings($arProperty)
{
$size = 0;
if(is_array($arProperty["USER_TYPE_SETTINGS"]))
$size = intval($arProperty["USER_TYPE_SETTINGS"]["size"]);
if($size <= 0)
$size = 1;
$width = 0;
if(is_array($arProperty["USER_TYPE_SETTINGS"]))
$width = intval($arProperty["USER_TYPE_SETTINGS"]["width"]);
if($width <= 0)
$width = 0;
if(is_array($arProperty["USER_TYPE_SETTINGS"]) && $arProperty["USER_TYPE_SETTINGS"]["group"] === "Y")
$group = "Y";
else
$group = "N";
if(is_array($arProperty["USER_TYPE_SETTINGS"]) && $arProperty["USER_TYPE_SETTINGS"]["multiple"] === "Y")
$multiple = "Y";
else
$multiple = "N";
return array(
"size" => $size,
"width" => $width,
"group" => $group,
"multiple" => $multiple,
);
}
public static function GetSettingsHTML($arProperty, $strHTMLControlName, &$arPropertyFields)
{
$settings = CIBlockPropertyElementList::PrepareSettings($arProperty);
$arPropertyFields = array(
"HIDE" => array("ROW_COUNT", "COL_COUNT", "MULTIPLE_CNT"),
);
return '
'.Loc::getMessage("IBLOCK_PROP_ELEMENT_LIST_SETTING_SIZE").': |
|
'.Loc::getMessage("IBLOCK_PROP_ELEMENT_LIST_SETTING_WIDTH").': |
px |
'.Loc::getMessage("IBLOCK_PROP_ELEMENT_LIST_SETTING_SECTION_GROUP").': |
|
'.Loc::getMessage("IBLOCK_PROP_ELEMENT_LIST_SETTING_MULTIPLE").': |
|
';
}
//PARAMETERS:
//$arProperty - b_iblock_property.*
//$value - array("VALUE","DESCRIPTION") -- here comes HTML form value
//strHTMLControlName - array("VALUE","DESCRIPTION")
//return:
//safe html
public static function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName)
{
$settings = CIBlockPropertyElementList::PrepareSettings($arProperty);
if($settings["size"] > 1)
$size = ' size="'.$settings["size"].'"';
else
$size = '';
if($settings["width"] > 0)
$width = ' style="width:'.$settings["width"].'px"';
else
$width = '';
$bWasSelect = false;
$options = CIBlockPropertyElementList::GetOptionsHtml($arProperty, array($value["VALUE"]), $bWasSelect);
$html = '';
return $html;
}
public static function GetPropertyFieldHtmlMulty($arProperty, $value, $strHTMLControlName)
{
$max_n = 0;
$values = array();
if(is_array($value))
{
foreach($value as $property_value_id => $arValue)
{
if (is_array($arValue))
$values[$property_value_id] = $arValue["VALUE"];
else
$values[$property_value_id] = $arValue;
if(preg_match("/^n(\\d+)$/", $property_value_id, $match))
{
if($match[1] > $max_n)
$max_n = intval($match[1]);
}
}
}
$settings = CIBlockPropertyElementList::PrepareSettings($arProperty);
if($settings["size"] > 1)
$size = ' size="'.$settings["size"].'"';
else
$size = '';
if($settings["width"] > 0)
$width = ' style="width:'.$settings["width"].'px"';
else
$width = '';
if($settings["multiple"]=="Y")
{
$bWasSelect = false;
$options = CIBlockPropertyElementList::GetOptionsHtml($arProperty, $values, $bWasSelect);
$html = '';
$html .= '';
}
else
{
if(end($values) != "" || mb_substr(key($values), 0, 1) != "n")
$values["n".($max_n+1)] = "";
$name = $strHTMLControlName["VALUE"]."VALUE";
$html = '';
foreach($values as $property_value_id=>$value)
{
$html .= '';
$bWasSelect = false;
$options = CIBlockPropertyElementList::GetOptionsHtml($arProperty, array($value), $bWasSelect);
$html .= '';
$html .= ' |
';
}
$html .= '
';
$html .= '';
}
return $html;
}
public static function GetAdminFilterHTML($arProperty, $strHTMLControlName)
{
$lAdmin = new CAdminList($strHTMLControlName["TABLE_ID"]);
$lAdmin->InitFilter(array($strHTMLControlName["VALUE"]));
$filterValue = $GLOBALS[$strHTMLControlName["VALUE"]];
if(isset($filterValue) && is_array($filterValue))
$values = $filterValue;
else
$values = array();
$settings = CIBlockPropertyElementList::PrepareSettings($arProperty);
if($settings["size"] > 1)
$size = ' size="'.$settings["size"].'"';
else
$size = '';
if($settings["width"] > 0)
$width = ' style="width:'.$settings["width"].'px"';
else
$width = '';
$bWasSelect = false;
$options = CIBlockPropertyElementList::GetOptionsHtml($arProperty, $values, $bWasSelect);
$html = '';
return $html;
}
public static function GetUIFilterProperty($arProperty, $strHTMLControlName, &$fields)
{
$fields["type"] = "list";
$fields["items"] = self::getItemsForUiFilter($arProperty);
$fields["operators"] = array(
"default" => "=",
"enum" => "@"
);
}
private static function getItemsForUiFilter($arProperty)
{
$items = array();
$settings = CIBlockPropertyElementList::PrepareSettings($arProperty);
if ($settings["group"] === "Y")
{
$arElements = CIBlockPropertyElementList::GetElements($arProperty["LINK_IBLOCK_ID"]);
$arTree = CIBlockPropertyElementList::GetSections($arProperty["LINK_IBLOCK_ID"]);
foreach ($arElements as $i => $arElement)
{
if(
$arElement["IN_SECTIONS"] == "Y"
&& array_key_exists($arElement["IBLOCK_SECTION_ID"], $arTree)
)
{
$arTree[$arElement["IBLOCK_SECTION_ID"]]["E"][] = $arElement;
unset($arElements[$i]);
}
}
// todo add