%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/iblock/classes/general/ |
| Current File : //home/bitrix/www/bitrix/modules/iblock/classes/general/prop_element_list.php |
<?
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"),
"GetAdminFilterHTML" => array(__CLASS__, "GetAdminFilterHTML"),
"PrepareSettings" =>array(__CLASS__, "PrepareSettings"),
"GetSettingsHTML" =>array(__CLASS__, "GetSettingsHTML"),
"GetExtendedValue" => array(__CLASS__, "GetExtendedValue"),
);
}
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 '
<tr valign="top">
<td>'.Loc::getMessage("IBLOCK_PROP_ELEMENT_LIST_SETTING_SIZE").':</td>
<td><input type="text" size="5" name="'.$strHTMLControlName["NAME"].'[size]" value="'.$settings["size"].'"></td>
</tr>
<tr valign="top">
<td>'.Loc::getMessage("IBLOCK_PROP_ELEMENT_LIST_SETTING_WIDTH").':</td>
<td><input type="text" size="5" name="'.$strHTMLControlName["NAME"].'[width]" value="'.$settings["width"].'">px</td>
</tr>
<tr valign="top">
<td>'.Loc::getMessage("IBLOCK_PROP_ELEMENT_LIST_SETTING_SECTION_GROUP").':</td>
<td><input type="checkbox" name="'.$strHTMLControlName["NAME"].'[group]" value="Y" '.($settings["group"]=="Y"? 'checked': '').'></td>
</tr>
<tr valign="top">
<td>'.Loc::getMessage("IBLOCK_PROP_ELEMENT_LIST_SETTING_MULTIPLE").':</td>
<td><input type="checkbox" name="'.$strHTMLControlName["NAME"].'[multiple]" value="Y" '.($settings["multiple"]=="Y"? 'checked': '').'></td>
</tr>
';
}
//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 = '<select name="'.$strHTMLControlName["VALUE"].'"'.$size.$width.'>';
if($arProperty["IS_REQUIRED"] != "Y")
$html .= '<option value=""'.(!$bWasSelect? ' selected': '').'>'.Loc::getMessage("IBLOCK_PROP_ELEMENT_LIST_NO_VALUE").'</option>';
$html .= $options;
$html .= '</select>';
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 = '<input type="hidden" name="'.$strHTMLControlName["VALUE"].'[]" value="">';
$html .= '<select multiple name="'.$strHTMLControlName["VALUE"].'[]"'.$size.$width.'>';
if($arProperty["IS_REQUIRED"] != "Y")
$html .= '<option value=""'.(!$bWasSelect? ' selected': '').'>'.Loc::getMessage("IBLOCK_PROP_ELEMENT_LIST_NO_VALUE").'</option>';
$html .= $options;
$html .= '</select>';
}
else
{
if(end($values) != "" || substr(key($values), 0, 1) != "n")
$values["n".($max_n+1)] = "";
$name = $strHTMLControlName["VALUE"]."VALUE";
$html = '<table cellpadding="0" cellspacing="0" border="0" class="nopadding" width="100%" id="tb'.md5($name).'">';
foreach($values as $property_value_id=>$value)
{
$html .= '<tr><td>';
$bWasSelect = false;
$options = CIBlockPropertyElementList::GetOptionsHtml($arProperty, array($value), $bWasSelect);
$html .= '<select name="'.$strHTMLControlName["VALUE"].'['.$property_value_id.'][VALUE]"'.$size.$width.'>';
$html .= '<option value=""'.(!$bWasSelect? ' selected': '').'>'.Loc::getMessage("IBLOCK_PROP_ELEMENT_LIST_NO_VALUE").'</option>';
$html .= $options;
$html .= '</select>';
$html .= '</td></tr>';
}
$html .= '</table>';
$html .= '<input type="button" value="'.Loc::getMessage("IBLOCK_PROP_ELEMENT_LIST_ADD").'" onClick="if(window.addNewRow){addNewRow(\'tb'.md5($name).'\', -1)}else{addNewTableRow(\'tb'.md5($name).'\', 1, /\[(n)([0-9]*)\]/g, 2)}">';
}
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 = '<select multiple name="'.$strHTMLControlName["VALUE"].'[]"'.$size.$width.'>';
$html .= '<option value=""'.(!$bWasSelect? ' selected': '').'>'.Loc::getMessage("IBLOCK_PROP_ELEMENT_LIST_ANY_VALUE").'</option>';
$html .= $options;
$html .= '</select>';
return $html;
}
public static function GetPublicViewHTML($arProperty, $arValue, $strHTMLControlName)
{
static $cache = array();
$strResult = '';
$arValue['VALUE'] = intval($arValue['VALUE']);
if (0 < $arValue['VALUE'])
{
$viewMode = '';
$resultKey = '';
if (!empty($strHTMLControlName['MODE']))
{
switch ($strHTMLControlName['MODE'])
{
case 'CSV_EXPORT':
$viewMode = 'CSV_EXPORT';
$resultKey = 'ID';
break;
case 'EXTERNAL_ID':
$viewMode = 'EXTERNAL_ID';
$resultKey = '~XML_ID';
break;
case 'SIMPLE_TEXT':
$viewMode = 'SIMPLE_TEXT';
$resultKey = '~NAME';
break;
case 'ELEMENT_TEMPLATE':
$viewMode = 'ELEMENT_TEMPLATE';
$resultKey = '~NAME';
break;
}
}
if (!isset($cache[$arValue['VALUE']]))
{
$arFilter = [];
$intIBlockID = (int)$arProperty['LINK_IBLOCK_ID'];
if ($intIBlockID > 0)
$arFilter['IBLOCK_ID'] = $intIBlockID;
$arFilter['ID'] = $arValue['VALUE'];
if ($viewMode === '')
{
$arFilter['ACTIVE'] = 'Y';
$arFilter['ACTIVE_DATE'] = 'Y';
$arFilter['CHECK_PERMISSIONS'] = 'Y';
$arFilter['MIN_PERMISSION'] = 'R';
}
$rsElements = CIBlockElement::GetList(array(), $arFilter, false, false, array("ID","IBLOCK_ID","NAME","DETAIL_PAGE_URL"));
$cache[$arValue['VALUE']] = $rsElements->GetNext(true, true);
unset($rsElements);
}
if (!empty($cache[$arValue['VALUE']]) && is_array($cache[$arValue['VALUE']]))
{
if ($viewMode !== '' && $resultKey !== '')
{
$strResult = $cache[$arValue['VALUE']][$resultKey];
}
else
{
$strResult = '<a href="'.$cache[$arValue['VALUE']]['DETAIL_PAGE_URL'].'">'.$cache[$arValue['VALUE']]['NAME'].'</a>';
}
}
}
return $strResult;
}
public static function GetOptionsHtml($arProperty, $values, &$bWasSelect)
{
$options = "";
$settings = CIBlockPropertyElementList::PrepareSettings($arProperty);
$bWasSelect = false;
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]);
}
}
foreach($arTree as $arSection)
{
$options .= '<optgroup label="'.str_repeat(" . ", $arSection["DEPTH_LEVEL"]-1).$arSection["NAME"].'">';
if(isset($arSection["E"]))
{
foreach($arSection["E"] as $arItem)
{
$options .= '<option value="'.$arItem["ID"].'"';
if(in_array($arItem["~ID"], $values))
{
$options .= ' selected';
$bWasSelect = true;
}
$options .= '>'.$arItem["NAME"].'</option>';
}
}
$options .= '</optgroup>';
}
foreach($arElements as $arItem)
{
$options .= '<option value="'.$arItem["ID"].'"';
if(in_array($arItem["~ID"], $values))
{
$options .= ' selected';
$bWasSelect = true;
}
$options .= '>'.$arItem["NAME"].'</option>';
}
}
else
{
foreach(CIBlockPropertyElementList::GetElements($arProperty["LINK_IBLOCK_ID"]) as $arItem)
{
$options .= '<option value="'.$arItem["ID"].'"';
if(in_array($arItem["~ID"], $values))
{
$options .= ' selected';
$bWasSelect = true;
}
$options .= '>'.$arItem["NAME"].'</option>';
}
}
return $options;
}
/**
* Returns data for smart filter.
*
* @param array $arProperty Property description.
* @param array $value Current value.
* @return false|array
*/
public static function GetExtendedValue($arProperty, $value)
{
$html = self::GetPublicViewHTML($arProperty, $value, array('MODE' => 'SIMPLE_TEXT'));
if (strlen($html))
{
$text = htmlspecialcharsback($html);
return array(
'VALUE' => $text,
'UF_XML_ID' => $text,
);
}
return false;
}
public static function GetElements($IBLOCK_ID)
{
static $cache = array();
$IBLOCK_ID = intval($IBLOCK_ID);
if(!array_key_exists($IBLOCK_ID, $cache))
{
$cache[$IBLOCK_ID] = array();
if($IBLOCK_ID > 0)
{
$arSelect = array(
"ID",
"NAME",
"IN_SECTIONS",
"IBLOCK_SECTION_ID",
);
$arFilter = array (
"IBLOCK_ID"=> $IBLOCK_ID,
//"ACTIVE" => "Y",
"CHECK_PERMISSIONS" => "Y",
);
$arOrder = array(
"NAME" => "ASC",
"ID" => "ASC",
);
$rsItems = CIBlockElement::GetList($arOrder, $arFilter, false, false, $arSelect);
while($arItem = $rsItems->GetNext())
$cache[$IBLOCK_ID][] = $arItem;
}
}
return $cache[$IBLOCK_ID];
}
public static function GetSections($IBLOCK_ID)
{
static $cache = array();
$IBLOCK_ID = intval($IBLOCK_ID);
if(!array_key_exists($IBLOCK_ID, $cache))
{
$cache[$IBLOCK_ID] = array();
if($IBLOCK_ID > 0)
{
$arSelect = array(
"ID",
"NAME",
"DEPTH_LEVEL",
);
$arFilter = array (
"IBLOCK_ID"=> $IBLOCK_ID,
//"ACTIVE" => "Y",
"CHECK_PERMISSIONS" => "Y",
);
$arOrder = array(
"LEFT_MARGIN" => "ASC",
);
$rsItems = CIBlockSection::GetList($arOrder, $arFilter, false, $arSelect);
while($arItem = $rsItems->GetNext())
$cache[$IBLOCK_ID][$arItem["ID"]] = $arItem;
}
}
return $cache[$IBLOCK_ID];
}
}