Last active
February 26, 2024 10:02
-
-
Save sukhikh18/f69b76575a67b522aa5f28b4b78aecfe to your computer and use it in GitHub Desktop.
Добавить тип свойства инфоблока и пользовательское свойство раздела на примере свойства "время" #Bitrix
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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