Ссылка на статью
https://ru.stackoverflow.com/questions/517042/1c-%D0%91%D0%B8%D1%82%D1%80%D0%B8%D0%BA%D1%81-%D0%BA%D0%B0%D1%81%D1%82%D0%BE%D0%BC%D0%BD%D1%8B%D0%B9-%D1%82%D0%B8%D0%BF-%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0-%D0%B8%D0%BD%D1%84%D0%BE%D0%B1%D0%BB%D0%BE%D0%BA%D0%B0
——————
если кратко заготовка, используемая во всех примерах.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
AddEventHandler("iblock", "OnIBlockPropertyBuildList", array("CIBlockNewProperty", "GetUserTypeDescription")); class CIBlockNewProperty { public function GetUserTypeDescription() { return array( "PROPERTY_TYPE" => "S", #-----один из стандартных типов "USER_TYPE" => "MYIDCODE", #-----идентификатор типа свойства "DESCRIPTION" => "Название свойства", "GetPropertyFieldHtml" => array("CIBlockNewProperty", "GetPropertyFieldHtml"), ); } /*--------- вывод поля свойства на странице редактирования ---------*/ public function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName) { return '<input type="text" name="'.$strHTMLControlName["VALUE"].'" value="'.$value['VALUE'].'"> <input type="text" name="'.$strHTMLControlName["DESCRIPTION"].'" value="'.$value['DESCRIPTION'].'">'; } } |
еще сссылки
https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=7350
https://dev.1c-bitrix.ru/community/webdev/user/107201/blog/6730/
c готовым файлом
https://it-svalka.ru/blog/bitrix/sobstvennyy-tip-polzovatelskikh-poley-v-1s-bitriks/
в битрикс 24
Как добавить собственный тип пользовательского поля в Битрикс 24
есть интересное описание в ядре, кототое почти не несет смысла.
bitrix/modules/main/classes/general/usertype.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
/** * Функция возвращает метаданные типа. * * <p>Если это первый вызов функции, то выполняется системное событие OnUserTypeBuildList (main). * Зарегистрированные обработчики должны вернуть даные описания типа. В данном случае действует правило - * кто последний тот и папа. (на случай если один тип зарегились обрабатывать "несколько" классов)</p> * <p>Без параметров функция возвращает полный список типов.<p> * <p>При заданном user_type_id - возвращает массив если такой тип зарегистрирован и false если нет.<p> * @param string|bool $user_type_id необязательный. идентификатор типа свойства. * @return array|boolean */ function GetUserType($user_type_id = false) { if(!is_array($this->arUserTypes)) { $this->arUserTypes = array(); foreach(GetModuleEvents("main", "OnUserTypeBuildList", true) as $arEvent) { $res = ExecuteModuleEventEx($arEvent); $this->arUserTypes[$res["USER_TYPE_ID"]] = $res; } } if($user_type_id !== false) { if(array_key_exists($user_type_id, $this->arUserTypes)) return $this->arUserTypes[$user_type_id]; else return false; } else return $this->arUserTypes; } |
вот так кастомное поле может выглядеть с селектами
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
namespace Instructions; class CIBlockNewProperty { public function GetUserTypeDescription() { return array( "PROPERTY_TYPE" => "N", #-----один из стандартных типов "USER_TYPE" => "r_marka_model", #-----идентификатор типа свойства "DESCRIPTION" => "Марка-модель", "GetPropertyFieldHtml" => array("\Instructions\CIBlockNewProperty", "GetPropertyFieldHtml"), ); } /*--------- вывод поля свойства на странице редактирования ---------*/ public function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName) { $id_marka = self::getIdMarka($value); $id_model = self::getIdModel($value); list($str_select_marka, $str_select_model) = self::getStrNameAndModel($id_marka, $id_model); //'$value: '.$value['VALUE'].'vDESCRIPTION: '.$value['DESCRIPTION'].' description: '.$strHTMLControlName["DESCRIPTION"].' value:'.$strHTMLControlName["VALUE"]. return '<select name="'.$strHTMLControlName["DESCRIPTION"].'" onchange="getModels(this.options[this.selectedIndex].value, this)" class="admin_select_marka" > '.$str_select_marka.' </select> <select name="'.$strHTMLControlName["VALUE"].'" class="admin_select_model" > '.$str_select_model.' </select> '; } /** * @param $value * @return array */ public function getIdMarka($value) { $id_marka = 0; if (!empty($value['DESCRIPTION'])) { $id_marka = round($value['DESCRIPTION']); if ($id_marka > 0) { $id_marka = $value['DESCRIPTION']; } else { $id_marka = 0; } } return $id_marka; } /** * @param $value * @return int|mixed */ public function getIdModel($value) { $id_model = 0; if (!empty($value['VALUE'])) { $id_model = round($value['VALUE']); if ($id_model > 0) { $id_model = $value['VALUE']; } else { $id_model = 0; } } return $id_model; } /** * @param $id_marka * @param $id_model * @return array */ private function getStrNameAndModel($id_marka, $id_model): array { $mas_marka = GetAllMarka(true); $str_select_marka = GetContentSelect('Марка', $mas_marka, $id_marka); $mass_model = GetModelByMarka($id_marka, true); $str_select_model = GetContentSelect('Модель', $mass_model, $id_model); return array($str_select_marka, $str_select_model); } } |
Не забываем в админку добавить типо этого в файл /local/php_interface/admin_header.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php CJSCore::Init(array("jquery")); //jquery ?> <script> // рабочая функция function getModels(id_marka,select_this) { let selectModel=$(select_this).siblings(".admin_select_model"); var url = '/filter/index.php?ajax=y&action=get_select_model&id_marka='+id_marka; jQuery.get(url, function(r){ selectModel.html(r); }); } </script> |