Обучаю битриксу программистов, интеграторов. Подробнee ⇒

Свой тип свойства



Битрикс поменял апи и многие старые кастомные типы свойства слетели
Сейчас делать так (пример от ТП Битрикса):
Класс, которые позволяет выбирать день недели и время.
Данное свойство может быть множественным.
<?php

namespace lib\usertype;

use Bitrix\Main\Loader,
   Bitrix\Main\Localization\Loc,
   Bitrix\Iblock;

/**
* Реализация свойство «Расписание врача»
* Class CUserTypeTimesheet
* @package lib\usertype
*/
class CUserTypeTimesheet
{
   /**
    * Метод возвращает массив описания собственного типа свойств
    * @return array
    */
   public static function GetUserTypeDescription()
   {
       return array(
           'USER_TYPE_ID' => 'user_timesheet', //Уникальный идентификатор типа свойств
           'USER_TYPE' => 'TIMESHEET',
           'CLASS_NAME' => __CLASS__,
           'DESCRIPTION' => 'Расписание специалиста',
           'PROPERTY_TYPE' => 'string',
           'ConvertToDB' => [__CLASS__, 'ConvertToDB'],
           'ConvertFromDB' => [__CLASS__, 'ConvertFromDB'],
           'GetPropertyFieldHtml' => [__CLASS__, 'GetPropertyFieldHtml'],
       );
   }

   /**
    * Конвертация данных перед сохранением в БД
    * @param $arProperty
    * @param $value
    * @return mixed
    */
   public static function ConvertToDB($arProperty, $value)
   {
       if (array_key_exists('TIME_FROM', (array)$value['VALUE']))
       {
           if ($value['VALUE']['TIME_FROM'] != '' && $value['VALUE']['TIME_TO']!='')
           {
               try {
                   $value['VALUE'] = base64_encode(serialize($value['VALUE']));
               } catch(Bitrix\Main\ObjectException $exception) {
                   echo $exception->getMessage();
               }
           } else {
               $value['VALUE'] = '';
           }
       }

       return $value;
   }

   /**
    * Конвертируем данные при извлечении из БД
    * @param $arProperty
    * @param $value
    * @param string $format
    * @return mixed
    */
   public static function ConvertFromDB($arProperty, $value, $format = '')
   {
       if ($value['VALUE'] != '')
       {
           try {
               $value['VALUE'] = base64_decode($value['VALUE']);
           } catch(Bitrix\Main\ObjectException $exception) {
               echo $exception->getMessage();
           }
       }

       return $value;
   }

   /**
    * Представление формы редактирования значения
    * @param $arUserField
    * @param $arHtmlControl
    */
   public static function GetPropertyFieldHtml($arProperty, $value, $arHtmlControl)
   {
       $weekDays = [
           'mon' => 'Понедельник',
           'tue' => 'Вторник',
           'wed' => 'Среда',
           'thu' => 'Четверг',
           'fri' => 'Пятница',
           'sat' => 'Суббота',
           'sun' => 'Воскресенье',
       ];

       $itemId = 'row_' . substr(md5($arHtmlControl['VALUE']), 0, 10); //ID для js
       $fieldName =  htmlspecialcharsbx($arHtmlControl['VALUE']);
       //htmlspecialcharsback нужен для того, чтобы избавиться от многобайтовых символов из-за которых не работает unserialize()
       $arValue = unserialize(htmlspecialcharsback($value['VALUE']), [stdClass::class]);

       $select = '<select class="week_day" name="'. $fieldName .'[WEEK_DAY]">';
       foreach ($weekDays as $key => $day){
           if($arValue['WEEK_DAY'] == $key){
               $select .= '<option value="'. $key .'" selected="selected">'. $day .'</option>';
           } else {
               $select .= '<option value="'. $key .'">'. $day .'</option>';
           }

       }
       $select .= '</select>';

       $html = '<div class="property_row" id="'. $itemId .'">';

       $html .= '<div class="reception_time">';
       $html .= $select;
       $timeFrom = ($arValue['TIME_FROM']) ? $arValue['TIME_FROM'] : '';
       $timeTo = ($arValue['TIME_TO']) ? $arValue['TIME_TO'] : '';

       $html .=' время приёма: с <input type="time" name="'. $fieldName .'[TIME_FROM]" value="'. $timeFrom . '">';
       $html .=' по <input type="time" name="'. $fieldName .'[TIME_TO]" value="'. $timeTo .'">';
       if($timeFrom!='' && $timeTo!=''){
           $html .= '  <input type="button" style="height: auto;" value="x" title="Удалить" onclick="document.getElementById(\''. $itemId .'\').parentNode.parentNode.remove()" />';
       }
       $html .= '</div>';

       $html .= '</div><br/>';

       return $html;
   }

   public static function GetDBColumnType($arUserField)
   {
       global $DB;
       switch(strtolower($DB->type))
       {
           case "mysql":
               return "int(18)";
           case "oracle":
               return "number(18)";
           case "mssql":
               return "int";
       }
       return "int";
   }
}
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!