Добрый день! Мне нужны были 2 типа свойства: время и длительность. С типом "время" проблем нет, а вот значение поля с типом "длительность" не сохраняется, остается всегда пустым. Полагаю, что функция ConvertToDB вовсе не вызывается (логи из нее не пишутся).
Подскажите, пожалуйста, в чем может быть ошибка? Поле длительность (экскурсии) может редактор задавать в минутах, часах или днях, но надо, чтобы в базе данных оно сохранялось в минутах, ибо по нему будет фильтрация (ползунок) элементов инфоблока.
Файл init.php
Подскажите, пожалуйста, в чем может быть ошибка? Поле длительность (экскурсии) может редактор задавать в минутах, часах или днях, но надо, чтобы в базе данных оно сохранялось в минутах, ибо по нему будет фильтрация (ползунок) элементов инфоблока.
Файл init.php
| Код |
|---|
<?
AddEventHandler("iblock", "OnIBlockPropertyBuildList", array("CIBlockNewProperty", "GetUserTypeDescription"));
class CIBlockNewProperty {
public static function GetUserTypeDescription() { return array( "PROPERTY_TYPE" => "S", "USER_TYPE" => "MYIDCODE", "DESCRIPTION" => "Время", "GetPropertyFieldHtml" => array("CIBlockNewProperty", "GetPropertyFieldHtml"), ); }
public static function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName) { $ret = '<input type="time" name="'.$strHTMLControlName["VALUE"].'" value="'.$value['VALUE'].'">'; return $ret; }}
// Обработчик для "Длительности" свойстваAddEventHandler("iblock", "OnIBlockPropertyBuildList", function() { return [ 'USER_TYPE' => 'duration', 'DESCRIPTION' => 'Длительность', 'GetPropertyFieldHtml' => ['DurationProperty', 'GetPropertyFieldHtml'], 'GetPublicViewHTML' => ['DurationProperty', 'GetPublicViewHTML'], 'ConvertToDB' => ['DurationProperty', 'ConvertToDB'], 'ConvertFromDB' => ['DurationProperty', 'ConvertFromDB'], ];});
class DurationProperty {
public static function GetPropertyFieldHtml($arProperty, $value, $formName) { $units = [ 'minutes' => 'Минуты', 'hours' => 'Часы', 'days' => 'Дни', ];
$html = '<input type="number" name="' . $formName . '[' . $arProperty['CODE'] . '_VALUE]" value="' . htmlspecialchars($value['VALUE']) . '" placeholder="Длительность" min="0" />'; $html .= '<select name="' . $formName . '[' . $arProperty['CODE'] . '_UNIT]">'; foreach ($units as $key => $label) { $selected = $value['UNIT'] == $key ? 'selected' : ''; $html .= '<option value="' . $key . '" ' . $selected . '>' . $label . '</option>'; }
$html .= '</select>'; return $html; }
public static function GetPublicViewHTML($arProperty, $value) { $duration = htmlspecialchars($value['VALUE']); $unit = htmlspecialchars($value['UNIT']); $unitLabels = [ 'minutes' => 'минут', 'hours' => 'часов', 'days' => 'дней', ];
return "$duration " . (isset($unitLabels[$unit]) ? $unitLabels[$unit] : 'минут'); }
public static function ConvertToDB($arProperty, $value) { $duration = (int)$value[$arProperty['CODE'] . '_VALUE']; $unit = $value[$arProperty['CODE'] . '_UNIT'];
// Конвертация в минуты if ($unit == 'hours') { $duration *= 60; // переводим часы в минуты } elseif ($unit == 'days') { $duration *= 1440; // переводим дни в минуты (24*60) }
return [ 'VALUE' => $duration, 'UNIT' => 'minutes' // Мы всегда сохраняем только в минутах ]; }
public static function ConvertFromDB($arProperty, $value) { return [ 'VALUE' => $value['VALUE'], 'UNIT' => 'minutes' // Храним как минуты ]; }}
?> |