Skip to content

Instantly share code, notes, and snippets.

@sukhikh18
Last active February 26, 2024 10:02
Show Gist options
  • Save sukhikh18/f69b76575a67b522aa5f28b4b78aecfe to your computer and use it in GitHub Desktop.
Save sukhikh18/f69b76575a67b522aa5f28b4b78aecfe to your computer and use it in GitHub Desktop.
Добавить тип свойства инфоблока и пользовательское свойство раздела на примере свойства "время" #Bitrix
<?php
use Bitrix\Main\EventManager;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\UserField\Types\StringType;
use Bitrix\Main\UserFieldTable;
if (!function_exists('escapeTime')):
function escapeTime($string, $del = ':')
{
if (false !== strpos($string, $del)) {
list($h, $s) = explode($del, $string);
$h = sprintf('%02d', min($h, 23));
$s = sprintf('%02d', min($s, 59));
return "$h:$s";
}
return sprintf('%02d', min(intval($string), 23)) . ':00';
}
endif;
/**
* Зарегистрировать свойство инфоблока
*/
EventManager::getInstance()->addEventHandler('iblock', 'OnIBlockPropertyBuildList',
[UIBlockPropertyTime::class, 'GetUserTypeDescription']);
class UIBlockPropertyTime
{
function GetUserTypeDescription()
{
return [
"PROPERTY_TYPE" => \Bitrix\Iblock\PropertyTable::TYPE_STRING,
"USER_TYPE" => \CUserTypeManager::BASE_TYPE_STRING, // CIBlockPropertyDateTime::USER_TYPE,
'DESCRIPTION' => 'Время',
// optional handlers
// Поле редактирования свойства в админ. части
"GetPropertyFieldHtml" => [__CLASS__, "GetPropertyFieldHtml"],
// Обработка перед сохранением в БД
"ConvertToDB" => [__CLASS__, "ConvertToDB"],
];
}
public static function ConvertToDB($arProperty, $value)
{
if (!empty($value["VALUE"])) {
if (false !== strpos($value, 'h')) {
$value["VALUE"] = escapeTime($value, 'h');
}
$value["VALUE"] = escapeTime($value);
}
return $value;
}
public static function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName)
{
return '<input type="text" size="20" name="'.$strHTMLControlName["VALUE"].'" value="'.$value["VALUE"].'">' .
($arProperty["WITH_DESCRIPTION"]=="Y" && '' != trim($strHTMLControlName["DESCRIPTION"]) ?
'<br><input type="text" size="20" name="'.$strHTMLControlName["DESCRIPTION"].'" value="'.htmlspecialcharsbx($value["DESCRIPTION"]).'">'
:''
);
}
}
/**
* Зарегистрировать пользовательское свойство
*/
/**
* Зарегистрировать пользовательское свойство
*/
EventManager::getInstance()->addEventHandler('main', 'OnUserTypeBuildList',
[CUserTypeTime::class, 'GetUserTypeDescription']);
class CUserTypeTime extends StringType
{
const USER_TYPE_ID = 'time';
public static function getDescription(): array
{
return [
'DESCRIPTION' => 'Время (HH:MM)',
'BASE_TYPE' => CUserTypeManager::BASE_TYPE_STRING,
];
}
public static function getDbColumnType(): string
{
return 'char(5)';
}
/**
* @param array|bool $userField
* @param array|null $additionalParameters
* @param $varsFromForm
* @return string
*/
public static function getSettingsHtml($userField, ?array $additionalParameters, $varsFromForm): string
{
ob_start();
?>
<tr>
<td>Значение по умолчанию:</td>
<td>
<input
type="text"
name="SETTINGS[DEFAULT_VALUE]"
size="20"
maxlength="225"
value="<?= $userField['SETTINGS']['DEFAULT_VALUE'] ?>"
>
</td>
</tr>
<?php
return ob_get_clean();
}
public static function prepareSettings(array $userField): array
{
return [
'DEFAULT_VALUE' => static::OnBeforeSave($userField, $userField['SETTINGS']['DEFAULT_VALUE']),
];
}
static function OnBeforeSave($arUserField, $value)
{
if (false !== strpos($value, 'h')) {
return escapeTime($value, 'h');
}
return escapeTime($value);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment