├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── assets
├── bitrix24-logo-social.png
└── bitrix24-logo.png
├── composer.json
└── src
└── App
└── Bitrix24
├── Activity.php
├── Bitrix24API.php
├── Bitrix24APIException.php
├── Catalog.php
├── Company.php
├── Contact.php
├── Deal.php
├── Disk.php
├── Lead.php
├── Product.php
├── ProductRow.php
├── ProductSection.php
├── Task.php
└── User.php
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea/
2 | examples/
3 | logs/
4 |
5 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019-2022 andrey-tech
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Bitrix24 API PHP Wrapper
2 |
3 | 
4 |
5 | [](https://packagist.org/packages/andrey-tech/bitrix24-api-php)
6 | [](https://packagist.org/packages/andrey-tech/bitrix24-api-php)
7 | [](https://github.com/andrey-tech/bitrix24-api-php/stargazers)
8 | [](https://github.com/andrey-tech/bitrix24-api-php/network)
9 | [](https://github.com/andrey-tech/bitrix24-api-php/watchers)
10 | [](https://packagist.org/packages/andrey-tech/bitrix24-api-php)
11 |
12 | Обертка на PHP7+ для работы с [REST API Битрикс24](https://dev.1c-bitrix.ru/rest_help/) с использованием механизма [входящих вебхуков](https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=99&LESSON_ID=8581),
13 | троттлингом запросов и логированием в файл.
14 |
15 | Разработчики на JavaScript могут воспользоваться классом-оберткой [andrey-tech/bx24-wrapper-js](https://github.com/andrey-tech/bx24-wrapper-js).
16 |
17 | # Содержание
18 |
19 |
20 |
21 | - [Требования](#%D0%A2%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
22 | - [Установка](#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0)
23 | - [Класс `Bitrix24API`](#%D0%9A%D0%BB%D0%B0%D1%81%D1%81-bitrix24api)
24 | - [Базовые методы класса](#%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0)
25 | - [Дополнительные параметры](#%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B)
26 | - [Методы для работы с сущностями Битрикс24](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%81%D1%83%D1%89%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8-%D0%91%D0%B8%D1%82%D1%80%D0%B8%D0%BA%D1%8124)
27 | - [Методы работы со сделками](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81%D0%BE-%D1%81%D0%B4%D0%B5%D0%BB%D0%BA%D0%B0%D0%BC%D0%B8)
28 | - [Методы для работы с контактами](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BA%D0%BE%D0%BD%D1%82%D0%B0%D0%BA%D1%82%D0%B0%D0%BC%D0%B8)
29 | - [Методы для работы с компаниями](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8)
30 | - [Методы для работы с каталогами](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0%D0%BC%D0%B8)
31 | - [Методы для работы с товарами](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D0%BC%D0%B8)
32 | - [Методы работы с разделами товаров](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B0%D0%BC%D0%B8-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2)
33 | - [Методы работы с товарными позициями](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BD%D1%8B%D0%BC%D0%B8-%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8F%D0%BC%D0%B8)
34 | - [Методы для работы с пользователями](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%D0%BC%D0%B8)
35 | - [Методы работы с задачами](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%D0%BC%D0%B8)
36 | - [Методы для работы с делами](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%B4%D0%B5%D0%BB%D0%B0%D0%BC%D0%B8)
37 | - [Методы для работы с диском](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%B4%D0%B8%D1%81%D0%BA%D0%BE%D0%BC)
38 | - [Методы для работы с лидами](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BB%D0%B8%D0%B4%D0%B0%D0%BC%D0%B8)
39 | - [Вспомогательные классы](#%D0%92%D1%81%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B)
40 | - [Класс `HTTP`](#%D0%9A%D0%BB%D0%B0%D1%81%D1%81-http)
41 | - [Дополнительные параметры](#%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B-1)
42 | - [Примеры](#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B)
43 | - [Класс `DebugLogger`](#%D0%9A%D0%BB%D0%B0%D1%81%D1%81-debuglogger)
44 | - [Методы класса](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0)
45 | - [Дополнительные параметры](#%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B-2)
46 | - [Примеры](#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B-1)
47 | - [Формат заголовков лога](#%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D1%82-%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%BE%D0%B2-%D0%BB%D0%BE%D0%B3%D0%B0)
48 | - [Автор](#%D0%90%D0%B2%D1%82%D0%BE%D1%80)
49 | - [Лицензия](#%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F)
50 |
51 |
52 |
53 |
54 | ## Требования
55 |
56 | - PHP >= 7.0;
57 | - класс [`HTTP`](https://github.com/andrey-tech/http-client-php) >= 3.0 - НТТР(S) клиент с троттлингом запросов, поддержкой маркера BOM в теле сообщения формата JSON и выводом отладочной информации о запросах и ответах в STDOUT;
58 | - класс [`DebugLogger`](https://github.com/andrey-tech/debug-logger-php) >= 2.0 - логгер, сохраняющий отладочную информацию в файл вместе с данными об объеме используемой оперативной памяти и прошедшем времени;
59 | - произвольный автозагрузчик классов, реализующий стандарт [PSR-4](https://www.php-fig.org/psr/psr-4/), необходимый в том случае, если не используется Composer.
60 |
61 |
62 |
63 | ## Установка
64 |
65 | Установка через composer:
66 | ```
67 | $ composer require andrey-tech/bitrix24-api-php:"^1.6"
68 | ```
69 |
70 | или добавить
71 |
72 | ```
73 | "andrey-tech/bitrix24-api-php": "^1.6"
74 | ```
75 |
76 | в секцию require файла composer.json.
77 |
78 |
79 | ## Класс `Bitrix24API`
80 |
81 | Для работы с REST API Битрикс24 используется класс `\App\Bitrix24\Bitrix24API`.
82 | При возникновении ошибок выбрасывается исключение класса `\App\Bitrix24\Bitrix24APIException`.
83 | В настоящее время в классе реализованы методы для работы со следующими сущностями Битрикс24:
84 |
85 | - [Сделки](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81%D0%BE-%D1%81%D0%B4%D0%B5%D0%BB%D0%BA%D0%B0%D0%BC%D0%B8)
86 | - [Контакты](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BA%D0%BE%D0%BD%D1%82%D0%B0%D0%BA%D1%82%D0%B0%D0%BC%D0%B8)
87 | - [Компании](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8)
88 | - [Каталоги товаров](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0%D0%BC%D0%B8)
89 | - [Товары](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D0%BC%D0%B8)
90 | - [Разделы товаров](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B0%D0%BC%D0%B8-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2)
91 | - [Товарные позиции](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BD%D1%8B%D0%BC%D0%B8-%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8F%D0%BC%D0%B8)
92 | - [Задачи](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%D0%BC%D0%B8)
93 | - [Дела](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%B4%D0%B5%D0%BB%D0%B0%D0%BC%D0%B8)
94 | - [Пользователи](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%D0%BC%D0%B8)
95 | - [Диск](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%B4%D0%B8%D1%81%D0%BA%D0%BE%D0%BC)
96 | - [Лиды](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BB%D0%B8%D0%B4%D0%B0%D0%BC%D0%B8)
97 |
98 |
99 | ### Базовые методы класса
100 |
101 | Базовые методы находятся в классе `\App\Bitrix24\Bitrix24API`:
102 |
103 | - `__construct(string $webhookURL)` Конструктор класса.
104 | - `request(string $function, array $params = []) :?array` Отправляет запрос в API.
105 | - `getList(string $function, array $params = []) :\Generator` Загружает все сущности заданного типа.
106 | - `fetchList(string $function, array $params = []) :\Generator` Загружает все сущности [быстрым методом](https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php).
107 | - `batchRequest(array $commands, $halt = true) :array` Отправляет пакет запросов в API.
108 | - `buildCommands(string $function, array $items) :array` Создает массив команд для пакетного запроса.
109 | - `buildCommand(string $function, array $params) :string` Возвращает команду для пакетного запроса.
110 | - `getLastResponse() :?array` Возвращает последний ответ от API.
111 | - `setLogger($logger)` Устанавливает объект класса, выполняющего логирование отладочной информации в файл.
112 |
113 | Параметры методов:
114 |
115 | + `$webhookURL` - URL входящего вебхука;
116 | + `$function` - имя метода (функции) запроса;
117 | + `$params` - параметры запроса;
118 | + `$commands` - пакет команд;
119 | + `$items` - массив полей запросов;
120 | + `$halt` - прерывать последовательность запросов в случае ошибки;
121 | + `$logger` - объект класса, реализующего интерфейс `\App\DebugLogger\DebugLoggerInterface`.
122 |
123 |
124 | ### Дополнительные параметры
125 |
126 | Дополнительные параметры настройки доступны через публичные статические и нестатические свойства класса `\App\Bitrix24\Bitrix24API`:
127 |
128 | Нестатическое свойство | По умолчанию | Описание
129 | ----------------------- | ------------------ | --------
130 | `$batchSize` | 50 | Устанавливает количество команд в одном пакете запросов (batch)
131 | `$logger` | null | Хранит объект класса `\App\DebugLogger\DebugLogger`, выполняющего логирование запросов и ответов к API в файл. Если null, то логирование не выполняется.
132 | `$http` | `\App\HTTP\HTTP` | Хранит объект класса `\App\HTTP\HTTP`, отправляющего запросы к API
133 |
134 | Статическое свойство | По умолчанию | Описание
135 | ----------------------- | -------------------- | --------
136 | `$WITH_CONTACTS` | 'CONTACTS' | Имя поля для массива возвращаемых связанных сущностей типа контакт
137 | `$WITH_COMPANIES` | 'COMPANIES' | Имя поля для массива возвращаемых связанных сущностей типа компания
138 | `$WITH_PRODUCTS` | 'PRODUCTS' | Имя поля для массива возвращаемых связанных сущностей типа товар
139 |
140 |
141 | ## Методы для работы с сущностями Битрикс24
142 |
143 |
144 | ### Методы работы со сделками
145 |
146 | Методы для работы со сделками находятся в трейте `\App\Bitrix24\Deal`:
147 |
148 | - `getDeal($dealId, array $with = []) :array` Возвращает сделку по ее ID.
149 | - `addDeal(array $fields = [], array $params = []) :int` Добавляет сделку и возвращает ее ID.
150 | - `updateDeal($dealId, array $fields = [], array $params = []) :int` Обновляет сделку и возвращает ее ID.
151 | - `deleteDeal($dealId) :int` Удаляет сделку и возвращает ее ID.
152 | - `getDealList(array $filter = [], array $select = [], array $order = []) :\Generator`
153 | Загружает все сделки с возможностью фильтрации, сортировки и выборки полей.
154 | - `fetchDealList(array $filter = [], array $select = [], array $order = []) :\Generator`
155 | Загружает все сделки с возможностью фильтрации, сортировки и выборки полей.
156 | Реализует [быстрый метод](https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php) загрузки при работе с большими объемами данных.
157 | - `addDeals(array $deals = [], array $params = []) :array`
158 | Пакетно добавляет сделки со связанными товарными позициями, возвращает массив ID сделок.
159 | - `updateDeals(array $deals = [], array $params = []) :array`
160 | Пакетно обновляет сделки со связанными товарными позициями, возвращает массив ID сделок.
161 | - `deleteDeals(array $dealIds = []) :array` Пакетно удаляет сделки, возвращает массив ID сделок.
162 | - `setDealFile($dealId, $userFieldId, string $fileName, string $fileContent, bool $isBase64FileData = true) :int`
163 | Устанавливает файл в НЕ множественное пользовательское поле типа файл (файл нельзя удалить) и возвращает ID сделки.
164 | - `setDealFiles($dealId, $userFieldId, array $files = [], bool $isBase64FileData = true) :int`
165 | Устанавливает файлы во множественное пользовательское поле типа файл (файлы можно удалить) и возвращает ID сделки.
166 | - `getDealContactItems($dealId) :array` Возвращает массив параметров контактов, связанных со сделкой.
167 | - `setDealContactItems($dealId, array $contacts) :array` Устанавливает контакты, связанные со сделкой.
168 | - `setDealProductRows($dealId, array $products) :array` Устанавливает товарные позиции, связанные со сделкой.
169 | - `getDealProductRows($dealId) :array` Возвращает массив параметров товарных позиций, связанных со сделкой.
170 | - `getDealFields() :array` Возвращает описание полей сделки, в том числе пользовательских.
171 |
172 | Параметры методов:
173 |
174 | + `$dealId` - ID сделки;
175 | + `$dealIds` - массив ID сделок;
176 | + `$with` - имена связанных сущностей, возвращаемых вместе со сделкой:
177 | * `\App\Bitrix24\Bitrix24API::$WITH_CONTACTS` - контакты (возвращаются в виде массива в поле с именем, заданным публичным статическим свойством `Bitrix24API::$WITH_CONTACTS`);
178 | * `\App\Bitrix24\Bitrix24API::$WITH_PRODUCTS` - товарные позиции (возвращаются в виде массива в поле с именем, заданным публичным статическим свойством `Bitrix24API::$PRODUCTS`);
179 | - `$fields` - набор полей сделки;
180 | - `$params` - набор параметров сделки;
181 | - `$filter` - параметры фильтрации;
182 | - `$order` - параметры сортировки;
183 | - `$select` - параметры выборки полей;
184 | - `$userFieldId` ID НЕ множественного пользовательского поля в сделке ('UF_CRM_XXXXXXXXXX');
185 | - `$files` - массив параметров файлов ([ [ < Имя файла >, < RAW данные файла > ], ... ]) (пустой массив для удаления всех файлов);
186 | - `$isBase64FileData` - RAW данные файла закодированы в BASE64?;
187 | - `$contacts` - массив параметров контактов;
188 | - `$products` - массив параметров товарных позиций.
189 |
190 | ```php
191 | use App\Bitrix24\Bitrix24API;
192 | use App\Bitrix24\Bitrix24APIException;
193 |
194 | try {
195 |
196 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
197 | $bx24 = new Bitrix24API($webhookURL);
198 |
199 | // Добавляем новую сделку
200 | $dealId = $bx24->addDeal([
201 | 'TITLE' => 'Новая сделка №1',
202 | 'COMPANY_ID' => 6,
203 | 'CONTACT_ID' => 312
204 | ]);
205 | print_r($dealId);
206 |
207 | // Устанавливаем набор связанных контактов
208 | $bx24->setDealContactItems($dealId, [
209 | [ 'CONTACT_ID' => 313 ],
210 | [ 'CONTACT_ID' => 454 ]
211 | ]);
212 |
213 | // Устанавливаем набор связанных товарных позиций
214 | $bx24->setDealProductRows($dealId, [
215 | [ 'PRODUCT_ID' => 1689, 'PRICE' => 1500.00, 'QUANTITY' => 2 ],
216 | [ 'PRODUCT_ID' => 1860, 'PRICE' => 500.00, 'QUANTITY' => 15 ]
217 | ]);
218 |
219 | // Обновляем существующую сделку
220 | $bx24->updateDeal($dealId, [
221 | 'TITLE' => 'Новая сделка №12'
222 | ]);
223 |
224 |
225 | // При необходимости, изменяем значение по умолчанию 'PRODUCTS' на '_PRODUCTS' для имени поля
226 | // со списком товарных позиций, возвращаемых вместе со сделкой
227 | Bitrix24API::$WITH_PRODUCTS = '_PRODUCTS';
228 |
229 | // Загружаем сделку по ID вместе со связанными товарами и контактами одним запросом
230 | $deal = $bx24->getDeal($dealId, [ Bitrix24API::$WITH_PRODUCTS, Bitrix24API::$WITH_CONTACTS ]);
231 | print_r($deal);
232 |
233 | // Удаляем существующую сделку
234 | $bx24->deleteDeal($dealId);
235 |
236 | // Загружаем все сделки используя быстрый метод при работе с большими объемами данных
237 | $generator = $bx24->fetchDealList();
238 | foreach ($generator as $deals) {
239 | foreach($deals as $deal) {
240 | print_r($deal);
241 | }
242 | }
243 |
244 | // Пакетно добавляем сделки вместе с товарными позициями
245 | $dealIds = $bx24->addDeals([
246 | [
247 | 'TITLE' => 'Новая сделка №1121',
248 | 'COMPANY_ID' => 6,
249 | 'CONTACT_ID' => 312,
250 | 'PRODUCTS' => [
251 | [ "PRODUCT_ID" => 27, "PRICE" => 100.00, "QUANTITY" => 11 ],
252 | ]
253 |
254 | ],
255 | [
256 | 'TITLE' => 'Новая сделка №1122',
257 | 'COMPANY_ID' => 6,
258 | 'PRODUCTS' => [
259 | [ "PRODUCT_ID" => 28, "PRICE" => 200.00, "QUANTITY" => 22 ],
260 | [ "PRODUCT_ID" => 27, "PRICE" => 200.00, "QUANTITY" => 11 ],
261 | ]
262 | ]
263 | ]);
264 | print_r($dealIds);
265 |
266 | // Пакетно удаляем сделки
267 | $bx24->deleteDeals($dealIds);
268 |
269 | } catch (Bitrix24APIException $e) {
270 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
271 | } catch (Exception $e) {
272 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
273 | }
274 | ```
275 |
276 |
277 | ### Методы для работы с контактами
278 |
279 | Методы для работы с контактами находятся в трейте `\App\Bitrix24\Contact`:
280 |
281 | - `getContact($contactId, array $with = []) :array` Возвращает контакт по его ID.
282 | - `addContact(array $fields = [], array $params = []) :int` Добавляет контакт и возвращает его ID.
283 | - `updateContact($contactId, array $fields = [], array $params = []) :int` Обновляет контакт и возвращает его ID.
284 | - `deleteContact($contactId) :int` Удаляет контакт и возвращает его ID.
285 | - `getContactList(array $filter = [], array $select = [], array $order = []) :\Generator`
286 | Загружает все контакты с возможностью фильтрации, сортировки и выборки полей.
287 | - `fetchContactList(array $filter = [], array $select = [], array $order = []) :\Generator`
288 | Загружает все контакты с возможностью фильтрации, сортировки и выборки полей.
289 | Реализует [быстрый метод](https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php) загрузки при работе с большими объемами данных.
290 | - `getContactsByPhone(int|string $phone, $select = []) :array` Возвращает контакты по номеру телефона.
291 | - `addContacts(array $contacts = [], array $params = []) :array` Пакетно добавляет контакты.
292 | - `updateContacts(array $contacts = [], array $params = []) :array` Пакетно обновляет контакты.
293 | - `deleteContacts(array $contactIds = []) :array` Пакетно удаляет контакты.
294 | - `getContactCompanyItems($contactId) :array` Возвращает компании, связанные с контактом по ID.
295 | - `setContactCompanyItems($contactId, array $companies) :array` Устанавливает компании, связанные с контактом по ID.
296 | - `getContactFields() :array` Возвращает описание полей контакта.
297 |
298 | Параметры методов:
299 |
300 | + `$contaxctId` - ID контакта;
301 | + `$contactIds` - массив ID сделок;
302 | + `$phone` - номер телефона;
303 | + `$with` - имена связанных сущностей, возвращаемых вместе с контактом:
304 | * `\App\Bitrix24\Bitrix24API::$WITH_COMPANIES` - компании (возвращаются в виде массива в поле с именем, заданным публичным статическим свойством `Bitrix24API::$WITH_COMPANIES`);
305 | - `$fields` - набор полей сделки;
306 | - `$params` - набор параметров сделки;
307 | - `$filter` - параметры фильтрации;
308 | - `$order` - параметры сортировки;
309 | - `$select` - параметры выборки полей;
310 | - `$contacts` - массив параметров контактов;
311 | - `$companies` - массив параметров компаний.
312 |
313 | ```php
314 | use App\Bitrix24\Bitrix24API;
315 | use App\Bitrix24\Bitrix24APIException;
316 |
317 | try {
318 |
319 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
320 | $bx24 = new Bitrix24API($webhookURL);
321 |
322 | // Добавляем новый контакт
323 | $contactId = $bx24->addContact([
324 | 'NAME' => 'Иван',
325 | 'COMPANY_ID' => 332,
326 | 'SECOND_NAME' => 'Васильевич',
327 | 'LAST_NAME' => 'Петров'
328 | ]);
329 | print_r($contactId);
330 |
331 | // Устанавливаем набор связанных компаний
332 | $bx24->setContactCompanyItems($contactId, [
333 | [ 'COMPANY_ID' => 8483 ],
334 | [ 'CONPANY_ID' => 4094 ]
335 | ]);
336 |
337 | // Обновляем существующий контакт
338 | $bx24->updateContact($contactId, [
339 | 'NAME' => 'Фёдор'
340 | ]);
341 |
342 | // Загружаем контакт по ID вместе со связанными компаниями
343 | $contact = $bx24->getContact($contactId, [ Bitrix24API::$WITH_COMPANIES ]);
344 | print_r($contact);
345 |
346 | // Удаляем существующий контакт
347 | $bx24->deleteContact($contactId);
348 |
349 | // Загружаем все контакты используя быстрый метод при работе с большими объемами данных
350 | $generator = $bx24->fetchContactList();
351 | foreach ($generator as $contacts) {
352 | foreach($contacts as $contact) {
353 | print_r($contact);
354 | }
355 | }
356 |
357 | // Пакетно добавляем контакты
358 | $contactIds = $bx24->addContacts([
359 | [
360 | 'NAME' => 'Владимир',
361 | 'COMPANY_ID' => 3322,
362 | 'SECOND_NAME' => 'Вадимович',
363 | 'LAST_NAME' => 'Владимиров'
364 | ],
365 | [
366 | 'NAME' => 'Андрей',
367 | 'COMPANY_ID' => 1332,
368 | 'SECOND_NAME' => 'Васильевич',
369 | 'LAST_NAME' => 'Иванов'
370 | ]
371 | ]);
372 | print_r($contactIds);
373 |
374 | // Пакетно удаляем контакты
375 | $bx24->deleteContacts($contactIds);
376 |
377 | } catch (Bitrix24APIException $e) {
378 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
379 | } catch (Exception $e) {
380 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
381 | }
382 | ```
383 |
384 |
385 | ### Методы для работы с компаниями
386 |
387 | Методы для работы с компаниями находятся в трейте `\App\Bitrix24\Company`:
388 |
389 | - `getCompany($companyId, array $with = [])` Возвращает компанию по ID.
390 | - `addCompany(array $fields = [], array $params = []) :int` Добавляет компанию и возвращает ее ID.
391 | - `updateCompany($companyId, array $fields = [], array $params = []) :int` Обновляет компанию и возвращает ее ID.
392 | - `deleteCompany($companyId) :int` Удаляет компанию и возвращает ее ID.
393 | - `getCompanyList(array $filter = [], array $select = [], array $order = []) :\Generator`
394 | Загружает все компании с возможностью фильтрации, сортировки и выборки полей.
395 | - `fetchCompanyList(array $filter = [], array $select = [], array $order = []) :\Generator`
396 | Загружает все компании с возможностью фильтрации, сортировки и выборки полей.
397 | Реализует [быстрый метод](https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php) загрузки при работе с большими объемами данных.
398 | - `addCompanies(array $companies = [], array $params = []) :array` Пакетно добавляет компании.
399 | - `updateCompanies(array $companies = [], array $params = []) :array` Пакетно обновляет компании.
400 | - `deleteCompanies(array $companyIds = []) :array` Пакетно удаляет компании.
401 | - `getCompanyContactItems($companyId) :array` Возвращает контакты, связанные с компанией.
402 | - `setCompanyContactItems($companyId, array $contacts) :array` Устанавливает контакты, связанные с компанией.
403 |
404 | Параметры методов:
405 |
406 | - `$companyId` - ID компании;
407 | - `$companyIds` - массив ID компаний;
408 | + `$with` - имена связанных сущностей, возвращаемых вместе с компанией:
409 | * `\App\Bitrix24\Bitrix24API::$WITH_CONTACTS` - контакты (возвращаются в виде массива в поле с именем, заданным публичным статическим свойством `Bitrix24API::$WITH_CONTACTS`);
410 | + `$filter` - параметры фильтрации;
411 | + `$order` - параметры сортировки;
412 | + `$select` - параметры выборки полей;
413 | - `$contacts` - массив параметров контактов;
414 | - `$companies` - массив параметров компаний.
415 |
416 | ```php
417 | use App\Bitrix24\Bitrix24API;
418 | use App\Bitrix24\Bitrix24APIException;
419 |
420 | try {
421 |
422 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
423 | $bx24 = new Bitrix24API($webhookURL);
424 |
425 | // Добавляем новую компанию
426 | $companyId = $bx24->addCompany([
427 | 'TITLE' => 'OOO Рога и Копыта'
428 | ]);
429 | print_r($companyId);
430 |
431 | // Устанавливаем набор связанных контактов
432 | $bx24->setCompanyContactItems($companyId, [
433 | [ 'CONTACT_ID' => 4838 ],
434 | [ 'CONTACT_ID' => 8583 ]
435 | ]);
436 |
437 | // Обновляем существующую компанию
438 | $bx24->updateCompany($companyId, [
439 | 'TITLE' => 'ИП Рога и Копыта'
440 | ]);
441 |
442 | // Загружаем компанию по ID вместе со связанными контактами
443 | $company = $bx24->getCompany($companyId, [ Bitrix24API::$WITH_CONTACTS ]);
444 | print_r($company);
445 |
446 | // Удаляем существующую компанию
447 | $bx24->deleteCompany($companyId);
448 |
449 | // Загружаем все компании используя быстрый метод при работе с большими объемами данных
450 | $generator = $bx24->fetchCompanyList();
451 | foreach ($generator as $companies) {
452 | foreach($companies as $company) {
453 | print_r($company);
454 | }
455 | }
456 |
457 | // Пакетно добавляем компании
458 | $companyIds = $bx24->addCompanies([
459 | [ 'TITLE' => 'ПАО Абракадабра' ],
460 | [ 'TITLE' => 'ЗАО Моя компания' ]
461 | ]);
462 | print_r($companyIds);
463 |
464 | // Пакетно удаляем компании
465 | $bx24->deleteCompanies($companyIds);
466 |
467 | } catch (Bitrix24APIException $e) {
468 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
469 | } catch (Exception $e) {
470 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
471 | }
472 | ```
473 |
474 |
475 | ### Методы для работы с каталогами
476 |
477 | Методы для работы с товарными каталогами находятся в трейте `\App\Bitrix24\Catalog`:
478 |
479 | - `getCatalogList(array $filter = [], array $select = [], array $order = []) :\Generator`
480 | Загружает все каталоги с возможностью фильтрации, сортировки и выборки полей.
481 | - `fetchCatalogList(array $filter = [], array $select = [], array $order = []) :\Generator`
482 | Загружает все каталоги с возможностью фильтрации, сортировки и выборки полей.
483 | Реализует [быстрый метод](https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php) загрузки при работе с большими объемами данных.
484 | - `getCatalogFields() :array` Возвращает описание полей каталога товаров.
485 |
486 | Параметры методов:
487 |
488 | + `$filter` - параметры фильтрации;
489 | + `$order` - параметры сортировки;
490 | + `$select` - параметры выборки полей.
491 |
492 | ```php
493 | use App\Bitrix24\Bitrix24API;
494 | use App\Bitrix24\Bitrix24APIException;
495 |
496 | try {
497 |
498 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
499 | $bx24 = new Bitrix24API($webhookURL);
500 |
501 | // Загружаем все товарные каталоги используя быстрый метод при работе с большими объемами данных
502 | $generator = $bx24->fetchCatalogList();
503 | foreach ($generator as $catalogs) {
504 | foreach($catalogs as $catalog) {
505 | print_r($catalog);
506 | }
507 | }
508 |
509 | } catch (Bitrix24APIException $e) {
510 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
511 | } catch (Exception $e) {
512 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
513 | }
514 | ```
515 |
516 |
517 | ### Методы для работы с товарами
518 |
519 | Методы для работы с товарами находятся в трейте `\App\Bitrix24\Product`:
520 |
521 | - `getProduct($productId) :array` Возвращает товар по ID.
522 | - `addProduct(array $fields = []) :int` Добавляет товар и возвращает его ID.
523 | - `updateProduct($productId, array $fields = []) :int` Обовляет товар и возвращает его ID.
524 | - `deleteProduct($productId) :int` Удаляет товар и возвращает его ID.
525 | - `getProductList(array $filter = [], array $select = [ '*', 'PROPERTY_*' ], array $order = []) :\Generator`
526 | Загружает все товары с возможностью фильтрации, сортировки и выборки полей.
527 | - `fetchProductList(array $filter = [], array $select = [ '*', 'PROPERTY_*' ], array $order = []) :\Generator`
528 | Загружает все товары с возможностью фильтрации, сортировки и выборки полей.
529 | Реализует [быстрый метод](https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php) загрузки при работе с большими объемами данных.
530 | - `addProducts(array $products = []) :array` Пакетно добавляет товары.
531 | - `updateProducts(array $products = []) :array` Пакетно обновляет товары.
532 | - `deleteProducts(array $productIds = []) :array` Пакетно удаляет товары.
533 | - `getProductFields() :array` Возвращает описание полей товара, в том числе пользовательских.
534 |
535 | Параметры методов:
536 |
537 | + `$productId` - ID товара.
538 | + `$productIds` - массив ID товаров.
539 | + `$fields` - набор полей товара.
540 | + `$filter` - параметры фильтрации;
541 | + `$select` - параметры выборки полей;
542 | + `$order` - параметры сортировки.
543 | + `$products` - массив наборов полей товара.
544 |
545 | ```php
546 | use App\Bitrix24\Bitrix24API;
547 | use App\Bitrix24\Bitrix24APIException;
548 |
549 | try {
550 |
551 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
552 | $bx24 = new Bitrix24API($webhookURL);
553 |
554 | // Получаем товар по его ID
555 | $product = $bx24->getProduct(2396);
556 | print_r($product);
557 |
558 | // Обновляем товар
559 | $bx24->updateProduct(2396, [
560 | "PRICE" => 4900
561 | ]);
562 |
563 | // Удаляем товар
564 | $bx24->deleteProduct(2396);
565 |
566 | // Загружаем все товары c фильтрацией по полю SECTION_ID
567 | $generator = $bx24->fetchProductList([ 'SECTION_ID' => 13 ]);
568 | foreach ($generator as $users) {
569 | foreach($users as $user) {
570 | print_r($user);
571 | }
572 | }
573 |
574 | // Пакетно обновляем товары
575 | $bx24->updateProducts([
576 | [
577 | "ID" => 27,
578 | "NAME" => "Тестовый товар 11",
579 | "CURRENCY_ID" => "RUB",
580 | "PRICE" => 4900,
581 | "SORT" => 500,
582 | "SECTION_ID" => 13
583 | ],
584 | [
585 | "ID" => 28,
586 | "NAME" => "Тестовый товар 12",
587 | "CURRENCY_ID" => "RUB",
588 | "PRICE" => 900,
589 | "SORT" => 100,
590 | "SECTION_ID" => 13
591 | ],
592 | [
593 | "ID" => 29,
594 | "NAME" => "Тестовый товар 13",
595 | "CURRENCY_ID" => "RUB",
596 | "PRICE" => 2900,
597 | "SORT" => 300,
598 | "SECTION_ID" => 13
599 | ]
600 | ]);
601 |
602 | } catch (Bitrix24APIException $e) {
603 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
604 | } catch (Exception $e) {
605 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
606 | }
607 | ```
608 |
609 |
610 | ### Методы работы с разделами товаров
611 |
612 | Методы для работы с разделами товаров находятся в трейте `\App\Bitrix24\ProductSection`:
613 |
614 | - `getProductSection($productSectionId) :array` Возвращает раздел товаров по ID.
615 | - `addProductSection(array $fields = []) :int` Добавляет раздел товаров и возвращает его ID.
616 | - `updateProductSection($productSectionId, array $fields = []): int` Обновляет раздел товаров и возвращает его ID.
617 | - `deleteProductSection($productSectionId) :int` Удаляет раздел товаров и возвращает его ID.
618 | - `getProductSectionList(array $filter = [], array $select = [], array $order = []) :\Generator`
619 | Загружает все разделы товаров с возможностью фильтрации, сортировки и выборки полей.
620 | - `fetchProductSectionList(array $filter = [], array $select = [], array $order = []) :\Generator`
621 | Загружает все разделы товаров с возможностью фильтрации, сортировки и выборки полей.
622 | Реализует [быстрый метод](https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php) загрузки при работе с большими объемами данных.
623 | - `addProductSections(array $productSections = []) :array` Пакетно добавляет разделы товаров.
624 | - `updateProductSections(array $productSections = []) :array` Пакетно обновляет разделы товаров.
625 | - `deleteProducts(array $productSectionIds = []) :array` Пакетно удаляет разделы товаров.
626 | - `getProductSectionFields() :array` Возвращает описание полей раздела товара.
627 |
628 | Параметры методов:
629 |
630 | + `$productSectionId` - ID раздела товаров;
631 | + `$productSectionIds` - массив ID разделов товаров;
632 | + `$fields` - набор полей раздела товаров;
633 | + `$filter` - параметры фильтрации;
634 | + `$select` - параметры выборки полей;
635 | + `$order` - параметры сортировки.
636 |
637 | ```php
638 | use App\Bitrix24\Bitrix24API;
639 | use App\Bitrix24\Bitrix24APIException;
640 |
641 | try {
642 |
643 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
644 | $bx24 = new Bitrix24API($webhookURL);
645 |
646 | // Получаем раздел товаров по его ID
647 | $productSection = $bx24->getProductSection(16);
648 | print_r($productSection);
649 |
650 | // Обновляем раздел товаров
651 | $bx24->updateProductSection(16, [
652 | 'NAME' => 'Раздел товаров 1'
653 | ]);
654 |
655 | // Удаляем раздел товаров
656 | $bx24->deleteProductSection(16);
657 |
658 | // Загружаем все разделы товаров c фильтрацией по полю CATALOG_ID
659 | $generator = $bx24->fetchProductSectionList([ 'CATALOG_ID' => 2 ]);
660 | foreach ($generator as $productSections) {
661 | foreach($productSections as $productSection) {
662 | print_r($productSection);
663 | }
664 | }
665 |
666 | // Пакетно добавляем разделы товаров
667 | $productSectionIds = $bx24->addProductSections([
668 | [
669 | "NAME" => "Раздел товаров 3",
670 | 'CATALOG_ID' => 2
671 | ],
672 | [
673 | "NAME" => "Раздел товаров 4",
674 | 'CATALOG_ID' => 2
675 | ]
676 | ]);
677 |
678 | } catch (Bitrix24APIException $e) {
679 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
680 | } catch (Exception $e) {
681 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
682 | }
683 | ```
684 |
685 |
686 | ### Методы работы с товарными позициями
687 |
688 | Методы для работы с товарными позициями находятся в трейте `\App\Bitrix24\ProductRow`:
689 |
690 | - `getProductRowFields() :array` Возвращает описание полей товарных позиций.
691 |
692 |
693 |
694 | ### Методы для работы с пользователями
695 |
696 | Методы для работы с пользователями находятся в трейте `\App\Bitrix24\User`:
697 |
698 | - `getUser($userId) ?:array` Возвращает пользователя по ID.
699 | - `getUsers(array $filter = [], string $order = 'ASC', string $sort = '', bool $adminMode = false) :\Generator`
700 | Загружает всех пользователей с возможностью фильтрации, сортировки и выборки полей.
701 | - `getUserFields() :array` Возвращает описание полей пользователя.
702 |
703 | Параметры методов:
704 |
705 | + `$userId` - ID пользователя;
706 | + `$filter` - параметры фильтрации;
707 | + `$order` - направление сортировки (ASC|DESC);
708 | + `$sort` - поле, по которому сортируются результаты;
709 | + `$select` - параметры выборки полей;
710 | + `$adminMode` - включает режим администратора для получения данных о любых пользователях.
711 |
712 | ```php
713 | use App\Bitrix24\Bitrix24API;
714 | use App\Bitrix24\Bitrix24APIException;
715 |
716 | try {
717 |
718 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
719 | $bx24 = new Bitrix24API($webhookURL);
720 |
721 | // Получаем пользователя по ID
722 | $user = $bx24->getUser(34782);
723 | print_r($user);
724 |
725 | // Получаем всех пользователей типа сотрудник с сортировкой по имени
726 | $generator = $bx24->getUsers(
727 | [ 'USER_TYPE' => 'employee' ],
728 | $order = 'ASC',
729 | $sort = 'NAME'
730 | );
731 | foreach ($generator as $users) {
732 | foreach($users as $user) {
733 | print_r($user);
734 | }
735 | }
736 |
737 | } catch (Bitrix24APIException $e) {
738 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
739 | } catch (Exception $e) {
740 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
741 | }
742 | ```
743 |
744 |
745 | ### Методы работы с задачами
746 |
747 | Методы для работы с задачами находятся в трейте `\App\Bitrix24\Task`:
748 |
749 | - `getTask($taskId, array $select = []) :?array` Возвращает задачу по ID.
750 | - `getTaskList(array $filter = [], array $select = [], array $order = []): Generator` Возвращает все задачи.
751 | - `addTask(array $fields = []) :int` Добавляет новую задачу.
752 | - `addTasks(array $tasks = []) :array` Пакетно добавляет задачи.
753 | - `getTaskFields() :array` Возвращает описание полей задачи.
754 |
755 | Параметры методов:
756 |
757 | + `$taskId` - ID задачи;
758 | + `$filter` - параметры фильтрации;
759 | + `$select` - параметры выборки полей;
760 | + `$order` - параметры сортировки;
761 | + `$fields` - набор полей задачи;
762 | + `$tasks` - массив наборов полей задач.
763 |
764 | ```php
765 | use App\Bitrix24\Bitrix24API;
766 | use App\Bitrix24\Bitrix24APIException;
767 |
768 | try {
769 |
770 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
771 | $bx24 = new Bitrix24API($webhookURL);
772 |
773 | // Получаем задачу по ID
774 | $task = $bx24->getTask(4325);
775 | print_r($task);
776 |
777 | // Получаем все задачи
778 | $generator = $bx24->getTaskList();
779 | foreach ($generator as $result) {
780 | print_r($result);
781 | }
782 |
783 | // Создаем новую задачу
784 | $taskId = $bx24->addTask([
785 | 'TITLE' => 'Новая задача №123', // Название задачи
786 | 'DESCRIPTION' => 'Описание задачи', // Описание задачи
787 | 'RESPONSIBLE_ID' => 43242, // ID ответственного пользователя
788 | 'UF_CRM_TASK' => [ 'D_' . 38492 ], // Привязка задачи к сделке ('D_' - сущность сделка, 38492 - ID сделки)
789 | 'START_DATE_PLAN' => '09.08.2005', // Плановая дата начала.
790 | 'END_DATE_PLAN' => '09.09.2005', // Плановая дата завершения
791 | 'DEADLINE' => '2005-09-09T18:31:42+03:30' // Крайний срок
792 | ]);
793 | print_r($taskId);
794 |
795 | } catch (Bitrix24APIException $e) {
796 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
797 | } catch (Exception $e) {
798 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
799 | }
800 | ```
801 |
802 |
803 | ### Методы для работы с делами
804 |
805 | Методы для работы с делами (активностями) находятся в трейте `\App\Bitrix24\Activity`:
806 |
807 | - `getActivity($activityId) :?array` Возвращает дело по ID.
808 | - `addActivity(array $fields = []) :int` Создает новое дело и возвращает его ID.
809 | - `addActivities(array $activities = []) :array` Пакетно создает дела.
810 | - `getActivityFields() :array` Возвращает описание полей дела.
811 |
812 | Параметры методов:
813 |
814 | + `$activityId` - ID дела;
815 | + `$fields` - набор полей дела;
816 | + `$activities` - массив наборов полей дел.
817 |
818 | ```php
819 | use App\Bitrix24\Bitrix24API;
820 | use App\Bitrix24\Bitrix24APIException;
821 |
822 | try {
823 |
824 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
825 | $bx24 = new Bitrix24API($webhookURL);
826 |
827 | // Добавляем новое дело типа письмо
828 | $activityId = $bx24->addActivity([
829 | 'SUBJECT' => 'Заголовок письма', // Email subject
830 | 'DESCRIPTION' => 'Описание активности', // Email body
831 | 'DESCRIPTION_TYPE' => 2, // Тип тела email: 1- Plain text, 2 - bbCode, 3 - HTML (crm.enum.contenttype)
832 | 'COMPLETED' => 'N', // Флаг немедленной отправки: Y|N
833 | 'DIRECTION' => 2, // Направление: 1 - входящее, 2 - исходящее (crm.enum.activitydirection)
834 | 'OWNER_TYPE_ID' => 2, // Тип сущности: 2 - Сделка, 3 - контакт, 4 - Компания,... (crm.enum.ownertype)
835 | 'OWNER_ID' => 39293, // ID сущности (сделки)
836 | 'TYPE_ID' => 4, // Тип активности: 4 - Письмо (crm.enum.activitytype)
837 | 'RESPONSIBLE_ID' => 4852, // ID ответственного пользователя
838 | 'START_TIME' => '2005-08-09T18:31:42+03:30', // Время начала
839 | 'END_TIME' => '2005-09-10T18:31:42+03:30', // Время окончания
840 | 'COMMUNICATIONS' => [ // Параметры получателей письма
841 | [
842 | 'VALUE' => 'test@example.com', // Email компании
843 | 'ENTITY_ID' => 58938, // ID компании
844 | 'ENTITY_TYPE_ID' => 4 // Тип сущности: 4 - Компания ('crm.enum.ownertype');
845 | ]
846 | ],
847 | 'SETTINGS' => [
848 | 'MESSAGE_FROM' => 'from@example.com'
849 | ]
850 | ]);
851 | print_r($activityId);
852 |
853 | // Получаем дело по ID
854 | $activity = $bx24->getActivity($activityId);
855 | print_r($activity);
856 |
857 | } catch (Bitrix24APIException $e) {
858 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
859 | } catch (Exception $e) {
860 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
861 | }
862 | ```
863 |
864 |
865 | ### Методы для работы с диском
866 |
867 | Методы для работы с Диском находятся в трейте `\App\Bitrix24\Disk`:
868 |
869 | - `getDiskStorageList(array $filter = []) :\Generator`
870 | Загружает список доступных хранилищ с возможностью фильтрации.
871 | - `getDiskStorageChildren($storageId, array $filter = []) :array`
872 | Возвращает список файлов и папок, которые находятся непосредственно в корне хранилища с возможностью фильтрации.
873 | - `uploadfileDiskFolder($folderId, string $fileContent, array $data, bool $isBase64FileData = true) :array`
874 | Загружает новый файл в указанную папку на Диск.
875 |
876 | Параметры методов:
877 |
878 | + `$filter` - параметры фильтрации;
879 | + `$storageId` - ID хранилища;
880 | + `$filter` - параметры фильтрации;
881 | + `$folderId` - ID папки;
882 | + `$fileContent` - RAW данные файла;
883 | + `$data` - набор параметров, описывающих файл (обязательное поле NAME - имя нового файла);
884 | + `$isBase64FileData` - RAW данные файла закодированы в BASE64?
885 |
886 | ```php
887 | use App\Bitrix24\Bitrix24API;
888 | use App\Bitrix24\Bitrix24APIException;
889 |
890 | try {
891 |
892 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
893 | $bx24 = new Bitrix24API($webhookURL);
894 |
895 | // Загружаем список доступных хранилищ
896 | $generator = $bx24->getDiskStorageList();
897 | foreach ($generator as $storages) {
898 | foreach ($storages as $storage) {
899 | print_r($storage);
900 | }
901 | }
902 |
903 | // Загружаем список файлов и папок, которые находятся непосредственно в корне хранилища
904 | $files = $bx24->getDiskStorageChildren($storageId = 2);
905 | foreach ($files as $file) {
906 | print_r($file);
907 | }
908 |
909 | // Загружаем файл в указанную папку на Диск
910 | $bx24->uploadfileDiskFolder(
911 | $filderId = 4709,
912 | $rawFile = file_get_contents('./schet.pdf'),
913 | [ 'NAME' => 'schet.pdf' ],
914 | $isBase64FileData = false
915 | );
916 |
917 | } catch (Bitrix24APIException $e) {
918 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
919 | } catch (Exception $e) {
920 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
921 | }
922 | ```
923 |
924 |
925 | ### Методы для работы с лидами
926 |
927 | Методы для работы с лидами находятся в трейте `\App\Bitrix24\Lead`:
928 |
929 | - `getLeadFields() :array` Возвращает описание полей лида, в том числе пользовательских.
930 | - `getLead($leadId, array $with = []) :array` Возвращает лид по его ID.
931 | - `addLead(array $fields = [], array $params = []) :int` Добавляет лид и возвращает его ID.
932 | - `updateLead($leadId, array $fields = [], array $params = []) :int` Обновляет лид и возвращает его ID.
933 | - `deleteLead($leadId) :int` Удаляет лид по его ID.
934 | - `getLeadList(array $filter = [], array $select = [], array $order = []): Generator`
935 | Загружает все лиды с возможностью фильтрации, сортировки и выборки полей.
936 | - `fetchLeadList(array $filter = [], array $select = [], array $order = []): Generator`
937 | Загружает все лиды с возможностью фильтрации, сортировки и выборки полей.
938 | Реализует [быстрый метод](https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php) загрузки при работе с большими объемами данных.
939 | - `getLeadProductRows($leadId) :array` Возвращает массив параметров товарных позиций, связанных с лидом.
940 | - `setLeadProductRows($leadId, array $products) :array` Устанавливает товарные позиции, связанные с лидом.
941 |
942 | Параметры методов:
943 |
944 | + `$leadId` - ID лида;
945 | + `$with` - имена связанных сущностей, возвращаемых вместе с лидом:
946 | * `\App\Bitrix24\Bitrix24API::$WITH_PRODUCTS` - товарные позиции (возвращаются в виде массива в поле с именем, заданным публичным статическим свойством `Bitrix24API::$PRODUCTS`);
947 | - `$fields` - набор полей лида;
948 | - `$params` - набор параметров лида;
949 | - `$filter` - параметры фильтрации;
950 | - `$order` - параметры сортировки;
951 | - `$select` - параметры выборки полей;
952 | - `$products` - массив параметров товарных позиций.
953 |
954 | ```php
955 | use App\Bitrix24\Bitrix24API;
956 | use App\Bitrix24\Bitrix24APIException;
957 |
958 | try {
959 |
960 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
961 | $bx24 = new Bitrix24API($webhookURL);
962 |
963 | // Добавляем новый лид
964 | $leadId = $bx24->addLead([
965 | 'TITLE' => 'Новый лид №1'
966 | ]);
967 | print_r($leadId);
968 |
969 | // Устанавливаем набор связанных товарных позиций
970 | $bx24->setLeadProductRows($leadId, [
971 | [ 'PRODUCT_ID' => 1689, 'PRICE' => 1500.00, 'QUANTITY' => 2 ],
972 | [ 'PRODUCT_ID' => 1860, 'PRICE' => 500.00, 'QUANTITY' => 15 ]
973 | ]);
974 |
975 | // Обновляем существующий лид
976 | $bx24->updateLead($leadId [
977 | 'TITLE' => 'Новый лид №12'
978 | ]);
979 |
980 | // При необходимости, изменяем значение по умолчанию 'PRODUCTS' на '_PRODUCTS' для имени поля
981 | // со списком товарных позиций, возвращаемых вместе с лидом
982 | Bitrix24API::$WITH_PRODUCTS = '_PRODUCTS';
983 |
984 | // Загружаем лид по ID вместе со связанными товарными позициями
985 | $lead = $bx24->getLead($leadId, [ Bitrix24API::$WITH_PRODUCTS ]);
986 | print_r($lead);
987 |
988 | // Удаляем существующий лид
989 | $bx24->deleteLead($leadId);
990 |
991 | // Загружаем все лиды используя быстрый метод при работе с большими объемами данных
992 | $generator = $bx24->fetchLeadList();
993 | foreach ($generator as $leads) {
994 | foreach($leads as $lead) {
995 | print_r($lead);
996 | }
997 | }
998 |
999 | } catch (Bitrix24APIException $e) {
1000 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
1001 | } catch (Exception $e) {
1002 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
1003 | }
1004 | ```
1005 |
1006 |
1007 | ## Вспомогательные классы
1008 |
1009 |
1010 | ### Класс `HTTP`
1011 |
1012 | Класс [`\App\HTTP\НТТР`](https://github.com/andrey-tech/http-client-php) обеспечивает:
1013 |
1014 | - формирование POST запросов к API Битрикс 24 по протоколу HTTPS;
1015 | - троттлинг запросов к API на требуемом уровне - [не более 2-х запросов в секунду](https://dev.1c-bitrix.ru/rest_help/rest_sum/index.php);
1016 | - вывод отладочной информации о запросах к API в STDOUT.
1017 |
1018 | При возникновении ошибок выбрасывается исключение класса `\App\HTTP\HTTPException`.
1019 |
1020 |
1021 | #### Дополнительные параметры
1022 |
1023 | Дополнительные параметры устанавливаются через публичные свойства объекта класса `\App\HTTP\HTTP`:
1024 |
1025 | Свойство | По умолчанию | Описание
1026 | ----------------------- | ----------------------- | --------
1027 | `$debugLevel` | `\App\HTTP\HTTP::DEBUG_NONE` | Устанавливает уровень вывода отладочной информации о запросах в STDOUT (битовая маска, составляемая из значений DEBUG_NONE, DEBUG_URL, DEBUG_HEADERS, DEBUG_CONTENT)
1028 | `$throttle` | 0 | Максимальное число HTTP запросов в секунду (0 - троттлинг отключен)
1029 | `$addBOM` | false | Добавлять [маркер ВОМ](https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%80%D0%BA%D0%B5%D1%80_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2) UTF-8 (EFBBBF) к запросам в формате JSON
1030 | `$useCookies` | false | Использовать cookies в запросах
1031 | `$cookieFile` | 'temp/cookies.txt' | Путь к файлу для хранения cookies
1032 | `$verifySSLCertificate` | true | Включить проверку SSL/TLS-сертификата сервера
1033 | `$SSLCertificateFile` | 'cacert.pem' | Устанавливает файл SSL/TLS-сертификатов X.509 корневых удостоверяющих центров (CA) в формате РЕМ (установка в null означает использовать файл, указанный в параметре [curl.cainfo](https://www.php.net/manual/ru/curl.configuration.php) файла php.ini)
1034 | `$userAgent` | 'HTTP-client/3.x.x' | Устанавливает НТТР заголовок UserAgent в запросах
1035 | `$curlConnectTimeout` | 60 | Устанавливает таймаут соединения, секунды
1036 | `$curlTimeout` | 60 | Устанавливает таймаут обмена данными, секунды
1037 | `$successStatusCodes` | [ 200 ] | Коды статуса НТТР, соответствующие успешному выполнению запроса
1038 |
1039 |
1040 |
1041 | #### Примеры
1042 |
1043 | ```php
1044 | use App\Bitrix24\Bitrix24API;
1045 | use App\Bitrix24\Bitrix24APIException;
1046 | use App\HTTP\HTTP;
1047 |
1048 | try {
1049 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
1050 | $bx24 = new Bitrix24API($webhookURL);
1051 |
1052 | // Устанавливаем максимальный уровень вывода отладочных сообщений в STDOUT
1053 | $bx24->http->debugLevel = HTTP::DEBUG_URL | HTTP::DEBUG_HEADERS | HTTP::DEBUG_CONTENT;
1054 |
1055 | // ИЛИ
1056 | // убираем вывод отладочных сообщений в случае необходимости.
1057 | // Раскомментируем строчку нижи И закоментируем рабочую строчку выше
1058 | // $bx24->http->debugLevel = HTTP::DEBUG_NONE;
1059 |
1060 | // Устанавливаем троттлинг запросов на уровне не более 1 запроса в 2 секунды
1061 | $bx24->http->throttle = 0.5;
1062 |
1063 | // Устанавливаем таймаут обмена данными в 30 секунд
1064 | $bx24->http->curlTimeout = 30;
1065 |
1066 | // Получаем компанию по ID
1067 | $results = $bx24->getCompany(20);
1068 |
1069 | } catch (Bitrix24APIException $e) {
1070 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
1071 | } catch (Exception $e) {
1072 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
1073 | }
1074 | ```
1075 |
1076 | Примеры отладочных сообщений:
1077 | ```
1078 | [1] ===> POST https://www.example.com/rest/1/u7ngxagzrhpuj31a/crm.company.get.json
1079 | POST rest/1/u7ngxagzrhpuj31a/crm.company.get.json HTTP/1.1
1080 | Host: www.example.com
1081 | User-Agent: HTTP-client/2.x.x
1082 | Accept: */*
1083 | Content-Length: 5
1084 | Content-Type: application/x-www-form-urlencoded
1085 |
1086 | id=20
1087 |
1088 | [1] <=== RESPONSE 0.5348s (200)
1089 | HTTP/1.1 200 OK
1090 | Server: nginx/1.16.1
1091 | Date: Mon, 15 Jun 2020 13:11:33 GMT
1092 | Content-Type: application/json; charset=utf-8
1093 | Transfer-Encoding: chunked
1094 | Connection: keep-alive
1095 | P3P: policyref="/bitrix/p3p.xml", CP="NON DSP COR CUR ADM DEV PSA PSD OUR UNR BUS UNI COM NAV INT DEM STA"
1096 | X-Powered-CMS: Bitrix Site Manager (bc2cad9153cb418bb2dfd5602c3c3754)
1097 | Set-Cookie: PHPSESSID=uSBxTO1tiaVfYPd7I7BhvjPLc2H2RhuD; path=/; secure; HttpOnly
1098 | Expires: Thu, 19 Nov 1981 08:52:00 GMT
1099 | Cache-Control: no-store, no-cache, must-revalidate
1100 | Pragma: no-cache
1101 | Set-Cookie: qmb=.; path=/
1102 | Access-Control-Allow-Origin: *
1103 | Access-Control-Allow-Headers: origin, content-type, accept
1104 | X-Content-Type-Options: nosniff
1105 | X-Bitrix-Rest-Time: 0.0098488331
1106 | X-Bitrix-Rest-User-Time: 0.0042990000
1107 | X-Bitrix-Rest-System-Time: 0.0000030000
1108 | Set-Cookie: BITRIX_SM_SALE_UID=4; expires=Thu, 10-Jun-2021 13:11:33 GMT; Max-Age=31104000; path=/
1109 | X-Frame-Options: SAMEORIGIN
1110 | X-Content-Type-Options: nosniff
1111 | Strict-Transport-Security: max-age=31536000; includeSubdomains
1112 | X-Bitrix-Times: 0.104/0.104/0.000
1113 | X-Bitrix-TCP: 32250/6750/20/14480
1114 | X-Bitrix-RI: 3b51dd618cb995cfc06d2016cc4c0c94
1115 | X-Bitrix-LB: lb-ru-04
1116 |
1117 | {"result":{"ID":"20","COMPANY_TYPE":"CUSTOMER","LOGO":null,"LEAD_ID":null,"HAS_PHONE":"N","HAS_EMAIL":"Y"}}
1118 | ```
1119 |
1120 |
1121 | ### Класс `DebugLogger`
1122 |
1123 | Класс [`\App\DebugLogger\DebugLogger`](https://github.com/andrey-tech/debug-logger-php) обеспечивает логирование запросов и ответов к API Битрикс24 в файл.
1124 | При возникновении ошибок выбрасывается исключение класса `\App\DebugLogger\DebugLoggerException`.
1125 |
1126 |
1127 | #### Методы класса
1128 |
1129 | - `static instance(string $logFileName = 'debug.log') :self`
1130 | Возвращает единственный объект данного класса **для заданного лог-файла** `$logFileName`.
1131 | + `$logFileName` - имя лог-файла.
1132 | - `save(mixed $info, object $object = null, string $header = null) :void` Сохраняет подлежащую логированию информацию в файл.
1133 | + `$info` - строка, массив или объект для логирования;
1134 | + `$object` - ссылка на объект класса в котором выполняется логирование;
1135 | + `$header` - строка заголовка для сохраняемой в лог файл информации.
1136 |
1137 |
1138 | #### Дополнительные параметры
1139 |
1140 | Дополнительные параметры устанавливаются через публичные свойства класса `\App\DebugLogger\DebugLogger`:
1141 |
1142 | Нестатическое свойство | По умолчанию | Описание
1143 | ----------------------- | ------------- | --------
1144 | `$isActive` | false | Включает или выключает логирование для конкретного файла, задаваемого параметром `$logFileName` метода `instance()`
1145 |
1146 | Статическое свойство | По умолчанию | Описание
1147 | ----------------------- | ------------- | --------
1148 | `$logFileDir` | `temp/` | Устанавливает каталог, в котором сохраняются лог-файлы
1149 | `mkdirMode` | 0755 | Устанавливает режим доступа для создаваемых каталогов для хранения лог файлов в виде восьмеричного числа
1150 | `$uniqIdLength` | 7 | Длина уникального буквенно-цифрового [a-z0-9]+ идентификатора объекта класса `DebugLogger` для сохранения в лог файле, позволяющего находить записи, созданные одним и тем же процессом
1151 |
1152 |
1153 |
1154 | #### Примеры
1155 |
1156 | ```php
1157 | use App\Bitrix24\Bitrix24API;
1158 | use App\Bitrix24\Bitrix24APIException;
1159 | use App\DebugLogger\DebugLogger;
1160 |
1161 | try {
1162 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/';
1163 | $bx24 = new Bitrix24API($webhookURL);
1164 |
1165 | // Устанавливаем каталог для сохранения лог файлов
1166 | DebugLogger::$logFileDir = 'logs/';
1167 |
1168 | // Создаем объект класса логгера
1169 | $logFileName = 'debug_bitrix24api.log';
1170 | $logger = DebugLogger::instance($logFileName);
1171 |
1172 | // Включаем логирование
1173 | $logger->isActive = true;
1174 |
1175 | // Устанавливаем логгер
1176 | $bx24->setLogger($logger);
1177 |
1178 | // Загружаем все компании
1179 | $bx24->fetchCompanyList();
1180 |
1181 | } catch (Bitrix24APIException $e) {
1182 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
1183 | } catch (Exception $e) {
1184 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
1185 | }
1186 | ```
1187 |
1188 | Пример результатов логирования:
1189 |
1190 | ```
1191 | *** 92qshr5 [2020-06-14 13:32:44.993285 +00:00 Δ0.012308 s, 0.70/2.00 MiB] ********************
1192 | * Class: App\Bitrix24\Bitrix24API
1193 | ЗАПРОС: crm.company.list.json
1194 | {
1195 | "order": {
1196 | "ID": "ASC"
1197 | },
1198 | "filter": {
1199 | ">ID": 0
1200 | },
1201 | "select": [],
1202 | "start": -1
1203 | }
1204 |
1205 |
1206 | *** 92qshr5 [2020-06-14 13:32:46.900518 +00:00 Δ1.907233 s, 1.14/2.00 MiB] ********************
1207 | ОТВЕТ: crm.company.list.json
1208 | {
1209 | "result": [
1210 | {
1211 | "ID": "2",
1212 | "COMPANY_TYPE": "PARTNER",
1213 | "TITLE": "ООО",
1214 | "LOGO": {
1215 | "id": 112,
1216 | "showUrl": "\/bitrix\/components\/bitrix\/crm.company.show\/show_file.php?ownerId=2",
1217 | "downloadUrl": "\/bitrix\/components\/bitrix\/crm.company.show\/show_file.php?auth=&ownerId=2"
1218 | }
1219 | }
1220 | }
1221 | }
1222 |
1223 | *** 92qshr5 [2020-06-14 13:32:46.902085 +00:00 Δ0.001567 s, 1.30/2.00 MiB] ********************
1224 | * Class: App\Bitrix24\Bitrix24API
1225 | По запросу (fetchList) crm.company.list получено сущностей: 50, всего получено: 50
1226 | ```
1227 |
1228 |
1229 | ##### Формат заголовков лога
1230 |
1231 | ```
1232 | *** 92qshr5 [2020-06-14 13:32:46.902085 +00:00 Δ0.001567 s, 1.30/2.00 MiB] ********************
1233 | * Class: App\Bitrix24\Bitrix24API
1234 | ```
1235 |
1236 | - `92qshr5` - уникальный буквенно-цифровой [a-z0-9]+ идентификатор объекта класса `DebugLogger`, позволяющий находить в лог файле записи, созданные одним и тем же процессом;
1237 | - `2020-06-14 13:32:46.902085` - дата и время сохранения информации с точностью до микросекунд;
1238 | - `Δ0.001567 s` - время, прошедшее с момента предыдущего сохранения информации в секундах и микросекундах;
1239 | - `1.30/2.00 MiB` - данные об используемой оперативной памяти в единицах количества информации с [двоичными приставками](https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%B8%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8):
1240 | + `1.30` - максимальный объем памяти, который был выделен PHP-скрипту системой;
1241 | + `2.00` - реальный объем памяти, выделенный PHP-скрипту системой;
1242 | - 'Class: App\Bitrix24\Bitrix24API' - полное имя класса из которого сделано сохранение в лог файл.
1243 |
1244 |
1245 | ## Автор
1246 |
1247 | © 2019-2022 andrey-tech
1248 |
1249 |
1250 | ## Лицензия
1251 |
1252 | Данная библиотека распространяется на условиях лицензии [MIT](./LICENSE).
1253 |
--------------------------------------------------------------------------------
/assets/bitrix24-logo-social.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andrey-tech/bitrix24-api-php/d43f5839509751b72e02e14f4aed5731f8bae0e4/assets/bitrix24-logo-social.png
--------------------------------------------------------------------------------
/assets/bitrix24-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andrey-tech/bitrix24-api-php/d43f5839509751b72e02e14f4aed5731f8bae0e4/assets/bitrix24-logo.png
--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "andrey-tech/bitrix24-api-php",
3 | "description": "Обертка на PHP7+ для работы с API Битрикс24 с использованием механизма входящих вебхуков, троттлингом запросов и логированием в файл",
4 | "keywords": [ "bitrix", "bitrix24", "api", "api-wrapper", "throttling", "logging", "webhook" ],
5 | "homepage": "https://github.com/andrey-tech/bitrix24-api-php",
6 | "minimum-stability": "stable",
7 | "license": "MIT",
8 | "authors": [
9 | {
10 | "name": "andrey-tech",
11 | "homepage": "https://github.com/andrey-tech/",
12 | "role": "Developer"
13 | }
14 | ],
15 | "require": {
16 | "php": ">=7.0",
17 | "ext-json": "*",
18 | "andrey-tech/http-client-php": "^3.0",
19 | "andrey-tech/debug-logger-php": "^2.0"
20 | },
21 | "autoload": {
22 | "psr-4": {
23 | "App\\Bitrix24\\": "src/App/Bitrix24"
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/App/Bitrix24/Activity.php:
--------------------------------------------------------------------------------
1 | request('crm.activity.fields');
31 | }
32 |
33 | /**
34 | * Возвращает активность по ID
35 | *
36 | * @param int|string $activityId ID активности
37 | * @return array|null
38 | */
39 | public function getActivity($activityId)
40 | {
41 | $activity = $this->request(
42 | 'crm.activity.get',
43 | [
44 | 'id' => $activityId
45 | ]
46 | );
47 |
48 | return $activity;
49 | }
50 |
51 | /**
52 | * Добавляет активность
53 | *
54 | * @param array $fields Список полей активности
55 | * @return int
56 | */
57 | public function addActivity(array $fields = [])
58 | {
59 | $result = $this->request(
60 | 'crm.activity.add',
61 | [
62 | 'fields' => $fields
63 | ]
64 | );
65 |
66 | return $result;
67 | }
68 |
69 | // ------------------------------------------------------------------------
70 |
71 | /**
72 | * Пакетно добавляет активности
73 | *
74 | * @param array $activities Массив параметров активностей
75 | * @return array Массив id активностей
76 | */
77 | public function addActivities(array $activities = []): array
78 | {
79 | // Id добавленных активностей
80 | $activityResults = [];
81 |
82 | while ($activitiesChunk = array_splice($activities, 0, $this->batchSize)) {
83 | // Формируем массив команд на добавление активностей
84 | $commandParams = [];
85 | foreach ($activitiesChunk as $index => $activity) {
86 | $commandParams[ $index ] = [
87 | 'fields' => $activity
88 | ];
89 | }
90 | $commands = $this->buildCommands('crm.activity.add', $commandParams);
91 | $activityResult = $this->batchRequest($commands);
92 |
93 | // Сравниваем число команд и число id в ответе
94 | $sent = count($commandParams);
95 | $received = count($activityResult);
96 | if ($received != $sent) {
97 | $jsonResponse = $this->toJSON($this->lastResponse);
98 | throw new Bitrix24APIException(
99 | "Невозможно пакетно добавить активности ({$sent}/{$received}): {$jsonResponse}"
100 | );
101 | }
102 |
103 | $activityResults = array_merge($activityResults, $activityResult);
104 | }
105 |
106 | return $activityResults;
107 | }
108 | }
109 |
--------------------------------------------------------------------------------
/src/App/Bitrix24/Bitrix24API.php:
--------------------------------------------------------------------------------
1 | webhookUrl = rtrim($webhookUrl, '/');
115 |
116 | $this->http = new HTTP();
117 | // Не более 2-х запросов в секунду (https://dev.1c-bitrix.ru/rest_help/rest_sum/index.php)
118 | $this->http->throttle = 2;
119 | $this->http->useCookies = false;
120 | }
121 |
122 | /**
123 | * Устанавливает объект класса, выполняющего логирование
124 | * @param \App\DebugLogger\DebugLoggerInterface $logger
125 | */
126 | public function setLogger($logger)
127 | {
128 | if (!($logger instanceof \App\DebugLogger\DebugLoggerInterface)) {
129 | throw new Bitrix24APIException(
130 | "Объект класса логгера должен реализовывать интерфейс \App\DebugLogger\DebugLoggerInterface"
131 | );
132 | }
133 | $this->logger = $logger;
134 | }
135 |
136 | /**
137 | * Возвращает последний ответ от API Битрикс24
138 | *
139 | * @return mixed
140 | */
141 | public function getLastResponse()
142 | {
143 | return $this->lastResponse;
144 | }
145 |
146 | /**
147 | * Отправляет запрос в API системы Битрикс24
148 | *
149 | * @param string $function Имя метода (функции) запроса
150 | * @param array $params Параметры запроса
151 | * @return array|null
152 | */
153 | public function request(string $function, array $params = [])
154 | {
155 | $function .= '.json';
156 | $url = $this->webhookUrl . '/' . $function;
157 |
158 | // Логирование запроса
159 | if (isset($this->logger)) {
160 | $jsonParams = urldecode($this->toJSON($params, true));
161 | $this->logger->save("ЗАПРОС: {$function}" . PHP_EOL . $jsonParams, $this);
162 | }
163 |
164 | // POST запрос
165 | $this->lastResponse = $this->http->request($url, 'POST', $params, [ 'Connection: close' ]);
166 |
167 | // Логирование ответа
168 | if (isset($this->logger)) {
169 | $jsonResponse = $this->toJSON($this->lastResponse, true);
170 | $this->logger->save("ОТВЕТ: {$function}" . PHP_EOL . $jsonResponse, $this);
171 | }
172 |
173 | // Проверка кода состояния HTTP
174 | if (! $this->http->isSuccess()) {
175 | $httpCode = $this->http->getHTTPCode();
176 | $jsonParams = $this->toJSON($params);
177 | $jsonResponse = $this->toJSON($this->lastResponse);
178 | throw new Bitrix24APIException(
179 | "Ошибка: HTTP код {$httpCode} при запросе '{$function}' ({$jsonParams}): {$jsonResponse}"
180 | );
181 | }
182 |
183 | // Проверка наличия ошибок в ответе
184 | if (! empty($this->lastResponse['error']) || ! empty($this->lastResponse['error_description'])) {
185 | $jsonParams = $this->toJSON($params);
186 | $jsonResponse = $this->toJSON($this->lastResponse);
187 | throw new Bitrix24APIException("Ошибка при запросе '{$function}' ({$jsonParams}): {$jsonResponse}");
188 | }
189 |
190 | return $this->lastResponse['result'];
191 | }
192 |
193 | /**
194 | * Возвращает список всех сущностей
195 | *
196 | * @param string $function Имя метода (функции) запроса
197 | * @param array $params Параметры
198 | * запроса
199 | * @return Generator
200 | * @see https://dev.1c-bitrix.ru/rest_help/general/lists.php
201 | */
202 | public function getList(string $function, array $params = []): Generator
203 | {
204 | do {
205 | // До 50 штук на 1 запрос
206 | $result = $this->request(
207 | $function,
208 | $params
209 | );
210 |
211 | $start = $params['start'] ?? 0;
212 | if ($this->logger) {
213 | $this->logger->save(
214 | "По запросу (getList) {$function} (start: {$start}) получено сущностей: " . count($result) .
215 | ", всего существует: " . $this->lastResponse['total'],
216 | $this
217 | );
218 | }
219 |
220 | yield $result;
221 |
222 | if (empty($this->lastResponse['next'])) {
223 | break;
224 | }
225 |
226 | $params['start'] = $this->lastResponse['next'];
227 | } while (true);
228 | }
229 |
230 | /**
231 | * Возвращает список всех сущностей используя быстрый метод
232 | *
233 | * @see https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php
234 | * @param string $function Имя метода (функции) запроса
235 | * @param array $params Параметры
236 | * запроса
237 | * @return Generator
238 | * @see https://dev.1c-bitrix.ru/rest_help/general/lists.php
239 | */
240 | public function fetchList(string $function, array $params = []): Generator
241 | {
242 | $params['order']['ID'] = 'ASC';
243 | $params['filter']['>ID'] = 0;
244 | $params['start'] = -1;
245 |
246 | $totalCounter = 0;
247 |
248 | do {
249 | // До 50 штук на 1 запрос
250 | $result = $this->request(
251 | $function,
252 | $params
253 | );
254 |
255 | $resultCounter = count($result);
256 | $totalCounter += $resultCounter;
257 | if ($this->logger) {
258 | $this->logger->save(
259 | "По запросу (fetchList) {$function} получено сущностей: {$resultCounter}, " .
260 | "всего получено: {$totalCounter}",
261 | $this
262 | );
263 | }
264 |
265 | yield $result;
266 |
267 | if ($resultCounter < 50) {
268 | break;
269 | }
270 |
271 | $params['filter']['>ID'] = $result[ $resultCounter - 1 ]['ID'];
272 | } while (true);
273 | }
274 |
275 | /**
276 | * Отправляет пакет запросов в API системы Битрикс24
277 | *
278 | * @param array $commands Пакет
279 | * команд
280 | * @param bool $halt Определяет прерывать
281 | * ли последовательность
282 | * запросов в случае
283 | * ошибки (0|1, true|false)
284 | * @return array|null
285 | * @see https://dev.1c-bitrix.ru/rest_help/general/batch.php
286 | */
287 | public function batchRequest(array $commands, $halt = true)
288 | {
289 | // До 50 штук на 1 запрос
290 | $result = $this->request(
291 | 'batch',
292 | [
293 | 'halt' => (int) $halt,
294 | 'cmd' => $commands
295 | ]
296 | );
297 |
298 | // Проверка наличия ошибок в ответе от запроса batch
299 | if (! empty($result['result_error'])) {
300 | $jsonCommands = $this->toJSON($commands);
301 | $jsonResponse = $this->toJSON($this->lastResponse);
302 | throw new Bitrix24APIException("Ошибка при запросе batch ({$jsonCommands}): {$jsonResponse}");
303 | }
304 |
305 | return $result['result'];
306 | }
307 |
308 | /**
309 | * Формирует массив одинаковых команд для метода пакетных запросов batchRequest()
310 | *
311 | * @param string $function Имя метода (функции) запроса
312 | * @param array $items Массив
313 | * полей
314 | * запросов
315 | * @return array
316 | */
317 | public function buildCommands(string $function, array $items): array
318 | {
319 | $commands = [];
320 | foreach ($items as $fields) {
321 | $commands[] = $this->buildCommand($function, $fields);
322 | }
323 |
324 | return $commands;
325 | }
326 |
327 | /**
328 | * Формирует строку одной команды для пакета запросов
329 | *
330 | * @param string $function Имя метода (функции) запроса
331 | * @param array $params Массив
332 | * параметров
333 | * команды
334 | * @return string
335 | * @see https://dev.1c-bitrix.ru/rest_help/general/batch.php
336 | */
337 | public function buildCommand(string $function, array $params): string
338 | {
339 | return $function . '?' . http_build_query($params);
340 | }
341 |
342 | /**
343 | * Создает и возвращает результат со связанными сущностями
344 | *
345 | * @param array $result Результат
346 | * @param string $base Имя базовой сущности
347 | * @param array $with Имена связанных сущностей
348 | * @return array
349 | */
350 | protected function createResultWith(array $result, string $base, array $with): array
351 | {
352 | $resultWith = $result[ $base ];
353 | foreach ($with as $name) {
354 | $resultWith[ $name ] = $result[ $name ];
355 | }
356 | return $resultWith;
357 | }
358 |
359 | /**
360 | * Преобразует данные в строку JSON для сообщений об ошибке или лога
361 | *
362 | * @param mixed $data Данные для
363 | * преобразования
364 | * @param bool $prettyPrint Включает pretty print
365 | * для JSON
366 | * @return string
367 | */
368 | protected function toJSON($data, bool $prettyPrint = false): string
369 | {
370 | $encodeOptions = JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR;
371 |
372 | if ($prettyPrint) {
373 | $encodeOptions |= JSON_PRETTY_PRINT;
374 | }
375 |
376 | $jsonParams = json_encode($data, $encodeOptions);
377 | if ($jsonParams === false) {
378 | $jsonParams = print_r($data, true);
379 | }
380 |
381 | return $jsonParams;
382 | }
383 | }
384 |
--------------------------------------------------------------------------------
/src/App/Bitrix24/Bitrix24APIException.php:
--------------------------------------------------------------------------------
1 | request('crm.catalog.fields');
35 | }
36 |
37 | /**
38 | * Возвращает все товарные каталоги
39 | *
40 | * @param array $filter Параметры фильтрации
41 | * @param array $order Параметры
42 | * сортировки
43 | * @param array $select Параметры выборки
44 | * @return Generator
45 | * @see https://dev.1c-bitrix.ru/rest_help/crm/catalog/crm_catalog_list.php
46 | */
47 | public function getCatalogList(array $filter = [], array $select = [], array $order = []): Generator
48 | {
49 | $params = [
50 | 'order' => $order,
51 | 'filter' => $filter,
52 | 'select' => $select
53 | ];
54 |
55 | return $this->getList('crm.catalog.list', $params);
56 | }
57 |
58 | /**
59 | * Возвращает все товарные каталоги используя быстрый метод
60 | *
61 | * @see https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php
62 | * @param array $filter Параметры фильтрации
63 | * @param array $order Параметры
64 | * сортировки
65 | * @param array $select Параметры выборки
66 | * @return Generator
67 | * @see https://dev.1c-bitrix.ru/rest_help/crm/catalog/crm_catalog_list.php
68 | */
69 | public function fetchCatalogList(array $filter = [], array $select = [], array $order = []): Generator
70 | {
71 | $params = [
72 | 'order' => $order,
73 | 'filter' => $filter,
74 | 'select' => $select
75 | ];
76 |
77 | return $this->fetchList('crm.catalog.list', $params);
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/src/App/Bitrix24/Company.php:
--------------------------------------------------------------------------------
1 | request('crm.company.fields');
35 | }
36 |
37 | /**
38 | * Возвращает компанию по ID
39 | * @param int|string $companyId ID компании
40 | * @param array $with Список связанных сущностей,
41 | * возвращаемых вместе с компанией [ self::$WITH_CONTACTS ]
42 | * @return array
43 | */
44 | public function getCompany($companyId, array $with = [])
45 | {
46 | $with = array_map('strtoupper', $with);
47 |
48 | if (empty($with)) {
49 | return $this->request(
50 | 'crm.company.get',
51 | [ 'id' => $companyId ]
52 | );
53 | }
54 |
55 | $commands = [
56 | 'COMPANY' => $this->buildCommand('crm.company.get', [ 'id' => $companyId ])
57 | ];
58 |
59 | // Связанные контакты
60 | if (in_array(self::$WITH_CONTACTS, $with)) {
61 | $commands[self::$WITH_CONTACTS] = $this->buildCommand(
62 | 'crm.company.contact.items.get',
63 | [ 'id' => $companyId ]
64 | );
65 | }
66 |
67 | $result = $this->batchRequest($commands, true);
68 |
69 | return $this->createResultWith($result, 'COMPANY', $with);
70 | }
71 |
72 | /**
73 | * Добавляет компанию
74 | *
75 | * @param array $fields Список полей компании
76 | * @param array $params Параметры для компании
77 | * @return int
78 | */
79 | public function addCompany(array $fields = [], array $params = [])
80 | {
81 | $result = $this->request(
82 | 'crm.company.add',
83 | [
84 | 'fields' => $fields,
85 | 'params' => $params
86 | ]
87 | );
88 |
89 | return $result;
90 | }
91 |
92 | /**
93 | * Обновляет компанию
94 | *
95 | * @param int|string $companyId ID компании
96 | * @param array $fields Список
97 | * полей
98 | * компании
99 | * @param array $params Параметры
100 | * для
101 | * компании
102 | * @return int
103 | */
104 | public function updateCompany($companyId, array $fields = [], array $params = [])
105 | {
106 | $result = $this->request(
107 | 'crm.company.update',
108 | [
109 | 'id' => $companyId,
110 | 'fields' => $fields,
111 | 'params' => $params
112 | ]
113 | );
114 |
115 | return $result;
116 | }
117 |
118 | /**
119 | * Удаляет компанию по ID
120 | *
121 | * @param int|string $companyId ID компании
122 | * @return int
123 | */
124 | public function deleteCompany($companyId)
125 | {
126 | $result = $this->request(
127 | 'crm.company.delete',
128 | [ 'id' => $companyId ]
129 | );
130 |
131 | return $result;
132 | }
133 |
134 | /**
135 | * Возвращает все компании
136 | *
137 | * @param array $filter Параметры фильтрации
138 | * @param array $order Параметры
139 | * сортировки
140 | * @param array $select Параметры выборки
141 | * @return Generator
142 | * @see https://dev.1c-bitrix.ru/rest_help/crm/company/crm_company_list.php
143 | */
144 | public function getCompanyList(array $filter = [], array $select = [], array $order = []): Generator
145 | {
146 | $params = [
147 | 'order' => $order,
148 | 'filter' => $filter,
149 | 'select' => $select
150 | ];
151 |
152 | return $this->getList('crm.company.list', $params);
153 | }
154 |
155 | /**
156 | * Возвращает все компании используя быстрый метод
157 | *
158 | * @see https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php
159 | * @param array $filter Параметры фильтрации
160 | * @param array $order Параметры
161 | * сортировки
162 | * @param array $select Параметры выборки
163 | * @return Generator
164 | * @see https://dev.1c-bitrix.ru/rest_help/crm/company/crm_company_list.php
165 | */
166 | public function fetchCompanyList(array $filter = [], array $select = [], array $order = []): Generator
167 | {
168 | $params = [
169 | 'order' => $order,
170 | 'filter' => $filter,
171 | 'select' => $select
172 | ];
173 |
174 | return $this->fetchList('crm.company.list', $params);
175 | }
176 |
177 | // ------------------------------------------------------------------------
178 |
179 | /**
180 | * Возвращает контакты, связанные с компанией по ID компании
181 | *
182 | * @param int|string $companyId ID компании
183 | * @return array
184 | */
185 | public function getCompanyContactItems($companyId)
186 | {
187 | $result = $this->request(
188 | 'crm.company.contact.items.get',
189 | [ 'id' => $companyId ]
190 | );
191 |
192 | return $result;
193 | }
194 |
195 | /**
196 | * Устанавливает контакты, связанные с компанией по ID компании
197 | *
198 | * @param int|string $companyId ID компании
199 | * @param array $contacts Массив
200 | * контактов
201 | * @return array
202 | */
203 | public function setCompanyContactItems($companyId, array $contacts)
204 | {
205 | $result = $this->request(
206 | 'crm.company.contact.items.set',
207 | [
208 | 'id' => $companyId,
209 | 'items' => $contacts
210 | ]
211 | );
212 |
213 | return $result;
214 | }
215 |
216 | // ------------------------------------------------------------------------
217 |
218 | /**
219 | * Пакетно добавляет компании
220 | *
221 | * @param array $companies Массив компаний
222 | * @param array $params Параметры
223 | * для
224 | * компаний
225 | * @return array Массив id компаний
226 | */
227 | public function addCompanies(array $companies = [], array $params = []): array
228 | {
229 | // Id добавленных компаний
230 | $companyResults = [];
231 |
232 | while ($companiesChunk = array_splice($companies, 0, $this->batchSize)) {
233 | // Формируем массив команд на добавление компаний
234 | $commandParams = [];
235 | foreach ($companiesChunk as $index => $company) {
236 | $commandParams[ $index ] = [
237 | 'fields' => $company,
238 | 'params' => $params
239 | ];
240 | }
241 | $commands = $this->buildCommands('crm.company.add', $commandParams);
242 | $companyResult = $this->batchRequest($commands);
243 |
244 | // Сравниваем число команд и число id в ответе
245 | $sent = count($commandParams);
246 | $received = count($companyResult);
247 | if ($received != $sent) {
248 | $jsonResponse = $this->toJSON($this->lastResponse);
249 | throw new Bitrix24APIException(
250 | "Невозможно пакетно добавить компании ({$sent}/{$received}): {$jsonResponse}"
251 | );
252 | }
253 |
254 | $companyResults = array_merge($companyResults, $companyResult);
255 | }
256 |
257 | return $companyResults;
258 | }
259 |
260 | /**
261 | * Пакетно обновляет компании
262 | *
263 | * @param array $companies Массив компаний
264 | * @param array $params Параметры
265 | * для
266 | * компаний
267 | * @return array Массив id компаний
268 | */
269 | public function updateCompanies(array $companies = [], array $params = []): array
270 | {
271 | // Id обновленных компаний
272 | $companyResults = [];
273 |
274 | while ($companiesChunk = array_splice($companies, 0, $this->batchSize)) {
275 | $commandParams = [];
276 | foreach ($companiesChunk as $index => $company) {
277 | // Проверка наличия поля ID в компании на обновление
278 | $companyId = $company['ID'] ?? null;
279 | if (empty($companyId)) {
280 | $jsonCompany = $this->toJSON($company);
281 | throw new Bitrix24APIException(
282 | "Поле 'ID' в компании (index {$index}) на обновление отсутствует или пустое: '{$jsonCompany}'"
283 | );
284 | }
285 | $companyResults[] = $companyId;
286 |
287 | $commandParams[ $index ] = [
288 | 'id' => $companyId,
289 | 'fields' => $company,
290 | 'params' => $params
291 | ];
292 | }
293 | $commands = $this->buildCommands('crm.company.update', $commandParams);
294 | $result = $this->batchRequest($commands);
295 |
296 | // Сравниваем число команд и число статусов в ответе
297 | $sent = count($commandParams);
298 | $received = count($result);
299 | if ($received != $sent) {
300 | $jsonResponse = $this->toJSON($this->lastResponse);
301 | throw new Bitrix24APIException(
302 | "Невозможно пакетно обновить компании ({$sent}/{$received}): {$jsonResponse}"
303 | );
304 | }
305 | }
306 |
307 | return $companyResults;
308 | }
309 |
310 | /**
311 | * Пакетно удаляет компании
312 | *
313 | * @param array $companyIds Массив id компаний
314 | * @return array Массив id компаний
315 | */
316 | public function deleteCompanies(array $companyIds = []): array
317 | {
318 | // Id удаленных компаний
319 | $companyResults = [];
320 |
321 | while ($companiesChunk = array_splice($companyIds, 0, $this->batchSize)) {
322 | // Формируем массив команд на удаление компаний
323 | $commandParams = [];
324 | foreach ($companiesChunk as $index => $companyId) {
325 | $commandParams[ $index ] = [ 'id' => $companyId ];
326 | $companyResults[] = $companyId;
327 | }
328 |
329 | $commands = $this->buildCommands('crm.company.delete', $commandParams);
330 | $companyResult = $this->batchRequest($commands);
331 |
332 | // Сравниваем число команд и число статусов в ответе
333 | $sent = count($commandParams);
334 | $received = count($companyResult);
335 | if ($received != $sent) {
336 | $jsonResponse = $this->toJSON($this->lastResponse);
337 | throw new Bitrix24APIException(
338 | "Невозможно пакетно удалить компании ({$sent}/{$received}): {$jsonResponse}"
339 | );
340 | }
341 | }
342 |
343 | return $companyResults;
344 | }
345 | }
346 |
--------------------------------------------------------------------------------
/src/App/Bitrix24/Contact.php:
--------------------------------------------------------------------------------
1 | request('crm.contact.fields');
36 | }
37 |
38 | /**
39 | * Возвращает контакт по ID
40 | *
41 | * @param int|string $contactId ID контакта
42 | * @param array $with Список связанных сущностей,
43 | * возвращаемых вместе с контактом [ self::$WITH_COMPANIES ]
44 | * @return array
45 | */
46 | public function getContact($contactId, array $with = [])
47 | {
48 | $with = array_map('strtoupper', $with);
49 |
50 | if (empty($with)) {
51 | return $this->request(
52 | 'crm.contact.get',
53 | [ 'id' => $contactId ]
54 | );
55 | }
56 |
57 | $commands = [
58 | 'CONTACT' => $this->buildCommand('crm.contact.get', [ 'id' => $contactId ])
59 | ];
60 |
61 | // Связанные компании
62 | if (in_array(self::$WITH_COMPANIES, $with)) {
63 | $commands[self::$WITH_COMPANIES] = $this->buildCommand(
64 | 'crm.contact.company.items.get',
65 | [ 'id' => $contactId ]
66 | );
67 | }
68 |
69 | $result = $this->batchRequest($commands, true);
70 |
71 | return $this->createResultWith($result, 'CONTACT', $with);
72 | }
73 |
74 | /**
75 | * Возвращает контакты по номеру телефона
76 | *
77 | * @param int|string $phone Номер телефона
78 | * @param array $select Параметры выборки
79 | * @return array
80 | */
81 | public function getContactsByPhone($phone, $select = [])
82 | {
83 | return $this->request(
84 | 'crm.contact.list',
85 | [
86 | 'filter' => [ 'PHONE' => $phone ],
87 | 'select' => $select
88 | ]
89 | );
90 | }
91 |
92 | /**
93 | * Добавляет контакт
94 | *
95 | * @param array $fields Список полей контакта
96 | * @param array $params Параметры для контакта
97 | * @return int
98 | */
99 | public function addContact(array $fields = [], array $params = [])
100 | {
101 | $result = $this->request(
102 | 'crm.contact.add',
103 | [
104 | 'fields' => $fields,
105 | 'params' => $params
106 | ]
107 | );
108 |
109 | return $result;
110 | }
111 |
112 | /**
113 | * Обновляет контакт
114 | *
115 | * @param string|int $contactId ID контакта
116 | * @param array $fields Список
117 | * полей
118 | * контакта
119 | * @param array $params Список
120 | * параметров
121 | * контакта
122 | * @return int
123 | */
124 | public function updateContact($contactId, array $fields = [], array $params = [])
125 | {
126 | $result = $this->request(
127 | 'crm.contact.update',
128 | [
129 | 'id' => $contactId,
130 | 'fields' => $fields,
131 | 'params' => $params
132 | ]
133 | );
134 |
135 | return $result;
136 | }
137 |
138 | /**
139 | * Удаляет контакт по ID
140 | *
141 | * @param int|string $contactId ID контакта
142 | * @return int
143 | */
144 | public function deleteContact($contactId)
145 | {
146 | $result = $this->request(
147 | 'crm.contact.delete',
148 | [ 'id' => $contactId ]
149 | );
150 |
151 | return $result;
152 | }
153 |
154 | /**
155 | * Возвращает все контакты
156 | *
157 | * @param array $filter Параметры фильтрации
158 | * @param array $order Параметры
159 | * сортировки
160 | * @param array $select Параметры выборки
161 | * @return Generator
162 | */
163 | public function getContactList(array $filter = [], array $select = [], array $order = []): Generator
164 | {
165 | $params = [
166 | 'order' => $order,
167 | 'filter' => $filter,
168 | 'select' => $select
169 | ];
170 |
171 | return $this->getList('crm.contact.list', $params);
172 | }
173 |
174 | /**
175 | * Возвращает все контакты используя быстрый метод
176 | *
177 | * @see https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php
178 | * @param array $filter Параметры фильтрации
179 | * @param array $order Параметры
180 | * сортировки
181 | * @param array $select Параметры выборки
182 | * @return Generator
183 | */
184 | public function fetchContactList(array $filter = [], array $select = [], array $order = []): Generator
185 | {
186 | $params = [
187 | 'order' => $order,
188 | 'filter' => $filter,
189 | 'select' => $select
190 | ];
191 |
192 | return $this->fetchList('crm.contact.list', $params);
193 | }
194 |
195 | // ------------------------------------------------------------------------
196 |
197 | /**
198 | * Возвращает компании, связанные с контактом по ID контакта
199 | *
200 | * @param int|string $contactId ID контакта
201 | * @return array
202 | */
203 | public function getContactCompanyItems($contactId)
204 | {
205 | $result = $this->request(
206 | 'crm.contact.company.items.get',
207 | [ 'id' => $contactId ]
208 | );
209 |
210 | return $result;
211 | }
212 |
213 | /**
214 | * Устанавливает компании, связанные с контактом по ID контакта
215 | *
216 | * @param int|string $contactId ID контакта
217 | * @param array $companies Массив
218 | * компаний
219 | * @return array
220 | */
221 | public function setContactCompanyItems($contactId, array $companies)
222 | {
223 | $result = $this->request(
224 | 'crm.contact.company.items.set',
225 | [
226 | 'id' => $contactId,
227 | 'items' => $companies
228 | ]
229 | );
230 |
231 | return $result;
232 | }
233 |
234 | // ------------------------------------------------------------------------
235 |
236 | /**
237 | * Пакетно добавляет контакты
238 | *
239 | * @param array $contacts Массив контактов (поля связанных сущностей [ 'COMPANY_ID' ])
240 | * @param array $params Параметры
241 | * для
242 | * контактов
243 | * @return array Массив Id контактов
244 | */
245 | public function addContacts(array $contacts = [], array $params = []): array
246 | {
247 | // Id добавленных контактов
248 | $contactResults = [];
249 |
250 | while ($contactsChunk = array_splice($contacts, 0, $this->batchSize)) {
251 | $commandParams = [];
252 | foreach ($contactsChunk as $index => $contact) {
253 | $commandParams[ $index ] = [
254 | 'fields' => $contact,
255 | 'params' => $params
256 | ];
257 | }
258 | $commands = $this->buildCommands('crm.contact.add', $commandParams);
259 | $result = $this->batchRequest($commands);
260 |
261 | // Сравниваем число команд и число id в ответе
262 | $sent = count($commandParams);
263 | $received = count($result);
264 | if ($received != $sent) {
265 | $jsonResponse = $this->toJSON($this->lastResponse);
266 | throw new Bitrix24APIException(
267 | "Невозможно пакетно добавить контакты ({$sent}/{$received}): {$jsonResponse}"
268 | );
269 | }
270 |
271 | $contactResults = array_merge($contactResults, $result);
272 | }
273 |
274 | return $contactResults;
275 | }
276 |
277 | /**
278 | * Пакетно обновляет контакты
279 | *
280 | * @param array $contacts Массив контактов (поля связанных сущностей [ 'COMPANY_ID' ])
281 | * @param array $params Параметры
282 | * для
283 | * контактов
284 | * @return array Массив Id контактов
285 | */
286 | public function updateContacts(array $contacts = [], array $params = []): array
287 | {
288 | // Id обновленных контактов
289 | $contactResults = [];
290 |
291 | while ($contactsChunk = array_splice($contacts, 0, $this->batchSize)) {
292 | $commandParams = [];
293 | foreach ($contactsChunk as $index => $contact) {
294 | // Проверка наличия поля ID в контакте на обновление
295 | $contactId = $contact['ID'] ?? null;
296 | if (empty($contactId)) {
297 | $jsonContact = $this->toJSON($contact);
298 | throw new Bitrix24APIException(
299 | "Поле 'ID' в контакте (index {$index}) на обновление отсутствует или пустое: '{$jsonContact}'"
300 | );
301 | }
302 | $contactResults[] = $contactId;
303 |
304 | $commandParams[ $index ] = [
305 | 'id' => $contactId,
306 | 'fields' => $contact,
307 | 'params' => $params
308 | ];
309 | }
310 | $commands = $this->buildCommands('crm.contact.update', $commandParams);
311 | $result = $this->batchRequest($commands);
312 |
313 | // Сравниваем число команд и число статусов в ответе
314 | $sent = count($commandParams);
315 | $received = count($result);
316 | if ($received != $sent) {
317 | $jsonResponse = $this->toJSON($this->lastResponse);
318 | throw new Bitrix24APIException(
319 | "Невозможно пакетно обновить контакты ({$sent}/{$received}): {$jsonResponse}"
320 | );
321 | }
322 | }
323 |
324 | return $contactResults;
325 | }
326 |
327 | /**
328 | * Пакетно удаляет контакты
329 | *
330 | * @param array $contactIds Массив Id контактов
331 | * @return array Массив Id контактов
332 | */
333 | public function deleteContacts(array $contactIds = []): array
334 | {
335 | // Id удаленных контактов
336 | $contactResults = [];
337 |
338 | while ($contactsChunk = array_splice($contactIds, 0, $this->batchSize)) {
339 | $commandParams = [];
340 | foreach ($contactsChunk as $index => $contactId) {
341 | $commandParams[ $index ] = [ 'id' => $contactId ];
342 | $contactResults[] = $contactId;
343 | }
344 | $commands = $this->buildCommands('crm.contact.delete', $commandParams);
345 | $result = $this->batchRequest($commands);
346 |
347 | // Сравниваем число команд и число статусов в ответе
348 | $sent = count($commandParams);
349 | $received = count($result);
350 | if ($received != $sent) {
351 | $jsonResponse = $this->toJSON($this->lastResponse);
352 | throw new Bitrix24APIException(
353 | "Невозможно пакетно удалить контакты ({$sent}/{$received}): {$jsonResponse}"
354 | );
355 | }
356 | }
357 |
358 | return $contactResults;
359 | }
360 | }
361 |
--------------------------------------------------------------------------------
/src/App/Bitrix24/Deal.php:
--------------------------------------------------------------------------------
1 | request('crm.deal.fields');
36 | }
37 |
38 | /**
39 | * Возвращает сделку по ID
40 | *
41 | * @param int|string $dealId ID сделки
42 | * @param array $with Список связанных сущностей,
43 | * возвращаемых вместе со сделкой [ self::$WITH_CONTACTS, self::$WITH_PRODUCTS ]
44 | * @return array
45 | */
46 | public function getDeal($dealId, array $with = [])
47 | {
48 | $with = array_map('strtoupper', $with);
49 |
50 | if (empty($with)) {
51 | return $this->request(
52 | 'crm.deal.get',
53 | [ 'id' => $dealId ]
54 | );
55 | }
56 |
57 | $commands = [
58 | 'DEAL' => $this->buildCommand('crm.deal.get', [ 'id' => $dealId ])
59 | ];
60 |
61 | // Связанные товары
62 | if (in_array(self::$WITH_PRODUCTS, $with)) {
63 | $commands[self::$WITH_PRODUCTS] = $this->buildCommand('crm.deal.productrows.get', [ 'id' => $dealId ]);
64 | }
65 |
66 | // Связанные контакты
67 | if (in_array(self::$WITH_CONTACTS, $with)) {
68 | $commands[self::$WITH_CONTACTS] = $this->buildCommand('crm.deal.contact.items.get', [ 'id' => $dealId ]);
69 | }
70 |
71 | $result = $this->batchRequest($commands, true);
72 |
73 | return $this->createResultWith($result, 'DEAL', $with);
74 | }
75 |
76 | /**
77 | * Добавляет сделку
78 | *
79 | * @param array $fields Список полей сделки
80 | * @param array $params Параметры для сделки
81 | * @return int
82 | */
83 | public function addDeal(array $fields = [], array $params = [])
84 | {
85 | $result = $this->request(
86 | 'crm.deal.add',
87 | [
88 | 'fields' => $fields,
89 | 'params' => $params
90 | ]
91 | );
92 | return $result;
93 | }
94 |
95 | /**
96 | * Обновляет сделку
97 | *
98 | * @param int|string $dealId ID сделки
99 | * @param array $fields Список полей сделки
100 | * @param array $params Параметры для сделки
101 | * @return int
102 | */
103 | public function updateDeal($dealId, array $fields = [], array $params = [])
104 | {
105 | $result = $this->request(
106 | 'crm.deal.update',
107 | [
108 | 'id' => $dealId,
109 | 'fields' => $fields,
110 | 'params' => $params
111 | ]
112 | );
113 | return $result;
114 | }
115 |
116 | /**
117 | * Удаляет сделку по ID
118 | *
119 | * @param int|string $dealId ID сделки
120 | * @return int
121 | */
122 | public function deleteDeal($dealId)
123 | {
124 | $result = $this->request(
125 | 'crm.deal.delete',
126 | [ 'id' => $dealId ]
127 | );
128 | return $result;
129 | }
130 |
131 | /**
132 | * Возвращает все сделки
133 | *
134 | * @param array $filter Параметры фильтрации
135 | * @param array $order Параметры
136 | * сортировки
137 | * @param array $select Параметры выборки
138 | * @return Generator
139 | * @see https://dev.1c-bitrix.ru/rest_help/crm/cdeals/crm_deal_list.php
140 | */
141 | public function getDealList(array $filter = [], array $select = [], array $order = []): Generator
142 | {
143 | $params = [
144 | 'order' => $order,
145 | 'filter' => $filter,
146 | 'select' => $select
147 | ];
148 |
149 | return $this->getList('crm.deal.list', $params);
150 | }
151 |
152 | /**
153 | * Возвращает все сделки используя быстрый метод
154 | *
155 | * @see https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php
156 | * @param array $filter Параметры фильтрации
157 | * @param array $order Параметры
158 | * сортировки
159 | * @param array $select Параметры выборки
160 | * @return Generator
161 | * @see https://dev.1c-bitrix.ru/rest_help/crm/cdeals/crm_deal_list.php
162 | */
163 | public function fetchDealList(array $filter = [], array $select = [], array $order = []): Generator
164 | {
165 | $params = [
166 | 'order' => $order,
167 | 'filter' => $filter,
168 | 'select' => $select
169 | ];
170 |
171 | return $this->fetchList('crm.deal.list', $params);
172 | }
173 |
174 | // ------------------------------------------------------------------------
175 |
176 | /**
177 | * Возвращает контакты, связанные со сделкой по ID сделки
178 | *
179 | * @param int|string $dealId ID сделки
180 | * @return array
181 | */
182 | public function getDealContactItems($dealId)
183 | {
184 | $result = $this->request(
185 | 'crm.deal.contact.items.get',
186 | [ 'id' => $dealId ]
187 | );
188 |
189 | return $result;
190 | }
191 |
192 | /**
193 | * Устанавливает контакты, связанные со сделкой по ID сделки
194 | *
195 | * @param int|string $dealId ID сделки
196 | * @param array $contacts Массив контактов
197 | * @return array
198 | */
199 | public function setDealContactItems($dealId, array $contacts)
200 | {
201 | $result = $this->request(
202 | 'crm.deal.contact.items.set',
203 | [
204 | 'id' => $dealId,
205 | 'items' => $contacts
206 | ]
207 | );
208 | return $result;
209 | }
210 |
211 | // ------------------------------------------------------------------------
212 |
213 | /**
214 | * Возвращает товарные позиции, связанные со сделкой по ID сделки
215 | *
216 | * @param int|string $dealId ID сделки
217 | * @return array
218 | */
219 | public function getDealProductRows($dealId)
220 | {
221 | $result = $this->request(
222 | 'crm.deal.productrows.get',
223 | [ 'id' => $dealId ]
224 | );
225 |
226 | return $result;
227 | }
228 |
229 | /**
230 | * Устанавливает товарные позиции, связанные со сделкой по ID сделки
231 | *
232 | * @param int|string $dealId ID сделки
233 | * @param array $products Массив товаров
234 | * @return array
235 | */
236 | public function setDealProductRows($dealId, array $products)
237 | {
238 | $result = $this->request(
239 | 'crm.deal.productrows.set',
240 | [
241 | 'id' => $dealId,
242 | 'rows' => $products
243 | ]
244 | );
245 |
246 | return $result;
247 | }
248 |
249 | // ------------------------------------------------------------------------
250 |
251 | /**
252 | * Пакетно добавляет сделки c товарными позициями
253 | *
254 | * @param array $deals Массив сделок (поля связанных сущностей [ 'COMPANY_ID', 'CONTACT_ID', 'PRODUCTS' ])
255 | * @param array $params Параметры сделок
256 | * @return array Массив id сделок
257 | */
258 | public function addDeals(array $deals = [], array $params = []): array
259 | {
260 | // Id созданных сделок
261 | $dealResults = [];
262 |
263 | while ($dealsChunk = array_splice($deals, 0, $this->batchSize)) {
264 | // Формируем массив команд на добавление сделок
265 | $commandParams = [];
266 | foreach ($dealsChunk as $index => $deal) {
267 | $commandParams[ $index ] = [
268 | 'fields' => $deal,
269 | 'params' => $params
270 | ];
271 | }
272 | $commands = $this->buildCommands('crm.deal.add', $commandParams);
273 | $dealResult = $this->batchRequest($commands);
274 |
275 | // Сравниваем число команд и число Id созданных сделок в ответе
276 | $sent = count($commandParams);
277 | $received = count($dealResult);
278 | if ($received != $sent) {
279 | $jsonResponse = $this->toJSON($this->lastResponse);
280 | throw new Bitrix24APIException(
281 | "Невозможно пакетно добавить сделки ({$sent}/{$received}): {$jsonResponse}"
282 | );
283 | }
284 |
285 | // Формируем массив команд на добавление товаров к сделкам
286 | $commandParams = [];
287 | foreach ($dealsChunk as $index => $deal) {
288 | // Пропускаем сделки без поля PRODUCTS или без товаров
289 | if (
290 | ! isset($deal['PRODUCTS'])
291 | || ! is_array($deal['PRODUCTS'])
292 | || count($deal['PRODUCTS']) == 0
293 | ) {
294 | continue;
295 | }
296 |
297 | $commandParams[ $index ] = [
298 | 'id' => $dealResult[ $index ],
299 | 'rows' => $deal['PRODUCTS']
300 | ];
301 | }
302 | $commands = $this->buildCommands('crm.deal.productrows.set', $commandParams);
303 | $productResult = $this->batchRequest($commands);
304 |
305 | // Сравниваем число команд и число статусов в ответе
306 | $sent = count($commandParams);
307 | $received = count($productResult);
308 | if ($received != $sent) {
309 | $jsonResponse = $this->toJSON($this->lastResponse);
310 | throw new Bitrix24APIException(
311 | "Невозможно пакетно добавить товары к сделкам ({$sent}/{$received}): {$jsonResponse}"
312 | );
313 | }
314 |
315 | // Сохраняем Id созданных сделок
316 | $dealResults = array_merge($dealResults, $dealResult);
317 | }
318 |
319 | return $dealResults;
320 | }
321 |
322 | /**
323 | * Пакетно обновляет сделки c товарными позициями
324 | *
325 | * @param array $deals Массив сделок (поля связанных сущностей [
326 | * 'COMPANY_ID', 'CONTACT_ID', 'PRODUCTS' ])
327 | * Если в сделке много
328 | * контактов, а в запросе на обновление сделки
329 | * передано поле CONTACT_ID, то после обновления в
330 | * сделке остается только 1 контакт или 0
331 | * контактов, если CONTACT_ID пуст.
332 | *
333 | * @param array $params Параметры сделок
334 | * @return array Массив id сделок
335 | */
336 | public function updateDeals(array $deals = [], array $params = []): array
337 | {
338 | // Id обновленных сделок
339 | $dealResults = [];
340 |
341 | while ($dealsChunk = array_splice($deals, 0, $this->batchSize)) {
342 | // Формируем массив команд на обновление сделок
343 | $commandParams = [];
344 | foreach ($dealsChunk as $index => $deal) {
345 | // Проверка наличия поля ID в сделке на обновление
346 | $dealId = $deal['ID'] ?? null;
347 | if (empty($dealId)) {
348 | $jsonDeal = $this->toJSON($deal);
349 | throw new Bitrix24APIException(
350 | "Поле 'ID' в сделке (index {$index}) на обновление отсутствует или пустое: '{$jsonDeal}'"
351 | );
352 | }
353 | $dealResults[] = $dealId;
354 |
355 | $commandParams[ $index ] = [
356 | 'id' => $dealId,
357 | 'fields' => $deal,
358 | 'params' => $params
359 | ];
360 | }
361 | $commands = $this->buildCommands('crm.deal.update', $commandParams);
362 | $dealResult = $this->batchRequest($commands);
363 |
364 | // Сравниваем число команд и число успешных статусов в ответе
365 | $sent = count($commandParams);
366 | $received = count($dealResult);
367 | if ($received != $sent) {
368 | $jsonResponse = $this->toJSON($this->lastResponse);
369 | throw new Bitrix24APIException(
370 | "Невозможно пакетно обновить сделки ({$sent}/{$received}): {$jsonResponse}"
371 | );
372 | }
373 |
374 | // Формируем массив команд на обновление товаров в сделках
375 | $commandParams = [];
376 | foreach ($dealsChunk as $index => $deal) {
377 | // Пропускаем сделки без поля PRODUCTS
378 | if (
379 | ! isset($deal['PRODUCTS'])
380 | || ! is_array($deal['PRODUCTS'])
381 | ) {
382 | continue;
383 | }
384 |
385 | // Если сделка без товаров, удаляем товары в существующей сделке
386 | $products = count($deal['PRODUCTS']) ? $deal['PRODUCTS'] : [];
387 |
388 | $commandParams[ $index ] = [
389 | 'id' => $deal['ID'],
390 | 'rows' => $products
391 | ];
392 | }
393 | $commands = $this->buildCommands('crm.deal.productrows.set', $commandParams);
394 | $productResult = $this->batchRequest($commands);
395 |
396 | // Сравниваем число команд и число статусов в ответе
397 | $sent = count($commandParams);
398 | $received = count($productResult);
399 | if ($received != $sent) {
400 | $jsonResponse = $this->toJSON($this->lastResponse);
401 | throw new Bitrix24APIException(
402 | "Невозможно пакетно обновить товары в сделках ({$sent}/{$received}): {$jsonResponse}"
403 | );
404 | }
405 | }
406 |
407 | return $dealResults;
408 | }
409 |
410 | /**
411 | * Пакетно удаляет сделки
412 | *
413 | * @param array $dealIds Массив id сделок
414 | * @return array Массив id сделок
415 | */
416 | public function deleteDeals(array $dealIds = []): array
417 | {
418 | // Id удаленных сделок
419 | $dealResults = [];
420 |
421 | while ($dealsChunk = array_splice($dealIds, 0, $this->batchSize)) {
422 | // Формируем массив команд на удаление сделок
423 | $commandParams = [];
424 | foreach ($dealsChunk as $index => $dealId) {
425 | $commandParams[ $index ] = [ 'id' => $dealId ];
426 | $dealResults[] = $dealId;
427 | }
428 |
429 | $commands = $this->buildCommands('crm.deal.delete', $commandParams);
430 | $dealResult = $this->batchRequest($commands);
431 |
432 | // Сравниваем число команд и число успешных статусов в ответе
433 | $sent = count($commandParams);
434 | $received = count($dealResult);
435 | if ($received != $sent) {
436 | $jsonResponse = $this->toJSON($this->lastResponse);
437 | throw new Bitrix24APIException(
438 | "Невозможно пакетно удалить сделки ({$sent}/{$received}): {$jsonResponse}"
439 | );
440 | }
441 | }
442 |
443 | return $dealResults;
444 | }
445 |
446 | // ------------------------------------------------------------------------
447 |
448 | /**
449 | * Устанавливает файл в НЕ множественное пользовательское поле типа файл (файл нельзя удалить)
450 | *
451 | * @param int|string $dealId Id cделки
452 | * @param int|string $userFieldId Id НЕ множественного пользовательского поля в сделке ('UF_CRM_XXXXXXXXXX')
453 | * @param string $fileName Имя файла
454 | * @param string $fileContent Raw данные файла
455 | * @param bool $isBase64FileData Raw данные файла закодированы base64?
456 | * @return int
457 | * @see https://dev.1c-bitrix.ru/rest_help/crm/cases/edit/form_lead_with_files.php
458 | */
459 | public function setDealFile(
460 | $dealId,
461 | $userFieldId,
462 | string $fileName,
463 | string $fileContent,
464 | bool $isBase64FileData = true
465 | ) {
466 |
467 | if (! $isBase64FileData) {
468 | $fileContent = base64_encode($fileContent);
469 | }
470 |
471 | $fields = [
472 | $userFieldId => [ 'fileData' => [ $fileName, $fileContent ] ]
473 | ];
474 |
475 | $result = $this->updateDeal($dealId, $fields);
476 |
477 | return $result;
478 | }
479 |
480 | /**
481 | * Устанавливает файлы во множественное пользовательское поле типа файл (файлы можно удалить)
482 | *
483 | * @param int|string $dealId Id cделки
484 | * @param int|string $userFieldId Id множественного пользовательского поля в сделке ('UF_CRM_XXXXXXXXXX')
485 | * @param array $files Массив параметров файлов ([ [ <Имя файла>, ], ... ])
486 | * (пустой массив для удаления всех файлов).
487 | * @param bool $isBase64FileData Raw данные файла закодированы base64?
488 | * @return int
489 | * @see https://dev.1c-bitrix.ru/rest_help/crm/cases/edit/form_lead_with_files.php
490 | */
491 | public function setDealFiles(
492 | $dealId,
493 | $userFieldId,
494 | array $files = [],
495 | bool $isBase64FileData = true
496 | ) {
497 |
498 | $userFieldValue = [];
499 | foreach ($files as $file) {
500 | if (! $isBase64FileData) {
501 | $file[1] = base64_encode($file[1]);
502 | }
503 | $userFieldValue[] = [
504 | 'fileData' => $file
505 | ];
506 | }
507 |
508 | // Если удаление всех файлов
509 | if (! count($userFieldValue)) {
510 | $userFieldValue = '';
511 | }
512 |
513 | $fields = [
514 | $userFieldId => $userFieldValue
515 | ];
516 |
517 | $result = $this->updateDeal($dealId, $fields);
518 |
519 | return $result;
520 | }
521 | }
522 |
--------------------------------------------------------------------------------
/src/App/Bitrix24/Disk.php:
--------------------------------------------------------------------------------
1 | $filter
37 | ];
38 |
39 | return $this->getList('disk.storage.getlist', $params);
40 | }
41 |
42 | /**
43 | * Возвращает список файлов и папок, которые находятся непосредственно в корне хранилища
44 | *
45 | * @param int|string $storageId Id хранилища
46 | * @param array $filter Параметры
47 | * фильтрации
48 | * @return array
49 | */
50 | public function getDiskStorageChildren($storageId, array $filter = [])
51 | {
52 | $result = $this->request(
53 | 'disk.storage.getchildren',
54 | [
55 | 'id' => $storageId,
56 | 'filter' => $filter
57 | ]
58 | );
59 |
60 | return $result;
61 | }
62 |
63 | /**
64 | * Загружает новый файл в указанную папку на Диск
65 | *
66 | * @param int|string $folderId Id
67 | * папки
68 | * @param string $fileContent Raw
69 | * данные
70 | * файла
71 | * @param array $data Массив параметров,
72 | * описывающих файл
73 | * (обязательное поле
74 | * NAME - имя нового
75 | * файла)
76 | * @param bool $isBase64FileData Raw данные файла
77 | * закодированы base64?
78 | * @return array
79 | * @see https://dev.1c-bitrix.ru/rest_help/disk/folder/disk_folder_uploadfile.php
80 | */
81 | public function uploadfileDiskFolder(
82 | $folderId,
83 | string $fileContent,
84 | array $data,
85 | bool $isBase64FileData = true
86 | ) {
87 |
88 | if (! $isBase64FileData) {
89 | $fileContent = base64_encode($fileContent);
90 | }
91 |
92 | $result = $this->request(
93 | 'disk.folder.uploadfile',
94 | [
95 | 'id' => $folderId,
96 | 'fileContent' => $fileContent,
97 | 'data' => $data
98 | ]
99 | );
100 |
101 | return $result;
102 | }
103 | }
104 |
--------------------------------------------------------------------------------
/src/App/Bitrix24/Lead.php:
--------------------------------------------------------------------------------
1 | request('crm.lead.fields');
34 | }
35 |
36 | /**
37 | * Возвращает лид по ID
38 | * @param int|string $leadId ID лида
39 | * @param array $with Список связанных сущностей,
40 | * возвращаемых вместе с лидом [ self::$WITH_PRODUCTS ]
41 | * @return array
42 | */
43 | public function getLead($leadId, array $with = [])
44 | {
45 | $with = array_map('strtoupper', $with);
46 |
47 | if (empty($with)) {
48 | return $this->request(
49 | 'crm.lead.get',
50 | [ 'id' => $leadId ]
51 | );
52 | }
53 |
54 | $commands = [
55 | 'LEAD' => $this->buildCommand('crm.lead.get', [ 'id' => $leadId ])
56 | ];
57 |
58 | // Связанные товары
59 | if (in_array(self::$WITH_PRODUCTS, $with)) {
60 | $commands[self::$WITH_PRODUCTS] = $this->buildCommand(
61 | 'crm.lead.productrows.get',
62 | [ 'id' => $leadId ]
63 | );
64 | }
65 |
66 | $result = $this->batchRequest($commands, true);
67 |
68 | return $this->createResultWith($result, 'LEAD', $with);
69 | }
70 |
71 | /**
72 | * Добавляет лид
73 | *
74 | * @param array $fields Список полей лида
75 | * @param array $params Параметры для лида
76 | * @return int
77 | */
78 | public function addLead(array $fields = [], array $params = [])
79 | {
80 | $result = $this->request(
81 | 'crm.lead.add',
82 | [
83 | 'fields' => $fields,
84 | 'params' => $params
85 | ]
86 | );
87 | return $result;
88 | }
89 |
90 | /**
91 | * Обновляет лид
92 | *
93 | * @param int|string $leadId ID лида
94 | * @param array $fields Список
95 | * полей
96 | * лида
97 | * @param array $params Параметры
98 | * для лида
99 | * @return int
100 | */
101 | public function updateLead($leadId, array $fields = [], array $params = [])
102 | {
103 | $result = $this->request(
104 | 'crm.lead.update',
105 | [
106 | 'id' => $leadId,
107 | 'fields' => $fields,
108 | 'params' => $params
109 | ]
110 | );
111 | return $result;
112 | }
113 |
114 | /**
115 | * Удаляет лид по ID
116 | *
117 | * @param int|string $leadId ID лида
118 | * @return int
119 | */
120 | public function deleteLead($leadId)
121 | {
122 | $result = $this->request(
123 | 'crm.lead.delete',
124 | [ 'id' => $leadId ]
125 | );
126 | return $result;
127 | }
128 |
129 | /**
130 | * Возвращает все лиды
131 | *
132 | * @param array $filter Параметры фильтрации
133 | * @param array $order Параметры
134 | * сортировки
135 | * @param array $select Параметры выборки
136 | * @return Generator
137 | * @see https://dev.1c-bitrix.ru/rest_help/crm/leads/crm_lead_list.php
138 | */
139 | public function getLeadList(array $filter = [], array $select = [], array $order = []): Generator
140 | {
141 | $params = [
142 | 'order' => $order,
143 | 'filter' => $filter,
144 | 'select' => $select
145 | ];
146 |
147 | return $this->getList('crm.lead.list', $params);
148 | }
149 |
150 | /**
151 | * Возвращает все лиды используя быстрый метод
152 | *
153 | * @param array $filter Параметры фильтрации
154 | * @param array $order Параметры
155 | * сортировки
156 | * @param array $select Параметры выборки
157 | * @return Generator
158 | * @see https://dev.1c-bitrix.ru/rest_help/crm/leads/crm_lead_list.php
159 | */
160 | public function fetchLeadList(array $filter = [], array $select = [], array $order = []): Generator
161 | {
162 | $params = [
163 | 'order' => $order,
164 | 'filter' => $filter,
165 | 'select' => $select
166 | ];
167 |
168 | return $this->fetchList('crm.lead.list', $params);
169 | }
170 |
171 | // ------------------------------------------------------------------------
172 |
173 | /**
174 | * Возвращает товарные позиции, связанные с лидом по ID лида
175 | *
176 | * @param int|string $leadId ID лида
177 | * @return array
178 | */
179 | public function getLeadProductRows($leadId)
180 | {
181 | $result = $this->request(
182 | 'crm.lead.productrows.get',
183 | [ 'id' => $leadId ]
184 | );
185 | return $result;
186 | }
187 |
188 | /**
189 | * Устанавливает товарные позиции, связанные с лидом по ID лида
190 | *
191 | * @param int|string $leadId ID лида
192 | * @param array $products Массив товаров
193 | * @return array
194 | */
195 | public function setLeadProductRows($leadId, array $products)
196 | {
197 | $result = $this->request(
198 | 'crm.lead.productrows.set',
199 | [
200 | 'id' => $leadId,
201 | 'rows' => $products
202 | ]
203 | );
204 | return $result;
205 | }
206 | }
207 |
--------------------------------------------------------------------------------
/src/App/Bitrix24/Product.php:
--------------------------------------------------------------------------------
1 | request('crm.product.fields');
36 | }
37 |
38 | /**
39 | * Возвращает товар по ID
40 | *
41 | * @param int|string $productId ID товара
42 | * @return array
43 | */
44 | public function getProduct($productId)
45 | {
46 | $product = $this->request(
47 | 'crm.product.get',
48 | [ 'id' => $productId ]
49 | );
50 |
51 | return $product;
52 | }
53 |
54 | /**
55 | * Добавляет товар
56 | *
57 | * @param array $fields Список полей товара
58 | * @return int
59 | */
60 | public function addProduct(array $fields = [])
61 | {
62 | $result = $this->request(
63 | 'crm.product.add',
64 | [
65 | 'fields' => $fields
66 | ]
67 | );
68 |
69 | return $result;
70 | }
71 |
72 | /**
73 | * Обновляет товар
74 | *
75 | * @param int|string $productId ID товара
76 | * @param array $fields Список
77 | * полей
78 | * товара
79 | * @return int
80 | */
81 | public function updateProduct($productId, array $fields = [])
82 | {
83 | $result = $this->request(
84 | 'crm.product.update',
85 | [
86 | 'id' => $productId,
87 | 'fields' => $fields
88 | ]
89 | );
90 |
91 | return $result;
92 | }
93 |
94 | /**
95 | * Удаляет товар по ID
96 | *
97 | * @param string|int $productId ID товара
98 | * @return array
99 | */
100 | public function deleteProduct($productId)
101 | {
102 | $result = $this->request(
103 | 'crm.product.delete',
104 | [ 'id' => $productId ]
105 | );
106 |
107 | return $result;
108 | }
109 |
110 | /**
111 | * Возвращает все товары
112 | *
113 | * @param array $filter Параметры фильтрации
114 | * @param array $order Параметры
115 | * сортировки
116 | * @param array $select Параметры выборки
117 | * @return Generator
118 | */
119 | public function getProductList(
120 | array $filter = [],
121 | array $select = [ '*', 'PROPERTY_*' ],
122 | array $order = []
123 | ): Generator {
124 | $params = [
125 | 'order' => $order,
126 | 'filter' => $filter,
127 | 'select' => $select
128 | ];
129 |
130 | return $this->getList('crm.product.list', $params);
131 | }
132 |
133 | /**
134 | * Возвращает все товары используя быстрый метод
135 | *
136 | * @see https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php
137 | * @param array $filter Параметры фильтрации
138 | * @param array $order Параметры
139 | * сортировки
140 | * @param array $select Параметры выборки
141 | * @return Generator
142 | */
143 | public function fetchProductList(
144 | array $filter = [],
145 | array $select = [ '*', 'PROPERTY_*' ],
146 | array $order = []
147 | ): Generator {
148 | $params = [
149 | 'order' => $order,
150 | 'filter' => $filter,
151 | 'select' => $select
152 | ];
153 |
154 | return $this->fetchList('crm.product.list', $params);
155 | }
156 |
157 |
158 | // ------------------------------------------------------------------------
159 |
160 | /**
161 | * Пакетно добавляет товары
162 | *
163 | * @param array $products Массив товаров
164 | * Секция товаров 'SECTION_ID'
165 | * @return array Массив Id товаров
166 | */
167 | public function addProducts(array $products = []): array
168 | {
169 | // Id добавленных товаров
170 | $productResults = [];
171 |
172 | while ($productsChunk = array_splice($products, 0, $this->batchSize)) {
173 | $commandParams = [];
174 | foreach ($productsChunk as $index => $product) {
175 | $commandParams[] = [ 'fields' => $product ];
176 | }
177 | $commands = $this->buildCommands('crm.product.add', $commandParams);
178 | $result = $this->batchRequest($commands);
179 |
180 | $sent = count($commandParams);
181 | $received = count($result);
182 |
183 | if ($received != $sent) {
184 | $jsonResponse = $this->toJSON($this->lastResponse);
185 | throw new Bitrix24APIException(
186 | "Невозможно пакетно добавить товары ({$sent}/{$received}): {$jsonResponse}"
187 | );
188 | }
189 |
190 | $productResults = array_merge($productResults, $result);
191 | }
192 |
193 | return $productResults;
194 | }
195 |
196 | /**
197 | * Пакетно обновляет товары
198 | *
199 | * @param array $products Массив товаров
200 | * @return array Массив Id товаров
201 | */
202 | public function updateProducts(array $products = []): array
203 | {
204 | // Id обновленных товаров
205 | $productResults = [];
206 |
207 | while ($productsChunk = array_splice($products, 0, $this->batchSize)) {
208 | $commandParams = [];
209 | foreach ($productsChunk as $index => $product) {
210 | // Проверка наличия поля ID в товаре на добавление
211 | $productId = $product['ID'] ?? null;
212 | if (empty($productId)) {
213 | $jsonProduct = $this->toJSON($product);
214 | throw new Bitrix24APIException(
215 | "Поле 'ID' в товаре (index {$index}) на обновление отсутствует или пустое: '{$jsonProduct}'"
216 | );
217 | }
218 | $productResults[] = $productId;
219 |
220 | $commandParams[] = [
221 | 'id' => $productId,
222 | 'fields' => $product
223 | ];
224 | }
225 | $commands = $this->buildCommands('crm.product.update', $commandParams);
226 | $result = $this->batchRequest($commands);
227 |
228 | $sent = count($commandParams);
229 | $received = count($result);
230 |
231 | if ($received != $sent) {
232 | $jsonResponse = $this->toJSON($this->lastResponse);
233 | throw new Bitrix24APIException(
234 | "Невозможно пакетно обновить товары ({$sent}/{$received}): {$jsonResponse}"
235 | );
236 | }
237 | }
238 |
239 | return $productResults;
240 | }
241 |
242 | /**
243 | * Пакетно удаляет товары
244 | *
245 | * @param array $productIds Массив Id товаров
246 | * @return array Массив Id товаров
247 | */
248 | public function deleteProducts(array $productIds = []): array
249 | {
250 | // Id удаленных товаров
251 | $productResults = [];
252 |
253 | while ($productsChunk = array_splice($productIds, 0, $this->batchSize)) {
254 | $commandParams = [];
255 | foreach ($productsChunk as $index => $productId) {
256 | $commandParams[] = [ 'id' => $productId ];
257 | $productResults[] = $productId;
258 | }
259 | $commands = $this->buildCommands('crm.product.delete', $commandParams);
260 | $result = $this->batchRequest($commands);
261 |
262 | $sent = count($commandParams);
263 | $received = count($result);
264 |
265 | if ($received != $sent) {
266 | $jsonResponse = $this->toJSON($this->lastResponse);
267 | throw new Bitrix24APIException(
268 | "Невозможно пакетно удалить товары ({$sent}/{$received}): {$jsonResponse}"
269 | );
270 | }
271 | }
272 |
273 | return $productResults;
274 | }
275 | }
276 |
--------------------------------------------------------------------------------
/src/App/Bitrix24/ProductRow.php:
--------------------------------------------------------------------------------
1 | request('crm.productrow.fields');
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/App/Bitrix24/ProductSection.php:
--------------------------------------------------------------------------------
1 | request('crm.productsection.fields');
35 | }
36 |
37 | /**
38 | * Возвращает раздел товаров по ID
39 | *
40 | * @param int|string $productSectionId ID раздела товаров
41 | * @return array
42 | */
43 | public function getProductSection($productSectionId)
44 | {
45 | $productSection = $this->request(
46 | 'crm.productsection.get',
47 | [ 'id' => $productSectionId ]
48 | );
49 |
50 | return $productSection;
51 | }
52 |
53 | /**
54 | * Добавляет раздел товаров
55 | *
56 | * @param array $fields Список полей раздела товаров
57 | * @return int
58 | */
59 | public function addProductSection(array $fields = [])
60 | {
61 | $result = $this->request(
62 | 'crm.productsection.add',
63 | [
64 | 'fields' => $fields
65 | ]
66 | );
67 |
68 | return $result;
69 | }
70 |
71 | /**
72 | * Обновляет раздел товаров
73 | *
74 | * @param int|string $productSectionId ID раздела товаров
75 | * @param array $fields Список
76 | * полей
77 | * раздела
78 | * товаров
79 | * @return int
80 | */
81 | public function updateProductSection($productSectionId, array $fields = [])
82 | {
83 | $result = $this->request(
84 | 'crm.productsection.update',
85 | [
86 | 'id' => $productSectionId,
87 | 'fields' => $fields
88 | ]
89 | );
90 |
91 | return $result;
92 | }
93 |
94 | /**
95 | * Удаляет раздел товаров по ID
96 | *
97 | * @param int|string $productSectionId ID раздела товаров
98 | * @return int
99 | */
100 | public function deleteProductSection($productSectionId)
101 | {
102 | $result = $this->request(
103 | 'crm.product.delete',
104 | [ 'id' => $productSectionId ]
105 | );
106 |
107 | return $result;
108 | }
109 |
110 | /**
111 | * Возвращает все разделы товары
112 | *
113 | * @param array $order Параметры
114 | * сортировки
115 | * @param array $filter Параметры фильтрации
116 | * @param array $select Параметры выборки
117 | * @return Generator
118 | */
119 | public function getProductSectionList(array $filter = [], array $select = [], array $order = []): Generator
120 | {
121 | $params = [
122 | 'order' => $order,
123 | 'filter' => $filter,
124 | 'select' => $select
125 | ];
126 |
127 | return $this->getList('crm.productsection.list', $params);
128 | }
129 |
130 | /**
131 | * Возвращает все разделы товары используя быстрый метод
132 | *
133 | * @see https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php
134 | * @param array $order Параметры
135 | * сортировки
136 | * @param array $filter Параметры фильтрации
137 | * @param array $select Параметры выборки
138 | * @return Generator
139 | */
140 | public function fetchProductSectionList(array $filter = [], array $select = [], array $order = []): Generator
141 | {
142 | $params = [
143 | 'order' => $order,
144 | 'filter' => $filter,
145 | 'select' => $select
146 | ];
147 |
148 | return $this->fetchList('crm.productsection.list', $params);
149 | }
150 |
151 | // ------------------------------------------------------------------------
152 |
153 | /**
154 | * Пакетно добавляет разделы товары
155 | *
156 | * @param array $productSections Массив разделов товаров
157 | * @return array Массив Id разделов товаров
158 | */
159 | public function addProductSections(array $productSections = []): array
160 | {
161 | // Id добавленных разделов товаров
162 | $productSectionResults = [];
163 |
164 | while ($productSectionsChunk = array_splice($productSections, 0, $this->batchSize)) {
165 | $commandParams = [];
166 | foreach ($productSectionsChunk as $index => $productSection) {
167 | $commandParams[] = [ 'fields' => $productSection ];
168 | }
169 | $commands = $this->buildCommands('crm.productsection.add', $commandParams);
170 | $result = $this->batchRequest($commands);
171 |
172 | $sent = count($commandParams);
173 | $received = count($result);
174 |
175 | if ($received != $sent) {
176 | $jsonResponse = $this->toJSON($this->lastResponse);
177 | throw new Bitrix24APIException(
178 | "Невозможно пакетно добавить разделы товаров ({$sent}/{$received}): {$jsonResponse}"
179 | );
180 | }
181 |
182 | $productSectionResults = array_merge($productSectionResults, $result);
183 | }
184 |
185 | return $productSectionResults;
186 | }
187 |
188 | /**
189 | * Пакетно обновляет разделы товаров
190 | *
191 | * @param array $productSections Массив разделов товаров
192 | * @return array Массив Id разделов товаров
193 | */
194 | public function updateProductSections(array $productSections = []): array
195 | {
196 | // Id обновленных разделов товаров
197 | $productSectionResults = [];
198 |
199 | while ($productSectionsChunk = array_splice($productSections, 0, $this->batchSize)) {
200 | $commandParams = [];
201 | foreach ($productSectionsChunk as $index => $productSection) {
202 | // Проверка наличия поля ID в товаре на добавление
203 | $productSectionId = $productSection['ID'] ?? null;
204 | if (empty($productSectionId)) {
205 | $jsonProductSection = $this->toJSON($productSection);
206 | throw new Bitrix24APIException(
207 | "Поле 'ID' в разделе товаров (index {$index}) на обновление " .
208 | "отсутствует или пустое: '{$jsonProductSection}'"
209 | );
210 | }
211 | $productSectionResults[] = $productSectionId;
212 |
213 | $commandParams[] = [
214 | 'id' => $productSectionId,
215 | 'fields' => $productSection
216 | ];
217 | }
218 | $commands = $this->buildCommands('crm.productsection.update', $commandParams);
219 | $result = $this->batchRequest($commands);
220 |
221 | $sent = count($commandParams);
222 | $received = count($result);
223 |
224 | if ($received != $sent) {
225 | $jsonResponse = $this->toJSON($this->lastResponse);
226 | throw new Bitrix24APIException(
227 | "Невозможно пакетно обновить раздел товаров ({$sent}/{$received}): {$jsonResponse}"
228 | );
229 | }
230 | }
231 |
232 | return $productSectionResults;
233 | }
234 |
235 | /**
236 | * Пакетно удаляет разделы товаров
237 | *
238 | * @param array $productSectionIds Массив Id разделов товаров
239 | * @return array Массив Id разделов товаров
240 | */
241 | public function deleteProductSections(array $productSectionIds = []): array
242 | {
243 | // Id удаленных разделов товаров
244 | $productSectionResults = [];
245 |
246 | while ($productSectionsChunk = array_splice($productSectionIds, 0, $this->batchSize)) {
247 | $commandParams = [];
248 | foreach ($productSectionsChunk as $index => $productSectionId) {
249 | $commandParams[] = [ 'id' => $productSectionId ];
250 | $productSectionResults[] = $productSectionId;
251 | }
252 | $commands = $this->buildCommands('crm.productsection.delete', $commandParams);
253 | $result = $this->batchRequest($commands);
254 |
255 | $sent = count($commandParams);
256 | $received = count($result);
257 |
258 | if ($received != $sent) {
259 | $jsonResponse = $this->toJSON($this->lastResponse);
260 | throw new Bitrix24APIException(
261 | "Невозможно пакетно удалить разделы товаров ({$sent}/{$received}): {$jsonResponse}"
262 | );
263 | }
264 | }
265 |
266 | return $productSectionResults;
267 | }
268 | }
269 |
--------------------------------------------------------------------------------
/src/App/Bitrix24/Task.php:
--------------------------------------------------------------------------------
1 | request('tasks.task.getFields');
34 | }
35 |
36 | /**
37 | * Возвращает задачу по ID
38 | *
39 | * @param int|string $taskId ID задачи
40 | * @param array $select Параметры
41 | * выборки
42 | * @return array|null
43 | */
44 | public function getTask($taskId, array $select = [])
45 | {
46 | $task = $this->request(
47 | 'tasks.task.get',
48 | [
49 | 'taskId' => $taskId,
50 | 'select' => $select
51 | ]
52 | );
53 |
54 | return $task;
55 | }
56 |
57 | /**
58 | * Возвращает все задачи
59 | *
60 | * @param array $filter Параметры фильтрации
61 | * @param array $order Параметры
62 | * сортировки
63 | * @param array $select Параметры выборки
64 | * @return Generator
65 | * @see https://dev.1c-bitrix.ru/rest_help/tasks/task/tasks/tasks_task_list.php
66 | */
67 | public function getTaskList(array $filter = [], array $select = [], array $order = []): Generator
68 | {
69 | $params = [
70 | 'order' => $order,
71 | 'filter' => $filter,
72 | 'select' => $select
73 | ];
74 |
75 | return $this->getList('tasks.task.list', $params);
76 | }
77 |
78 | /**
79 | * Добавляет задачу
80 | *
81 | * @param array $fields Список полей задачи
82 | * @return int
83 | */
84 | public function addTask(array $fields = [])
85 | {
86 | $result = $this->request(
87 | 'tasks.task.add',
88 | [
89 | 'fields' => $fields
90 | ]
91 | );
92 |
93 | return $result;
94 | }
95 |
96 | // ------------------------------------------------------------------------
97 |
98 | /**
99 | * Пакетно добавляет задачи
100 | *
101 | * @param array $companies Массив параметров задач
102 | * @return array Массив id активностей
103 | */
104 | public function addTasks(array $tasks = []): array
105 | {
106 | // Id добавленных задач
107 | $taskResults = [];
108 |
109 | while ($tasksChunk = array_splice($tasks, 0, $this->batchSize)) {
110 | // Формируем массив команд на добавление задач
111 | $commandParams = [];
112 | foreach ($tasksChunk as $index => $task) {
113 | $commandParams[ $index ] = [
114 | 'fields' => $task
115 | ];
116 | }
117 | $commands = $this->buildCommands('tasks.task.add', $commandParams);
118 | $taskResult = $this->batchRequest($commands);
119 |
120 | // Сравниваем число команд и число id в ответе
121 | $sent = count($commandParams);
122 | $received = count($taskResult);
123 | if ($received != $sent) {
124 | $jsonResponse = $this->toJSON($this->lastResponse);
125 | throw new Bitrix24APIException(
126 | "Невозможно пакетно добавить задачи ({$sent}/{$received}): {$jsonResponse}"
127 | );
128 | }
129 |
130 | $taskResults = array_merge($taskResults, $taskResult);
131 | }
132 |
133 | return $taskResults;
134 | }
135 | }
136 |
--------------------------------------------------------------------------------
/src/App/Bitrix24/User.php:
--------------------------------------------------------------------------------
1 | request('user.fields');
36 | }
37 |
38 | /**
39 | * Возвращает пользователя по ID
40 | *
41 | * @param int|string $userId ID пользователя
42 | * @return array|null
43 | */
44 | public function getUser($userId)
45 | {
46 | $result = $this->request('user.get', [ 'ID' => $userId ]);
47 | $user = array_shift($result);
48 |
49 | return $user;
50 | }
51 |
52 | /**
53 | * Возвращает всех пользователей
54 | *
55 | * @param array $filter Параметры
56 | * фильтрации
57 | * @param string $order Направление
58 | * сортировки
59 | * @param string $sort Поле, по которому
60 | * сортируются
61 | * результаты
62 | * @param bool $adminMode Ключ работы в
63 | * режиме
64 | * администратора
65 | * @return Generator
66 | */
67 | public function getUsers(
68 | array $filter = [],
69 | string $order = 'ASC',
70 | string $sort = '',
71 | bool $adminMode = false
72 | ): Generator {
73 |
74 | $params = [
75 | 'FILTER' => $filter,
76 | 'order' => $order,
77 | 'sort' => $sort,
78 | 'ADMIN_MODE' => $adminMode
79 | ];
80 |
81 | return $this->getList('user.get', $params);
82 | }
83 | }
84 |
--------------------------------------------------------------------------------