Облачные хранилища стали набирать популярность достаточно давно. Например, сервис OneDrive, в то время он назывался SkyDrive, впервые стал известен для широкой публики в 2007 году, а уже через год доступ к нему имели жители более 60 стран. В том же 2008 году размер предоставляемого места был увеличен до 25 Гб — кажется, что для того времени это неприлично много, но на самом деле компания пошла на этот шаг для того, чтобы сразу интегрировать все свои сервисы с облаком.
Сегодня мы уже привыкли к тому, что отснятые фотографии и видеоролики автоматически сохраняются в облаке: Google Диск для платформы Android или iCloud для устройств от Apple. Сложно представить современную, нацеленную на развитие компанию, где вся документация хранилась бы локально на каждом компьютере, а для обмена информацией использовались бы флешки или электронная почта.
При использовании OneDrive появляется возможность:
- хранить изображения и работать с ними;
- тонко настраивать права доступа других пользователей к папкам и файлам;
- прямо из браузера создавать и работать с документами Word, таблицами Excel и презентациями PowerPoint;
- организовывать совместную работу над проектами.
Выходит, что облачное хранилище, это не просто место, куда можно скинуть старые фото, хранить там различные файлы, которые когда-то могут понадобиться. Облачное хранилище — это серьезный инструмент, который поможет повысить эффективность работы сайта без серьезных инвестиций в покупку собственных серверов и организации нужной инфраструктуры.
Место в облачном хранилище можно использовать так же, как и обычное дисковое пространство физического сервера. Единственное препятствие заключается в том, что изначально Битрикс не дает возможности автоматизировать подключение к сайту сторонних облачных сервисов хранения данных — это нужно сделать самостоятельно, если вы, конечно, обладаете требуемым уровнем квалификации.
Подключение OneDrive к сайту
Рассмотрим на примере конкретной задачи, заключающейся в том, чтобы реализовать синхронизацию списка заявок с формы обратной связи в OneDrive. Основная сложность заключается в короткой жизни токена — это осложняет задачу реализовать загрузку и бесперебойный обмен API с сайтом.
Чтобы ее решить, необходимо выполнить следующее:
- Выгрузить список результатов формы в файл.
- Настроить OneDrive API.
- Интегрировать.
Решение
Создайте папку и в ней файл index.php, содержащий:
if (CModule::IncludeModule("form")){
// ID веб-формы
$FORM_ID = 1;
CForm::GetResultAnswerArray($FORM_ID,
$arrColumns,
$arrAnswers,
$arrAnswersVarname,
false);
foreach ($arrAnswers as $keys => $values) {
$arr[$keys] = $values;
}
foreach ($arr as $key => $value) {
$arrs[] = $value;
}
Установите библиотеку composer require krizalys/onedrive-php-sdk
В созданной папке создайте 3 файла:
- index.php — уже есть.
- config.php.
- redirect.php.
Содержимое файла config.php:
'',
/**
* Your OneDrive client secret.
*/
'ONEDRIVE_CLIENT_SECRET' => '',
/**
* Your OneDrive redirect URI.
*/
'ONEDRIVE_REDIRECT_URI' => 'http://your.domain.com/redirect.php',
];
Содержимое файла Index.php:
#!/usr/bin/php
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
$_SERVER["DOCUMENT_ROOT"] = "/home/bitrix/www";
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
set_time_limit(0);
($config = include __DIR__ . '/config.php') or die('Configuration file not found');
require_once $_SERVER["DOCUMENT_ROOT"] . '/vendor/autoload.php';
use Krizalys\Onedrive\Onedrive;
// Instantiates a OneDrive client bound to your OneDrive application.
$client = Onedrive::client($config['ONEDRIVE_CLIENT_ID']);
// Gets a log in URL with sufficient privileges from the OneDrive API.
$url = $client->getLogInUrl([
'files.read',
'files.read.all',
'files.readwrite',
'files.readwrite.all',
'offline_access',
], $config['ONEDRIVE_REDIRECT_URI']);
session_start();
$client->obtainAccessToken($config['ONEDRIVE_CLIENT_SECRET'], $_GET['code']);
// Persist the OneDrive client' state for next API requests.
$_SESSION['onedrive.client.state'] = $client->getState();
// Redirect the user to the log in URL.
header('HTTP/1.1 302 Found', true, 302);
header("Location: $url");
После этого необходимо настроить кабинет OneDrive:
- Зайдите в Microsoft Azure и пройдите по пути, указанному на скриншотах 1,2 и 3.



2. Пропишите необходимые данные и настройки. Для этого выберите наше приложение

3. Далее выберите:

создайте секрет и скопируйте значение, когда оно полностью показано, его будет видно только один раз, больше вы его не сможете посмотреть.

Вставьте его в config.php
Затем скопируйте ID приложения:
и вставьте в config.php.
После внесения этих настроек остается выполнить еще несколько операций, так как библиотека krizalys / onedrive-php-sdk
была написана с использованием старой версии guzzle, то необходимо будет найти места, где встречается старый метод stream_for
и заменить его на новый метод Utils::streamFor()
.

Загрузка файла
- Откройте файл index.php на сайте — вас перекинет на страницу авторизации (не забудьте указать ссылку редиректа в кабинете приложения).
- После успешной авторизации будет выполнен редирект обратно на страницу Index.php, но уже с GET параметрами, благодаря которым мы получим access_token и refresh_token для того, чтобы в дальнейшем обеспечить бесперебойную авторизацию с OneDrive API.
- Мы проверили успешную генерацию токена, но теперь появился вопрос: «Как сделать автообновление
access_token
OneDrive API?». - Нужно сохранить информацию с токеном в json файл. Для этого допишите функцию
getToken()
и сразу жеsetTokens()
в/vendor/krizalys/onedrive-php-sdk/src/Client.php
- Допишите получение и запись токена OneDrive в json файл:
- После этого еще немного изменим наш код:
В итоге должно получиться вот так:
#!/usr/bin/php
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
$_SERVER["DOCUMENT_ROOT"] = "/home/bitrix/ext_www/jazz-way.ru";
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
set_time_limit(0);
($config = include __DIR__ . '/config.php') or die('Configuration file not found');
require_once $_SERVER["DOCUMENT_ROOT"] . '/vendor/autoload.php';
use Krizalys\Onedrive\Onedrive;
if (CModule::IncludeModule("form")){
// ID веб-формы
$FORM_ID = 1;
CForm::GetResultAnswerArray($FORM_ID,
$arrColumns,
$arrAnswers,
$arrAnswersVarname,
false);
$i = 0;
foreach ($arrAnswers as $keys => $values) {
$arr[$keys] = $values;
}
foreach ($arr as $key => $value) {
$arrs[] = $value;
}
}
$client = Onedrive::client($config['ONEDRIVE_CLIENT_ID']);
// // Gets a log in URL with sufficient privileges from the OneDrive API.
$url = $client->getLogInUrl([
'files.read',
'files.read.all',
'files.readwrite',
'files.readwrite.all',
'offline_access',
], $config['ONEDRIVE_REDIRECT_URI']);
session_start();
// Persist the OneDrive client' state for next API requests.
$curToken = file_get_contents(__DIR__.'/token.json');
$curToken = json_decode($curToken, true);
// $_SESSION['onedrive.client.state'] = ["data"=>$curToken];
$client->setTokens($curToken['access_token']);
$client->renewAccessToken($config['ONEDRIVE_CLIENT_SECRET'], $curToken['refresh_token']);
file_put_contents(__DIR__.'/token.json', \json_encode( $client->getToken() ) );
$openFile = file_get_contents(__DIR__ .'/results_form.xls');
$file = $client->getRoot()->startUpload('results_form.xls', $openFile);
$childDriveItem = $file->complete();
$logs = json_encode($childDriveItem);
file_put_contents('results_form.log', $logs);
Обновите страницу — файл успешно загружен в OneDrive с помощью API.
Варианты использования интеграции
Вариантов огромное множество. По сути, у вас появилась возможность загружать любые файлы в «облако» OneDrive. Оно может служить местом для дополнительного бекапа данных, собираемых с сайта, или для любой другой информации. Кстати! Если у вас есть интересные идеи для использования такой интеграции, то напишите нам.
Мы уже длительное время занимаемся разработкой различных IT-решений, помогающих бизнесу развиваться и эффективнее работать за счет автоматизации рутинных процессов. Можем выполнить внедрение CRM, доработать ее под ваши нужды, разработать приложение, проконсультировать по вопросам автоматизации бизнес-процессов.