{"id":22178043,"url":"https://github.com/fi1a/usersettings","last_synced_at":"2025-03-24T18:26:45.724Z","repository":{"id":59454841,"uuid":"316495960","full_name":"fi1a/usersettings","owner":"fi1a","description":"Модуль 1С-Битрикс \"Пользовательские настройки\". Предоставляет страницу с пользовательскими настройками сайта.","archived":false,"fork":false,"pushed_at":"2023-03-15T07:50:02.000Z","size":1207,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-29T23:16:42.335Z","etag":null,"topics":["bitrix","bitrix-module","php"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fi1a.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-11-27T12:30:15.000Z","updated_at":"2023-01-31T18:37:03.000Z","dependencies_parsed_at":"2024-12-02T08:45:23.136Z","dependency_job_id":null,"html_url":"https://github.com/fi1a/usersettings","commit_stats":{"total_commits":116,"total_committers":2,"mean_commits":58.0,"dds":0.03448275862068961,"last_synced_commit":"f58505b30f4111d2ef9bbda9c5ea23fd397f68f7"},"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fi1a%2Fusersettings","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fi1a%2Fusersettings/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fi1a%2Fusersettings/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fi1a%2Fusersettings/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fi1a","download_url":"https://codeload.github.com/fi1a/usersettings/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245326982,"owners_count":20597128,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bitrix","bitrix-module","php"],"created_at":"2024-12-02T08:34:32.094Z","updated_at":"2025-03-24T18:26:45.694Z","avatar_url":"https://github.com/fi1a.png","language":"PHP","readme":"# Модуль 1С-Битрикс \"Пользовательские настройки\"\n\n[![Latest Version][badge-release]][packagist]\n[![Software License][badge-license]][license]\n[![PHP Version][badge-php]][php]\n[![Total Downloads][badge-downloads]][downloads]\n[![Support mail][badge-mail]][mail]\n\nПозволяет создать административную страницу с пользовательскими настройками.\nПредоставляет удобное API для создания вкладок и полей, что дает возможность\nиспользовать этот модуль совместно с модулями миграций. События дают возможность вносить\nизменения в устанавливаемое значение настройки или выполнить какие-либо действия при\nдобавлении/удалении/обновлении вкладок или полей.\n\n## Описание модуля\n\nДанный модуль решает задачи добавления настроек для вашего проекта.\nНапример: включение/отключение, даты для реализации активности какого-либо функционала,\nтексты. Типы полей в настройках ограничены типами пользовательских полей, т.е. вы легко можете\nдобавить свой тип поля для настроек.\n\n## Преимущества модуля\n\n1. Расположение ссылки в меню со страницей пользовательских настроек можно расположить в любом основном разделе. Также возможна настройка названия страницы и название ссылки пользовательских настроек;\n1. В настройках модуля можно добавить вкладки и в них поля;\n1. Для вкладок и полей предусмотрена сортировка, что позволяет настроить расположение их на странице пользовательских настроек;\n1. В качестве полей модуля выступают пользовательские поля, что позволяет добавить в настройки любой из доступных типов пользовательских полей (строка, дата и т.д.);\n1. Поддерживаются множественные значения для настроек;\n1. Предусмотрены гибкие настройки прав доступа для просмотра/редактирования пользовательских настроек и просмотра/редактирования полей, вкладок;\n1. Для вкладок есть возможность указать название и заголовок, для полей - название и подсказку;\n1. Используя API легко можно добавить вкладку или поле, это позволяет писать миграции;\n1. Система событий дает возможность вносить изменения при установке значения настройки или выполнить какие-либо действия при добавлении/удалении/обновлении вкладок или полей.\n\n## Список поддерживаемых типов полей\n\nИз коробки вам будут доступны следующие типы полей:\n\n- Адрес;\n- Бронирование ресурсов;\n- Видео;\n- Да/Нет;\n- Дата;\n- Дата со временем;\n- Деньги;\n- Опрос;\n- Письмо (email);\n- Привязка к разделам инф. блоков;\n- Привязка к элементам highload-блоков;\n- Привязка к элементам инф. блоков;\n- Содержимое ссылки;\n- Список;\n- Ссылка;\n- Строка;\n- Файл;\n- Целое число;\n- Число;\n- Шаблон.\n\n*список актуален на момент релиза модуля для «1С-Битрикс: Управление сайтом» редакции \"Бизнес\"*\n\n## Изображения модуля\n\nДобавление новой вкладки:\n\n![Добавление новой вкладки](images/fi1a.usersettings-screen-1.png)\n\nДобавление поля для пользовательских настроек:\n\n![Добавление поля для пользовательских настроек](images/fi1a.usersettings-screen-2.png)\n\nРедактирование пользовательских настроек\n\n![Редактирование пользовательских настроек](images/fi1a.usersettings-screen-3.png)\n\nВнешний вид пользовательских настроек\n\n![Внешний вид пользовательских настроек](images/fi1a.usersettings-screen-4.png)\n\n## Установка модуля из Маркетплейса 1С-Битрикс\n\nМодуль можно установить из Маркетплейса 1С-Битрикс\n[\"Пользовательские настройки\"](http://marketplace.1c-bitrix.ru/solutions/fi1a.usersettings/)\n\nПеред установкой модуля следует установить модуль\n[\"Обертка над composer для установки зависимостей\"](http://marketplace.1c-bitrix.ru/solutions/fi1a.bitrixrequire/)\nесли он еще не установлен.\nМодуль необходим для установки зависимостей через composer.\n\nПосле чего модуль устанавливается и удаляется как любой модуль из маркетплейса.\n\n## Установка модуля через composer\n\nВ вашем composer.json проекта необходимо указать:\n\n- в блоке require указать инсталятор ```\"fi1a/installers\": \"^2.0```;\n- в блоке require указать модуль ```\"fi1a/usersettings\": \"^2.0\"```;\n- указать путь до 1С-Битрикс (`bitrix-dir`) для копирования модулей при установке ```fi1a/installers```.\n\nПример файла composer.json проекта:\n\n```json\n{\n  \"name\": \"fi1a/project\",\n  \"type\": \"project\",\n  \"license\": \"MIT\",\n  \"authors\": [\n    {\n      \"name\": \"Fi1a\",\n      \"email\": \"fi1a@icloud.com\"\n    }\n  ],\n  \"require\": {\n    \"fi1a/installers\": \"^2.0\",\n    \"fi1a/usersettings\": \"^2.0\"\n  },\n  \"extra\": {\n    \"bitrix-dir\": \"../bitrix\"\n  }\n}\n```\n\nЗатем выполняем установку пакетов командой ```composer install```.\n\nЕсли у вас не подключен composer autoload.php, его необходимо подключить в файле local/php_interface/init.php\n\n```php\nrequire_once __DIR__ . '/../vendor/autoload.php';\n```\n\nЕсли модуль не установили через composer, его необходимо установить из админки 1С-Битрикс\n(Marketplace \u003e Установленные решения \u003e модуль \"Пользовательские настройки (fi1a.usersettings)\").\n\n**После установки проверьте права на чтение файлов и папок модуля.**\n\n## Поддержка миграций\n\nНачиная с версии 1.2.0 появилась поддержка миграций модуля [\"Миграции для разработчиков\" (sprint.migration)](https://marketplace.1c-bitrix.ru/solutions/sprint.migration/)\n\nДобавлен хелпер ```\\Fi1a\\UserSettings\\SprintMigration\\Helpers\\UserSettingsHelper``` и билдер ```\\Fi1a\\UserSettings\\SprintMigration\\Builders\\UserSettingsBuilder```\n\nИспользование хелпера:\n\n```php\npublic function up()\n{\n    $helper = $this-\u003egetHelperManager();\n\n    $helper-\u003eUserSettings()-\u003esaveTab(\"TAB\", array (\n        'ACTIVE' =\u003e '1',\n        'CODE' =\u003e 'TAB',\n        'SORT' =\u003e '500',\n        'LOCALIZATION' =\u003e [\n            'ru' =\u003e [\n                'L_NAME' =\u003e 'Вкладка',\n                'L_TITLE' =\u003e 'Вкладка',\n            ],\n            'en' =\u003e [\n                'L_NAME' =\u003e 'Tab',\n                'L_TITLE' =\u003e 'Tab',\n            ],\n        ],\n    ));\n}\n```\n\nСоздание миграции доступно в разделе \"Инструменты\" под пунктом \"Пользовательские настройки\" на странице управления\nмиграциями модуля \"Миграции для разработчиков\" (sprint.migration).\n\n![Билдер модуля миграций](images/fi1a.usersettings-screen-5.png)\n\n## Работа со значениями полей\n\nКласс ```\\Fi1a\\UserSettings\\Option``` предназначен для работы со значениями полей.\nКласс реализует паттерн Singleton и для получения экземпляра класса следует использовать\nметод ```getInstance()```.\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\Option;\n\nLoader::includeModule('fi1a.usersettings');\n\n$option = Option::getInstance();\n```\n\n### Получить значение поля\n\nДля получения значения поля по символьному коду необходимо\nвоспользоваться методом ```get(string $key, $default = null)```.\n\n| Аргумент    | Описание                                               |\n|-------------|--------------------------------------------------------|\n| string $key | Символьный код поля                                    |\n| $default    | Значение, которое вернется при отсутсвии значения в БД |\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\Option;\n\nLoader::includeModule('fi1a.usersettings');\n\n// Вернется значение поля UF_CAPTCHA_SECRET, если значение не задано вернется false\nOption::getInstance()-\u003eget('UF_CAPTCHA_SECRET', false);\n```\nМетод ```getAll(): array``` предназначен для получения значений\nпо всем пользовательским полям.\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\Option;\n\nLoader::includeModule('fi1a.usersettings');\n\n// Вернутся значения по всем пользовательским полям\nOption::getInstance()-\u003egetAll();\n```\n\n### Установить значение поля\n\nДля установки значения поля используется метод ```set(string $key, $value): \\Bitrix\\Main\\Result```.\nВ этом методе реализована валидация значения поля. Метод возвращает экземпляр класса\n```\\Bitrix\\Main\\Result``` и проверить наличие ошибки при установке значения можно\nметодом ```isSuccess()```.\n\n| Аргумент    | Описание            |\n|-------------|---------------------|\n| string $key | Символьный код поля |\n| $value      | Новое значение поля |\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\Option;\n\nLoader::includeModule('fi1a.usersettings');\n\n$option = Option::getInstance();\n\n$result = $option-\u003eset('UF_CAPTCHA_SECRET', 'foo');\nif (!$result-\u003eisSuccess()) {\n    // В случае ошибки\n    echo implode('\u003cbr\u003e', $result-\u003egetErrorMessages());\n\n    return;\n}\n\n// Вернется значение \"foo\" установленное методом \"set\"\n$option-\u003eget('UF_CAPTCHA_SECRET');\n```\n\n### Сбросить кеш значений\n\nПри изменении структуры или установки значения кеш автоматически очищается.\nМетод ```clearCache(): bool``` пригодится для принудительной очистки кеша\nпри изменениях не через API модуля.\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\Option;\n\nLoader::includeModule('fi1a.usersettings');\n\nOption::getInstance()-\u003eclearCache();\n```\n\n## Выборка, добавление, обновление, удаление вкладок\n\nРабота с вкладками реализуется тремя классами:\n\n- ```\\Fi1a\\UserSettings\\TabMapper``` \u0026mdash; маппер вкладок пользовательских настроек;\n- ```\\Fi1a\\UserSettings\\Tab``` \u0026mdash; класс вкладки в пользовательских настройках;\n- ```\\Fi1a\\UserSettings\\TabCollection``` \u0026mdash; коллекция экземпляров классов вкладок пользовательских настроек.\n\nПодробнее на них остановимся ниже.\n\n### Добавление вкладки\n\nКласс вкладки ```\\Fi1a\\UserSettings\\Tab``` является наследником класса\n```\\ArrayObject```. Для начала нужно получить экземпляр класса вкладки используя\nфабричный метод ```create(array $input = []): TabInterface``` передав в него все необходимые\nпарамеры. Данный метод является статичным. После того как мы получили экземпляр\nкласса ```\\Fi1a\\UserSettings\\Tab``` вызовем метод ```add(): AddResult```,\nкоторый вернет результат в виде объкта класса ```\\Bitrix\\Main\\ORM\\Data\\AddResult```.\nУспешность выполнения операции можно проверить методом ```isSuccess($internalCall = false)```\nкласса ```\\Bitrix\\Main\\ORM\\Data\\AddResult```.\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\Tab;\n\nLoader::includeModule('fi1a.usersettings');\n\n$tab = Tab::create([\n    'ACTIVE' =\u003e 1,\n    'CODE' =\u003e 'FORM_OPTIONS',\n    'SORT' =\u003e 500,\n    'LOCALIZATION' =\u003e [\n        'ru' =\u003e [\n            'L_NAME' =\u003e 'Настройки формы',\n            'L_TITLE' =\u003e 'Важные настройки формы',\n        ],\n    ],\n]);\n\n$addResult = $tab-\u003eadd();\nif (!$addResult-\u003eisSuccess()) {\n    echo implode('\u003cbr\u003e', $addResult-\u003egetErrorMessages());\n}\n```\n\nОписание полей:\n\n- ```ACTIVE``` \u0026mdash; активность вкладки. Определяет будет ли выведена вкладка на странице пользовательских настроек;\n- ```CODE``` \u0026mdash; символьный код вкладки;\n- ```SORT``` \u0026mdash; сортировка вкладки. Определяет в какой последовательности будут выведены вкладки на странице пользовательских настроек;\n- ```LOCALIZATION``` \u0026mdash; массив с языковыми сообщениями. Ключем является символьный код языка.\n    - ```L_NAME``` \u0026mdash; название вкладки;\n    - ```L_TITLE``` \u0026mdash; заголовок вкладки.\n    \n### Выборка вкладок\n\nОсновным метод для выборки вкладок является метод\n```getList(array $parameters = []): TabCollectionInterface```\nкласса ```\\Fi1a\\UserSettings\\TabMapper```. Данный метод принимает в качестве аргумента\nмассив аналогичный синтаксису ORM D7. Метод возвращает коллекцию классов вкладок\n```\\Fi1a\\UserSettings\\TabCollection```. При пустом результате выборки\nкласс коллекции вернется с нулевым количеством элементов.\n\n| Аргумент          | Описание          |\n|-------------------|-------------------|\n| array $parameters | Параметры getList |\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\TabMapper;\n\nLoader::includeModule('fi1a.usersettings');\n\n$tabCollection = TabMapper::getList([\n    'filter' =\u003e [\n        'ACTIVE' =\u003e 1,\n    ],\n    'order' =\u003e [\n        'SORT' =\u003e 'ASC',\n    ],\n]);\n\nforeach ($tabCollection as $tab) {\n    // Do something\n}\nunset($tab);\n```\n\nПредыдущий пример можно заменить с использованием метода\n```getActive(array $parameters = []): TabCollectionInterface```. Данный метод\nвыполняет выборку всех активных вкладок с возможностью дополнительной фильтрации или сортировки путем\nпередачи аргумента ```$parameters``` аналогичного ORM D7.\n\n| Аргумент          | Описание          |\n|-------------------|-------------------|\n| array $parameters | Параметры getList |\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\TabMapper;\n\nLoader::includeModule('fi1a.usersettings');\n\n$tabCollection = TabMapper::getActive([\n    'order' =\u003e [\n        'SORT' =\u003e 'ASC',\n    ],\n]);\n\nforeach ($tabCollection as $tab) {\n    // Do something\n}\nunset($tab);\n```\n\nМетод ```getById(int $id)``` осуществляет поиск вкладки по идентификатору. В отличие от\nметодов ```getList(array $parameters = []): TabCollectionInterface``` и ```getActive(array $parameters = []): TabCollectionInterface```\nвозвращает не коллекцию вкладок, а экземпляр класса вкладки ```\\Fi1a\\UserSettings\\Tab```.\nЕсли вкладку не удалось найти по идентификатору, метод вернет значение ```false```.\n\n| Аргумент | Описание              |\n|----------|-----------------------|\n| int $id  | Идентификатор вкладки |\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\TabMapper;\n\nLoader::includeModule('fi1a.usersettings');\n\n$tab = TabMapper::getById(1);\n\nif (false !== $tab) {\n    echo $tab['ID'];\n}\n```\n\n### Обновление вкладки\n\nДля обновления вкладки следует использовать метод ```update(): UpdateResult```\nкласса ```\\Fi1a\\UserSettings\\Tab```,\nкоторый вернет результат в виде объкта класса ```\\Bitrix\\Main\\ORM\\Data\\UpdateResult```.\nУспешность выполнения операции можно проверить методом ```isSuccess($internalCall = false)```\nкласса ```\\Bitrix\\Main\\ORM\\Data\\UpdateResult```.\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\TabMapper;\n\nLoader::includeModule('fi1a.usersettings');\n\n$tab = TabMapper::getById(3);\n\nif (false !== $tab) {\n    $tab['ACTIVE'] = 0;\n\n    $updateResult = $tab-\u003eupdate();\n\n    if (!$updateResult-\u003eisSuccess()) {\n        echo implode('\u003cbr\u003e', $updateResult-\u003egetErrorMessages());\n    }\n}\n```\n\n### Сохранение вкладки\n\nМетод ```save()``` осуществляет добавление или обновление вкладки в зависимости от\nналичия значения ```ID``` (первичного ключа).\n\nОбновление с использованием метода ```save()```\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\TabMapper;\n\nLoader::includeModule('fi1a.usersettings');\n\n$tab = TabMapper::getById(3);\n\nif (false !== $tab) {\n    // Вызов метода обновит вкладку\n    $tab['ACTIVE'] = 1;\n\n    $updateResult = $tab-\u003esave();\n\n    if (!$updateResult-\u003eisSuccess()) {\n        echo implode('\u003cbr\u003e', $updateResult-\u003egetErrorMessages());\n    }\n}\n```\n\nДобавление с использованием метода ```save()```\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\TabMapper;\n\nLoader::includeModule('fi1a.usersettings');\n\n$tab = TabMapper::getById(3);\n\nif (false !== $tab) {\n    // Вызов метода добавит вкладку\n    unset($tab['ID']);\n    $tab['CODE'] = 'NEW_TAB_CODE';\n\n    $addResult = $tab-\u003esave();\n\n    if (!$addResult-\u003eisSuccess()) {\n        echo implode('\u003cbr\u003e', $addResult-\u003egetErrorMessages());\n    }\n}\n```\n\n### Удаление вкладки\n\nДля удаления вкладки следует использовать метод ```delete(): DeleteResult```\nкласса ```\\Fi1a\\UserSettings\\Tab```,\nкоторый вернет результат в виде объкта класса ```\\Bitrix\\Main\\ORM\\Data\\DeleteResult```.\nУспешность выполнения операции можно проверить методом ```isSuccess($internalCall = false)```\nкласса ```\\Bitrix\\Main\\ORM\\Data\\DeleteResult```.\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\TabMapper;\n\nLoader::includeModule('fi1a.usersettings');\n\n$tab = TabMapper::getById(3);\n\n$deleteResult = $tab-\u003edelete();\n\nif (!$deleteResult-\u003eisSuccess()) {\n    echo implode('\u003cbr\u003e', $deleteResult-\u003egetErrorMessages());\n}\n```\n\n## Выборка, добавление, обновление, удаление полей\n\nРабота с полями реализуется тремя классами:\n\n- ```\\Fi1a\\UserSettings\\FieldMapper``` \u0026mdash; маппер полей пользовательских настроек;\n- ```\\Fi1a\\UserSettings\\Field``` \u0026mdash; класс поля пользовательских настройках;\n- ```\\Fi1a\\UserSettings\\FieldCollection``` \u0026mdash; коллекция экземпляров классов полей пользовательских настроек.\n\nПодробнее на них остановимся ниже.\n\n### Добавление поля\n\nКласс поля ```\\Fi1a\\UserSettings\\Field``` является наследником класса\n```\\ArrayObject```. Для начала нужно получить экземпляр класса поля, используя\nфабричный метод ```create(array $input = []): FieldInterface```, передав в него все необходимые\nпарамеры. Данный метод является статичным. После того как мы получили экземпляр\nкласса ```\\Fi1a\\UserSettings\\Field``` вызовем метод ```add(): AddResult```,\nкоторый вернет результат в виде объкта класса ```\\Bitrix\\Main\\ORM\\Data\\AddResult```.\nУспешность выполнения операции можно проверить методом ```isSuccess($internalCall = false)```\nкласса ```\\Bitrix\\Main\\ORM\\Data\\AddResult```.\n\nНиже приведен пример добавления поля с типом строка.\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\Field;\n\nLoader::includeModule('fi1a.usersettings');\n\n$field = Field::create([\n    'ACTIVE' =\u003e '1',\n    'TAB_ID' =\u003e '1',\n    'UF' =\u003e [\n        'FIELD_NAME' =\u003e 'UF_RECAPTCHA_SECRET',\n        'USER_TYPE_ID' =\u003e 'string',\n        'XML_ID' =\u003e '',\n        'SORT' =\u003e '500',\n        'MULTIPLE' =\u003e 'N',\n        'MANDATORY' =\u003e 'N',\n        'SETTINGS' =\u003e [\n            'SIZE' =\u003e 60,\n            'ROWS' =\u003e 1,\n            'REGEXP' =\u003e '',\n            'MIN_LENGTH' =\u003e 0,\n            'MAX_LENGTH' =\u003e 0,\n            'DEFAULT_VALUE' =\u003e '',\n        ],\n        'EDIT_FORM_LABEL' =\u003e ['en' =\u003e '', 'ru' =\u003e 'Приватный ключ reСaptcha v3',],\n        'HELP_MESSAGE' =\u003e ['en' =\u003e '', 'ru' =\u003e 'Используется для reСaptcha v3',],\n    ],\n]);\n\n$addResult = $field-\u003eadd();\n\nif (!$addResult-\u003eisSuccess()) {\n    echo implode('\u003cbr\u003e', $addResult-\u003egetErrorMessages());\n}\n```\n\nОписание полей:\n\n- ```ACTIVE``` \u0026mdash; активность поля. Определяет будет ли выведено поле на странице пользовательских настроек;\n- ```TAB_ID``` \u0026mdash; идентификатор вкладки, которой принадлежит поле;\n- ```UF``` \u0026mdash; массив с настройками пользовательского поля.\n\n### Выборка полей\n\nОсновным методом для выборки полей является\n```getList(array $parameters = []): FieldCollectionInterface```\nкласса ```\\Fi1a\\UserSettings\\FieldMapper```. Данный метод принимает в качестве аргумента\nмассив аналогичный синтаксису ORM D7. Метод возвращает коллекцию классов полей\n```\\Fi1a\\UserSettings\\FieldCollection```. При пустом результате выборки\nкласс коллекции вернется с нулевым количеством элементов.\n\n| Аргумент          | Описание          |\n|-------------------|-------------------|\n| array $parameters | Параметры getList |\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\FieldMapper;\n\nLoader::includeModule('fi1a.usersettings');\n\n$fieldCollection = FieldMapper::getList([\n    'filter' =\u003e [\n        'ACTIVE' =\u003e 1,\n    ],\n    'order' =\u003e [\n        'ID' =\u003e 'DESC',\n    ],\n]);\n\nforeach ($fieldCollection as $field) {\n    // Do something\n}\nunset($field);\n```\n\nПредыдущий пример можно заменить с использованием метода\n```getActive(array $parameters = []): FieldCollectionInterface```. Данный метод\nвыполняет выборку всех активных полей с возможностью дополнительной фильтрации или сортировки путем\nпередачи аргумента ```$parameters``` аналогичного ORM D7.\n\n| Аргумент          | Описание          |\n|-------------------|-------------------|\n| array $parameters | Параметры getList |\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\FieldMapper;\n\nLoader::includeModule('fi1a.usersettings');\n\n$fieldCollection = FieldMapper::getActive([\n    'order' =\u003e [\n        'ID' =\u003e 'DESC',\n    ],\n]);\n\nforeach ($fieldCollection as $field) {\n    // Do something\n}\nunset($field);\n```\n\nМетод ```getById(int $id)``` осуществляет поиск поля по идентификатору (не по идентификатору пользовательского поля).\nВ отличие от методов ```getList(array $parameters = []): FieldCollectionInterface``` и ```getActive(array $parameters = []): IFieldCollection```\nвозвращает не коллекцию полей, а экземпляр класса поля ```\\Fi1a\\UserSettings\\Field```.\nЕсли поле не удалось найти по идентификатору, метод вернет значение ```false```.\n\n| Аргумент | Описание           |\n|----------|--------------------|\n| int $id  | Идентификатор поля |\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\FieldMapper;\n\nLoader::includeModule('fi1a.usersettings');\n\n$field = FieldMapper::getById(2);\n\nif (false !== $field) {\n    echo $field['ID'];\n}\n```\n\nДля выбора всех полей вкладки можно использовать метод ```getByTabId(int $tabId)```.\nМетод вернет коллекцию полей принадлежащих вкладки с идентификатором ```int $tabId```.\n\n| Аргумент   | Описание                   |\n|------------|----------------------------|\n| int $tabId | Идентификатор вкладки поля |\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\FieldMapper;\n\nLoader::includeModule('fi1a.usersettings');\n\n$fieldCollection = FieldMapper::getByTabId(1);\n\nforeach ($fieldCollection as $field) {\n    // Do something\n}\nunset($field);\n```\n\nДля выбора поля по символьному коду можно использовать метод ```getByCode(string $code)```.\nМетод вернет поле с символьным кодом ```string $code``` или false, если поле с символьным кодом не найдено.\n\n\n| Аргумент     | Описание            |\n|--------------|---------------------|\n| string $code | Символьный код поля |\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\FieldMapper;\n\nLoader::includeModule('fi1a.usersettings');\n\n$field = FieldMapper::getByCode('UF_FUS_FIELD');\n\nif (false !== $field) {\n    echo $field['ID'];\n}\n```\n\n### Обновление поля\n\nДля обновления поля следует использовать метод ```update(): UpdateResult```\nкласса ```\\Fi1a\\UserSettings\\Field```,\nкоторый вернет результат в виде объекта класса ```\\Bitrix\\Main\\ORM\\Data\\UpdateResult```.\nУспешность выполнения операции можно проверить методом ```isSuccess($internalCall = false)```\nкласса ```\\Bitrix\\Main\\ORM\\Data\\UpdateResult```.\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\FieldMapper;\n\nLoader::includeModule('fi1a.usersettings');\n\n$field = FieldMapper::getById(3);\n\nif (false !== $field) {\n    $field['ACTIVE'] = 0;\n\n    $updateResult = $field-\u003eupdate();\n\n    if (!$updateResult-\u003eisSuccess()) {\n        echo implode('\u003cbr\u003e', $updateResult-\u003egetErrorMessages());\n    }\n}\n```\n\n### Сохранение поля\n\nМетод ```save()``` осуществляет добавление или обновление поля в зависимости от\nналичия значения ```ID``` (первичного ключа).\n\nОбновление с использованием метода ```save()```\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\FieldMapper;\n\nLoader::includeModule('fi1a.usersettings');\n\n$field = FieldMapper::getById(3);\n\nif (false !== $field) {\n    // Вызов метода обновит поле\n    $field['ACTIVE'] = 1;\n\n    $updateResult = $field-\u003esave();\n\n    if (!$updateResult-\u003eisSuccess()) {\n        echo implode('\u003cbr\u003e', $updateResult-\u003egetErrorMessages());\n    }\n}\n```\n\nДобавление с использованием метода ```save()```\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\FieldMapper;\n\nLoader::includeModule('fi1a.usersettings');\n\n$field = FieldMapper::getById(3);\n\nif (false !== $field) {\n    // Вызов метода добавит поле\n    unset($field['ID']);\n    unset($field['UF_ID']);\n    unset($field['UF']['ID']);\n    $field['UF']['FIELD_NAME'] = 'UF_NEW_FIELD';\n\n    $addResult = $field-\u003esave();\n\n    if (!$addResult-\u003eisSuccess()) {\n        echo implode('\u003cbr\u003e', $addResult-\u003egetErrorMessages());\n    }\n}\n```\n\n### Удаление поля\n\nДля удаления поля следует использовать метод ```delete(): DeleteResult```\nкласса ```\\Fi1a\\UserSettings\\Field```,\nкоторый вернет результат в виде объкта класса ```\\Bitrix\\Main\\ORM\\Data\\DeleteResult```\u003e.\nУспешность выполнения операции можно проверить методом ```isSuccess($internalCall = false)```\nкласса ```\\Bitrix\\Main\\ORM\\Data\\DeleteResult```.\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\FieldMapper;\n\nLoader::includeModule('fi1a.usersettings');\n\n$field = FieldMapper::getById(3);\n\n$deleteResult = $field-\u003edelete();\n\nif (!$deleteResult-\u003eisSuccess()) {\n    echo implode('\u003cbr\u003e', $deleteResult-\u003egetErrorMessages());\n}\n```\n\n## Значения поля типа \"список\"\n\nПолучить значения поля типа \"список\" можно с помощью класса-хелпера ```Fi1a\\UserSettings\\Helpers\\Enums``` метода ```get```\nпередав в качестве аргумента объект поля ```Fi1a\\UserSettings\\FieldInterface``` типа \"список\".\n\n```php\nuse \\Bitrix\\Main\\Loader;\nuse \\Fi1a\\UserSettings\\FieldMapper;\nuse \\Fi1a\\UserSettings\\Helpers\\Enums;\n\nLoader::includeModule('fi1a.usersettings');\n\n$field = FieldMapper::getById(3);\n$enums = Enums::get($field);\n```\n\n## События модуля\n\nВ модуле предусмотрены события, которые позволяют модифицировать данные или расширить функционал модуля.\nПример использования событий:\n\n```php\nuse \\Bitrix\\Main\\Event;\nuse \\Bitrix\\Main\\Loader;\nuse \\Bitrix\\Main\\EventManager;\nuse \\Bitrix\\Main\\EventResult;\nuse \\Fi1a\\UserSettings\\Option;\n\nLoader::includeModule('fi1a.usersettings');\n\nEventManager::getInstance()-\u003eaddEventHandler(\n    'fi1a.usersettings',\n    'OnOptionGet',\n    function (Event $event) {\n        return new EventResult(\n            EventResult::SUCCESS,\n            [\n                'default' =\u003e 'new default value',\n            ]\n        );\n    }\n);\n\n// Если поле имеет значение null или false, вместо 'foo' вернется значение 'new default value'\nOption::getInstance()-\u003eget('UF_RECAPCHA_SECRET', 'foo');\n```\n### События связанные со значениями полей\n\n- ```OnOptionGet``` \u0026mdash; вызывается ДО возврата значения поля методом ```get(string $key, $default = null)``` класса ```\\Fi1a\\UserSettings\\Option```;\n- ```OnBeforeOptionSet``` \u0026mdash; вызывается ДО установки значения поля методом ```set(string $key, $value): Result``` класса ```\\Fi1a\\UserSettings\\Option```;\n- ```OnAfterOptionSet``` \u0026mdash; вызывается ПОСЛЕ установки значения поля методом ```set(string $key, $value): Result``` класса ```\\Fi1a\\UserSettings\\Option```.\n\n\n### События связанные с вкладками\n\n- ```OnBeforeTabAdd``` \u0026mdash; вызывается ДО добавления новой вкладки методом ```add(): AddResult``` класса ```\\Fi1a\\UserSettings\\Tab```;\n- ```OnAfterTabAdd``` \u0026mdash; вызывается ПОСЛЕ добавления новой вкладки методом ```add(): AddResult``` класса ```\\Fi1a\\UserSettings\\Tab```;\n- ```OnBeforeTabUpdate``` \u0026mdash; вызывается ДО обновления вкладки методом ```update(): UpdateResult``` класса ```\\Fi1a\\UserSettings\\Tab```;\n- ```OnAfterTabUpdate``` \u0026mdash; вызывается ПОСЛЕ обновления вкладки методом ```update(): UpdateResult``` класса ```\\Fi1a\\UserSettings\\Tab```;\n- ```OnBeforeTabDelete``` \u0026mdash; вызывается ДО удаления вкладки методом ```delete(): DeleteResult``` класса ```\\Fi1a\\UserSettings\\Tab```;\n- ```OnAfterTabDelete``` \u0026mdash; вызывается ПОСЛЕ удаления вкладки методом ```delete(): DeleteResult``` класса ```\\Fi1a\\UserSettings\\Tab```.\n\n### События связанные с полями\n\n- ```OnBeforeFieldAdd``` \u0026mdash; вызывается ДО добавления нового поля методом ```add(): AddResult``` класса ```\\Fi1a\\UserSettings\\Field```;\n- ```OnAfterFieldAdd``` \u0026mdash; вызывается ПОСЛЕ добавления нового поля методом ```add(): AddResult``` класса ```\\Fi1a\\UserSettings\\Field```;\n- ```OnBeforeFieldUpdate``` \u0026mdash; вызывается ДО обновления поля методом ```update(): UpdateResult``` класса ```\\Fi1a\\UserSettings\\Field```;\n- ```OnAfterFieldUpdate``` \u0026mdash; вызывается ПОСЛЕ обновления поля методом ```update(): UpdateResult``` класса ```\\Fi1a\\UserSettings\\Field```;\n- ```OnBeforeFieldDelete``` \u0026mdash; вызывается ДО удаления поля методом ```delete(): DeleteResult``` класса ```\\Fi1a\\UserSettings\\Field```;\n- ```OnAfterFieldDelete``` \u0026mdash; вызывается ПОСЛЕ удаления поля методом ```delete(): DeleteResult``` класса ```\\Fi1a\\UserSettings\\Field```.\n\n[badge-release]: https://img.shields.io/packagist/v/fi1a/usersettings?label=release\n[badge-license]: https://img.shields.io/github/license/fi1a/usersettings?style=flat-square\n[badge-php]: https://img.shields.io/packagist/php-v/fi1a/usersettings?style=flat-square\n[badge-downloads]: https://img.shields.io/packagist/dt/fi1a/usersettings.svg?style=flat-square\u0026colorB=mediumvioletred\n[badge-mail]: https://img.shields.io/badge/mail-support%40fi1a.ru-brightgreen\n\n[packagist]: https://packagist.org/packages/fi1a/usersettings\n[license]: https://github.com/fi1a/usersettings/blob/master/LICENSE\n[php]: https://php.net\n[downloads]: https://packagist.org/packages/fi1a/usersettings\n[mail]: mailto:support@fi1a.ru","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffi1a%2Fusersettings","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffi1a%2Fusersettings","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffi1a%2Fusersettings/lists"}