Добрый день!
Создал пользовательский тип поля.
Сделал его множественным, как отобразить выбранные значения в функции GetPublicView при множественном выборе?
Код:
defined('B_PROLOG_INCLUDED') || die;
use Bitrix\Main\EventManager;
use Bitrix\Main\UI\Extension;
use Bitrix\Main\UserField\TypeBase;
Extension::load('ui.forms');
$eventManager = EventManager::getInstance();
$eventManager->addEventHandlerCompatible('main', 'OnUserTypeBuildList', array('MyUserType', 'GetUserTypeDescription'));
class MyUserType extends TypeBase
{
const USER_TYPE_ID = 'YEARSMONTH';
const MONTHS = [
'',
'Январь',
'Февраль',
'Март',
'Апрель',
'Май',
'Июнь',
'Июль',
'Август',
'Сентябрь',
'Октябрь',
'Ноябрь',
'Декабрь',
];
const YEARS = [
2024 => 2024,
2025 => 2025,
2026 => 2026,
2027 => 2027,
2028 => 2028,
];
public static function GetUserTypeDescription()
{
return array(
'USER_TYPE_ID' => static::USER_TYPE_ID,
'CLASS_NAME' => __CLASS__,
'DESCRIPTION' => 'Год и месяц поставки',
'BASE_TYPE' => \CUserTypeManager::BASE_TYPE_STRING,
'EDIT_CALLBACK' => array(__CLASS__, 'GetPublicEdit'),
'VIEW_CALLBACK' => array(__CLASS__, 'GetPublicView'),
);
}
public static function GetDBColumnType($arUserField)
{
global $DB;
switch(strtolower($DB->type))
{
case "mysql":
return "varchar(32)";
case "oracle":
return "varchar2(32 char)";
case "mssql":
return "varchar(32)";
}
}
public static function OnBeforeSave($arUserField, $value) {
if(empty($value) || !is_array($value))
return $value;
return implode('.', $value);
}
public function onAfterFetch($userfield, $fetched)
{
return self::prepareValue($fetched['VALUE']);
}
public static function GetPublicView($arUserField, $arAdditionalParameters = array())
{
return (!empty($arUserField['VALUE']) ? self::MONTHS[$arUserField['VALUE'][0]] .' '. self::YEARS[$arUserField['VALUE'][1]] : 'не задано');
//return self::GetPublicEdit($arUserField, $arAdditionalParameters);
}
public static function GetPublicEdit($arUserField, $arAdditionalParameters = array())
{
$fieldName = static::getFieldName($arUserField, $arAdditionalParameters);
// Bitrix\Main\Diag\Debug::writeToFile( $fieldValue, '', "/logText23.log");
$fieldValue = static::getFieldValue($arUserField, $arAdditionalParameters);
return '<div class="ui-form">
<div class="ui-form-row-inline">
<div class="ui-form-row">
<div class="ui-form-label">
<div class="ui-ctl-label-text">Месяц поставки</div>
</div>
<div class="ui-form-content">
<div class="ui-ctl ui-ctl-after-icon ui-ctl-multiple-select ui-ctl-w100">
<div class="ui-ctl-after ui-ctl-icon-angle"></div>
'.self::prepareData($fieldName, $fieldValue, self::MONTHS).'
</div>
</div>
</div>
<div class="ui-form-row">
<div class="ui-form-label">
<div class="ui-ctl-label-text">Год поставки</div>
</div>
<div class="ui-form-content">
<div class="ui-ctl ui-ctl-after-icon ui-ctl-multiple-select ui-ctl-w100">
<div class="ui-ctl-after ui-ctl-icon-angle"></div>
'.self::prepareData($fieldName, $fieldValue, self::YEARS, 1).'
</div>
</div>
</div>
</div>
</div>';
}
protected static function prepareValue($value)
{
if(empty($value))
return $value;
return explode('.', $value);
}
protected static function prepareData($fieldName, $fieldValue, $data, $index = 0)
{
Bitrix\Main\Diag\Debug::writeToFile( $fieldValue, '', "/logText23.log");
$res = '<select class="ui-ctl-element" multiple name="'.htmlspecialcharsbx($fieldName).'">';
foreach($data as $key => $value)
{
$selected = '';
if(isset($fieldValue[$index]) && $key == $fieldValue[$index])
$selected = ' selected';
$ddd = $fieldValue[$index] . $fieldValue ;
Bitrix\Main\Diag\Debug::writeToFile( $arUserField['VALUE'], '', "/logText2366.log");
$res .= '<option value="'.htmlspecialcharsbx($key).'"'.$selected.'>'.htmlspecialcharsbx($value).'</option>';
}
$res .= '</select>';
return $res;
}
}
Заранее спасибо за советы!