use Bitrix\Main\Localization\Loc,
Bitrix\Iblock;
Loc::loadMessages(__FILE__);
class CIBlockPropertySectionAutoComplete extends CIBlockPropertyElementAutoComplete
{
const USER_TYPE = 'SectionAuto';
public static function GetUserTypeDescription()
{
return array(
"PROPERTY_TYPE" => Iblock\PropertyTable::TYPE_SECTION,
"USER_TYPE" => self::USER_TYPE,
"DESCRIPTION" => Loc::getMessage('BT_UT_SAUTOCOMPLETE_DESCR'),
"GetPropertyFieldHtml" => array(__CLASS__, "GetPropertyFieldHtml"),
"GetPropertyFieldHtmlMulty" => array(__CLASS__,'GetPropertyFieldHtmlMulty'),
"GetAdminListViewHTML" => array(__CLASS__,"GetAdminListViewHTML"),
"GetPublicViewHTML" => array(__CLASS__, "GetPublicViewHTML"),
"GetPublicEditHTML" => array(__CLASS__, "GetPublicEditHTML"),
"GetAdminFilterHTML" => array(__CLASS__,'GetAdminFilterHTML'),
"GetSettingsHTML" => array(__CLASS__,'GetSettingsHTML'),
"PrepareSettings" => array(__CLASS__,'PrepareSettings'),
"AddFilterFields" => array(__CLASS__,'AddFilterFields'),
"GetPublicFilterHTML" => array(__CLASS__,'GetPublicFilterHTML'),
'GetUIEntityEditorProperty' => array(__CLASS__, 'GetUIEntityEditorProperty'),
'GetUIEntityEditorPropertyEditHtml' => array(__CLASS__, 'GetUIEntityEditorPropertyEditHtml'),
'GetUIEntityEditorPropertyViewHtml' => array(__CLASS__, 'GetUIEntityEditorPropertyViewHtml'),
);
}
public static function GetValueForAutoComplete($arProperty,$arValue,$arBanSym="",$arRepSym="")
{
$strResult = '';
$mxResult = static::GetPropertyValue($arProperty,$arValue);
if (is_array($mxResult))
{
$strResult = htmlspecialcharsbx(str_replace($arBanSym,$arRepSym,$mxResult['~NAME'])).' ['.$mxResult['ID'].']';
}
return $strResult;
}
public static function GetValueForAutoCompleteMulti($arProperty,$arValues,$arBanSym="",$arRepSym="")
{
$arResult = false;
if (is_array($arValues))
{
foreach ($arValues as $intPropertyValueID => $arOneValue)
{
if (!is_array($arOneValue))
{
$strTmp = $arOneValue;
$arOneValue = array(
'VALUE' => $strTmp,
);
}
$mxResult = static::GetPropertyValue($arProperty,$arOneValue);
if (is_array($mxResult))
{
$arResult[$intPropertyValueID] = htmlspecialcharsbx(str_replace($arBanSym,$arRepSym,$mxResult['~NAME'])).' ['.$mxResult['ID'].']';
}
}
}
return $arResult;
}
public static function GetPublicFilterHTML($arProperty, $strHTMLControlName)
{
return self::GetAdminFilterHTML($arProperty, $strHTMLControlName);
}
public static function GetPropertyFieldHtml($arProperty, $arValue, $strHTMLControlName)
{
global $APPLICATION;
$arSettings = static::PrepareSettings($arProperty);
$arSymbols = static::GetSymbols($arSettings);
$arProperty['LINK_IBLOCK_ID'] = (int)$arProperty['LINK_IBLOCK_ID'];
$fixIBlock = $arProperty["LINK_IBLOCK_ID"] > 0;
$windowTableId = 'iblockprop-'.Iblock\PropertyTable::TYPE_SECTION.'-'.$arProperty['ID'].'-'.$arProperty['LINK_IBLOCK_ID'];
if (isset($strHTMLControlName['MODE']) && $strHTMLControlName['MODE'] == 'iblock_element_admin')
{
$searchUrl = static::getSearchUrl().'?lang='.LANGUAGE_ID.
'&IBLOCK_ID='.$arProperty['LINK_IBLOCK_ID'].
'&n='.urlencode($strHTMLControlName["VALUE"]).
'&hideiblock='.$arProperty['IBLOCK_ID'].
($fixIBlock ? '&iblockfix=y' : '').
'&tableId='.$windowTableId;
$mxElement = static::GetPropertyValue($arProperty,$arValue);
if (!is_array($mxElement))
{
$strResult = ''.
''.
' ';
}
else
{
$strResult = ''.
''.
' '.$mxElement['NAME'].'';
}
unset($searchUrl);
}
else
{
ob_start();
?>
$control_id = $APPLICATION->IncludeComponent(
"bitrix:main.lookup.input",
"iblockedit",
array(
"CONTROL_ID" => preg_replace(
"/[^a-zA-Z0-9_]/i",
"x",
$strHTMLControlName["VALUE"].'_'.mt_rand(0, 10000)
),
"INPUT_NAME" => $strHTMLControlName["VALUE"],
"INPUT_NAME_STRING" => "inp_".$strHTMLControlName["VALUE"],
"INPUT_VALUE_STRING" => htmlspecialcharsback(static::GetValueForAutoComplete(
$arProperty,
$arValue,
$arSymbols['BAN_SYM'],
$arSymbols['REP_SYM']
)),
"START_TEXT" => Loc::getMessage('BT_UT_SAUTOCOMPLETE_MESS_INVITE'),
"MULTIPLE" => $arProperty["MULTIPLE"],
"MAX_WIDTH" => $arSettings['MAX_WIDTH'],
"IBLOCK_ID" => $arProperty["LINK_IBLOCK_ID"],
'WITHOUT_IBLOCK' => (!$fixIBlock ? 'Y' : 'N'),
'BAN_SYM' => $arSymbols['BAN_SYM_STRING'],
'REP_SYM' => $arSymbols['REP_SYM_STRING'],
'FILTER' => 'Y',
'TYPE' => 'SECTION'
), null, array("HIDE_ICONS" => "Y")
);
?>
if ($arSettings['VIEW'] == 'E')
{
$searchUrl = static::getSearchUrl().'?lang='.LANGUAGE_ID.
'&IBLOCK_ID='.$arProperty['LINK_IBLOCK_ID'].
'&n=&k=&lookup=jsMLI_'.$control_id.
'&hideiblock='.$arProperty['IBLOCK_ID'].
($fixIBlock ? '&iblockfix=y' : '').
'&tableId='.$windowTableId;
?>
unset($searchUrl);
}
if ($arSettings['SHOW_ADD'] == 'Y' && $fixIBlock)
{
$strButtonCaption = '';
if ($arSettings['IBLOCK_MESS'] == 'Y')
{
$arLangMess = CIBlock::GetMessages($arProperty["LINK_IBLOCK_ID"]);
$strButtonCaption = $arLangMess['SECTION_ADD'];
unset($arLangMess);
}
if ($strButtonCaption == '')
$strButtonCaption = Loc::getMessage('BT_UT_SAUTOCOMPLETE_MESS_NEW_ELEMENT');
?> null,
'IBLOCK_SECTION_ID' => -1,
'find_section_section' => -1,
'lookup' => 'jsMLI_'.$control_id,
'tableId' => $windowTableId
),
($fixIBlock ? '&iblockfix=y' : '')
); ?>', 900, 700);"
>
}
$strResult = ob_get_contents();
ob_end_clean();
}
return $strResult;
}
public static function GetPropertyFieldHtmlMulty($arProperty, $arValues, $strHTMLControlName)
{
global $APPLICATION;
$arSettings = static::PrepareSettings($arProperty);
$arSymbols = static::GetSymbols($arSettings);
$arProperty['LINK_IBLOCK_ID'] = (int)$arProperty['LINK_IBLOCK_ID'];
$fixIBlock = $arProperty["LINK_IBLOCK_ID"] > 0;
$windowTableId = 'iblockprop-'.Iblock\PropertyTable::TYPE_SECTION.'-'.$arProperty['ID'].'-'.$arProperty['LINK_IBLOCK_ID'];
if (isset($strHTMLControlName['MODE']) && ('iblock_element_admin' == $strHTMLControlName['MODE']))
{
$arResult = [];
foreach ($arValues as $intPropertyValueID => $arOneValue)
{
$mxElement = static::GetPropertyValue($arProperty,$arOneValue);
if (is_array($mxElement))
{
$searchUrl = static::getSearchUrl().'?lang='.LANGUAGE_ID.
'&IBLOCK_ID='.$arProperty["LINK_IBLOCK_ID"].
'&n='.urlencode($strHTMLControlName["VALUE"].'['.$intPropertyValueID.']').
'&hideiblock='.$arProperty['IBLOCK_ID'].
($fixIBlock ? '&iblockfix=y' : '').
'&tableId='.$windowTableId;
$arResult[] = ''.
''.
' '.$mxElement['NAME'].'';
unset($searchUrl);
}
}
if (0 < intval($arProperty['MULTIPLE_CNT']))
{
for ($i = 0; $i < $arProperty['MULTIPLE_CNT']; $i++)
{
$searchUrl = static::getSearchUrl().'?lang='.LANGUAGE_ID.
'&IBLOCK_ID='.$arProperty["LINK_IBLOCK_ID"].
'&n='.urlencode($strHTMLControlName["VALUE"].'[n'.$i.']').
'&hideiblock='.$arProperty['IBLOCK_ID'].
($fixIBlock ? '&iblockfix=y' : '').
'&tableId='.$windowTableId;
$arResult[] = ''.
''.
' ';
}
unset($searchUrl);
}
$strResult = implode('
',$arResult);
}
else
{
$mxResultValue = static::GetValueForAutoCompleteMulti($arProperty,$arValues,$arSymbols['BAN_SYM'],$arSymbols['REP_SYM']);
$strResultValue = (is_array($mxResultValue) ? htmlspecialcharsback(implode("\n",$mxResultValue)) : '');
ob_start();
?>
$control_id = $APPLICATION->IncludeComponent(
"bitrix:main.lookup.input",
"iblockedit",
array(
"CONTROL_ID" => preg_replace(
"/[^a-zA-Z0-9_]/i",
"x",
$strHTMLControlName["VALUE"].'_'.mt_rand(0, 10000)
),
"INPUT_NAME" => $strHTMLControlName['VALUE'].'[]',
"INPUT_NAME_STRING" => "inp_".$strHTMLControlName['VALUE'],
"INPUT_VALUE_STRING" => $strResultValue,
"START_TEXT" => Loc::getMessage('BT_UT_SAUTOCOMPLETE_MESS_INVITE'),
"MULTIPLE" => $arProperty["MULTIPLE"],
"MAX_WIDTH" => $arSettings['MAX_WIDTH'],
"MIN_HEIGHT" => $arSettings['MIN_HEIGHT'],
"MAX_HEIGHT" => $arSettings['MAX_HEIGHT'],
"IBLOCK_ID" => $arProperty["LINK_IBLOCK_ID"],
'WITHOUT_IBLOCK' => (!$fixIBlock ? 'Y' : 'N'),
'BAN_SYM' => $arSymbols['BAN_SYM_STRING'],
'REP_SYM' => $arSymbols['REP_SYM_STRING'],
'FILTER' => 'Y',
'TYPE' => 'SECTION'
), null, array("HIDE_ICONS" => "Y")
);
?>
if ($arSettings['VIEW'] == 'E')
{
$searchUrl = static::getSearchUrl().'?lang='.LANGUAGE_ID.
'&IBLOCK_ID='.$arProperty["LINK_IBLOCK_ID"].
'&m=y&n=&k=&lookup=jsMLI_'.$control_id.
'&hideiblock='.$arProperty['IBLOCK_ID'].
($fixIBlock ? '&iblockfix=y' : '').
'&tableId='.$windowTableId;
?>
unset($searchUrl);
}
if ($arSettings['SHOW_ADD'] == 'Y' && $fixIBlock)
{
$strButtonCaption = '';
if ($arSettings['IBLOCK_MESS'] == 'Y')
{
$arLangMess = CIBlock::GetMessages($arProperty["LINK_IBLOCK_ID"]);
$strButtonCaption = $arLangMess['SECTION_ADD'];
unset($arLangMess);
}
if ($strButtonCaption == '')
$strButtonCaption = Loc::getMessage('BT_UT_SAUTOCOMPLETE_MESS_NEW_ELEMENT');
?> null,
'IBLOCK_SECTION_ID' => -1,
'find_section_section' => -1,
'lookup' => 'jsMLI_'.$control_id,
'tableId' => $windowTableId
),
($fixIBlock ? '&iblockfix=y' : '')
); ?>', 900, 700);"
>
unset($strButtonCaption);
}
$strResult = ob_get_contents();
ob_end_clean();
}
return $strResult;
}
public static function GetAdminListViewHTML($arProperty, $arValue, $strHTMLControlName)
{
$strResult = '';
$mxResult = static::GetPropertyValue($arProperty,$arValue);
if (is_array($mxResult))
{
$strResult = $mxResult['NAME'].' ['.$mxResult['ID'].']';
}
return $strResult;
}
public static function GetPublicViewHTML($arProperty, $arValue, $strHTMLControlName)
{
static $cache = array();
$strResult = '';
$arValue['VALUE'] = intval($arValue['VALUE']);
if (0 < $arValue['VALUE'])
{
if (!isset($cache[$arValue['VALUE']]))
{
$arFilter = array();
$intIBlockID = intval($arProperty['LINK_IBLOCK_ID']);
if (0 < $intIBlockID) $arFilter['IBLOCK_ID'] = $intIBlockID;
$arFilter['ID'] = $arValue['VALUE'];
$arFilter["ACTIVE"] = "Y";
$arFilter["CHECK_PERMISSIONS"] = "Y";
$arFilter["MIN_PERMISSION"] = "R";
$rsElements = CIBlockSection::GetList(
array(),
$arFilter,
false,
array("ID","IBLOCK_ID","NAME","SECTION_PAGE_URL")
);
if (isset($strHTMLControlName['SECTION_URL']))
{
$rsElements->SetUrlTemplates('', $strHTMLControlName['SECTION_URL']);
}
$cache[$arValue['VALUE']] = $rsElements->GetNext(true,true);
}
if (is_array($cache[$arValue['VALUE']]))
{
if (isset($strHTMLControlName['MODE']) && 'CSV_EXPORT' == $strHTMLControlName['MODE'])
{
$strResult = $cache[$arValue['VALUE']]['ID'];
}
elseif (isset($strHTMLControlName['MODE']) && ('SIMPLE_TEXT' == $strHTMLControlName['MODE'] || 'ELEMENT_TEMPLATE' == $strHTMLControlName['MODE']))
{
$strResult = $cache[$arValue['VALUE']]["~NAME"];
}
else
{
$strResult = ''.$cache[$arValue['VALUE']]["NAME"].'';
}
}
}
return $strResult;
}
public static function GetPublicEditHTML($property, $value, $control)
{
global $APPLICATION;
$multi = (isset($property['MULTIPLE']) && $property['MULTIPLE'] == 'Y');
$settings = static::PrepareSettings($property);
$symbols = static::GetSymbols($settings);
$fixIBlock = $property["LINK_IBLOCK_ID"] > 0;
ob_start();
if ($multi)
{
$resultValue = static::GetValueForAutoCompleteMulti(
$property,
$value,
$symbols['BAN_SYM'],
$symbols['REP_SYM']
);
$resultValue = (is_array($resultValue) ? htmlspecialcharsback(implode("\n",$resultValue)) : '');
}
else
{
$resultValue = htmlspecialcharsback(static::GetValueForAutoComplete(
$property,
$value,
$symbols['BAN_SYM'],
$symbols['REP_SYM']
));
}
$APPLICATION->IncludeComponent(
'bitrix:main.lookup.input',
'iblockedit',
array(
'CONTROL_ID' => preg_replace(
"/[^a-zA-Z0-9_]/i",
"x",
$control['VALUE'].'_'.mt_rand(0, 10000)
),
'INPUT_NAME' => $control['VALUE'].($multi ? '[]' : ''),
'INPUT_NAME_STRING' => 'inp_'.$control['VALUE'],
'INPUT_VALUE_STRING' => $resultValue,
'START_TEXT' => Loc::getMessage('BT_UT_SAUTOCOMPLETE_MESS_INVITE'),
'MULTIPLE' => $property['MULTIPLE'],
'IBLOCK_ID' => $property['LINK_IBLOCK_ID'],
'WITHOUT_IBLOCK' => (!$fixIBlock ? 'Y' : 'N'),
'BAN_SYM' => $symbols['BAN_SYM_STRING'],
'REP_SYM' => $symbols['REP_SYM_STRING'],
'MAX_WIDTH' => $settings['MAX_WIDTH'],
'MIN_HEIGHT' => $settings['MIN_HEIGHT'],
'MAX_HEIGHT' => $settings['MAX_HEIGHT'],
'FILTER' => 'Y',
'TYPE' => 'SECTION'
),
(isset($control['PARENT_COMPONENT']) ? $control['PARENT_COMPONENT'] : null),
array('HIDE_ICONS' => 'Y')
);
$result = ob_get_contents();
ob_end_clean();
return $result;
}
public static function PrepareSettings($arFields)
{
/*
* VIEW - view type
* SHOW_ADD - show button for add new values in linked iblock
* MAX_WIDTH - max width textarea and input in pixels
* MIN_HEIGHT - min height textarea in pixels
* MAX_HEIGHT - max height textarea in pixels
* BAN_SYM - banned symbols string
* REP_SYM - replace symbol
* OTHER_REP_SYM - non standart replace symbol
* IBLOCK_MESS - get lang mess from linked iblock
*/
$arViewsList = static::GetPropertyViewsList(false);
$strView = (isset($arFields['USER_TYPE_SETTINGS']['VIEW']) && in_array($arFields['USER_TYPE_SETTINGS']['VIEW'],$arViewsList) ? $arFields['USER_TYPE_SETTINGS']['VIEW'] : current($arViewsList));
$strShowAdd = (isset($arFields['USER_TYPE_SETTINGS']['SHOW_ADD']) ? $arFields['USER_TYPE_SETTINGS']['SHOW_ADD'] : '');
$strShowAdd = ('Y' == $strShowAdd ? 'Y' : 'N');
if ((int)$arFields['LINK_IBLOCK_ID'] <= 0)
$strShowAdd = 'N';
$intMaxWidth = intval(isset($arFields['USER_TYPE_SETTINGS']['MAX_WIDTH']) ? $arFields['USER_TYPE_SETTINGS']['MAX_WIDTH'] : 0);
if (0 >= $intMaxWidth) $intMaxWidth = 0;
$intMinHeight = intval(isset($arFields['USER_TYPE_SETTINGS']['MIN_HEIGHT']) ? $arFields['USER_TYPE_SETTINGS']['MIN_HEIGHT'] : 0);
if (0 >= $intMinHeight) $intMinHeight = 24;
$intMaxHeight = intval(isset($arFields['USER_TYPE_SETTINGS']['MAX_HEIGHT']) ? $arFields['USER_TYPE_SETTINGS']['MAX_HEIGHT'] : 0);
if (0 >= $intMaxHeight) $intMaxHeight = 1000;
$strBannedSymbols = trim(isset($arFields['USER_TYPE_SETTINGS']['BAN_SYM']) ? $arFields['USER_TYPE_SETTINGS']['BAN_SYM'] : ',;');
$strBannedSymbols = str_replace(' ','',$strBannedSymbols);
if (false === mb_strpos($strBannedSymbols, ','))
$strBannedSymbols .= ',';
if (false === mb_strpos($strBannedSymbols, ';'))
$strBannedSymbols .= ';';
$strOtherReplaceSymbol = '';
$strReplaceSymbol = (isset($arFields['USER_TYPE_SETTINGS']['REP_SYM']) ? $arFields['USER_TYPE_SETTINGS']['REP_SYM'] : ' ');
if (BT_UT_AUTOCOMPLETE_REP_SYM_OTHER == $strReplaceSymbol)
{
$strOtherReplaceSymbol = (isset($arFields['USER_TYPE_SETTINGS']['OTHER_REP_SYM'])? mb_substr($arFields['USER_TYPE_SETTINGS']['OTHER_REP_SYM'], 0, 1) : '');
if ((',' == $strOtherReplaceSymbol) || (';' == $strOtherReplaceSymbol))
$strOtherReplaceSymbol = '';
if (('' == $strOtherReplaceSymbol) || in_array($strOtherReplaceSymbol,static::GetReplaceSymList()))
{
$strReplaceSymbol = $strOtherReplaceSymbol;
$strOtherReplaceSymbol = '';
}
}
if ('' == $strReplaceSymbol)
{
$strReplaceSymbol = ' ';
$strOtherReplaceSymbol = '';
}
$strIBlockMess = (isset($arFields['USER_TYPE_SETTINGS']['IBLOCK_MESS']) ? $arFields['USER_TYPE_SETTINGS']['IBLOCK_MESS'] : '');
if ('Y' != $strIBlockMess) $strIBlockMess = 'N';
return array(
'VIEW' => $strView,
'SHOW_ADD' => $strShowAdd,
'MAX_WIDTH' => $intMaxWidth,
'MIN_HEIGHT' => $intMinHeight,
'MAX_HEIGHT' => $intMaxHeight,
'BAN_SYM' => $strBannedSymbols,
'REP_SYM' => $strReplaceSymbol,
'OTHER_REP_SYM' => $strOtherReplaceSymbol,
'IBLOCK_MESS' => $strIBlockMess,
);
}
public static function GetSettingsHTML($arFields,$strHTMLControlName, &$arPropertyFields)
{
$arPropertyFields = array(
"HIDE" => array("ROW_COUNT", "COL_COUNT","MULTIPLE_CNT"),
'USER_TYPE_SETTINGS_TITLE' => Loc::getMessage('BT_UT_SAUTOCOMPLETE_SETTING_TITLE'),
);
$arSettings = static::PrepareSettings($arFields);
return '