✅ Что реализовано: - SSL/HTTPS для Nextcloud (Let's Encrypt R13) - Redis кэширование для производительности - Collabora Online редактор документов - WOPI allow list настроен (0.0.0.0/0) - Динамическое получение fileId через WebDAV - Поддержка файлов из S3 и локальных файлов - Автоматическое извлечение имени файла из URL - Промежуточная страница для обхода CSRF 🚀 Как работает: 1. JavaScript передает recordId и fileName 2. PHP получает fileId через WebDAV PROPFIND 3. PHP делает редирект на рабочий URL Nextcloud 4. Файл открывается в редакторе Collabora 📁 Файлы: - layouts/v7/lib/nextcloud-editor.js - JavaScript интеграция - crm_extensions/file_storage/api/open_file.php - PHP редирект - modules/Documents/actions/NcPrepareEdit.php - API подготовка - crm_extensions/docs/ - документация 🎯 Результат: Каждый документ в CRM открывает СВОЙ файл в Nextcloud редакторе!
86 lines
3.4 KiB
PHP
86 lines
3.4 KiB
PHP
<?php
|
||
/**
|
||
* Простой редирект на файл в Nextcloud БЕЗ CSRF проверок
|
||
*/
|
||
|
||
// Получаем параметры
|
||
$fileName = isset($_GET['fileName']) ? $_GET['fileName'] : '';
|
||
$recordId = isset($_GET['recordId']) ? $_GET['recordId'] : '';
|
||
|
||
// Если fileName содержит полный URL, извлекаем только имя файла
|
||
if (strpos($fileName, 'http') === 0) {
|
||
$fileName = basename($fileName);
|
||
error_log("Nextcloud Editor: Извлечено имя файла из URL: {$fileName}");
|
||
}
|
||
|
||
// Настройки Nextcloud
|
||
$nextcloudUrl = 'https://office.clientright.ru:8443';
|
||
$username = 'admin';
|
||
$password = 'office';
|
||
|
||
// Путь к файлу в Nextcloud (относительно папки пользователя admin)
|
||
// Предполагаем, что файлы хранятся по пути: crm/crm2/CRM_Active_Files/Documents/{recordId}/{fileName}
|
||
$nextcloudFilePath = "crm/crm2/CRM_Active_Files/Documents/{$recordId}/" . urlencode($fileName);
|
||
|
||
$fileId = null;
|
||
|
||
// Попытка получить fileId через WebDAV PROPFIND
|
||
error_log("Nextcloud Editor: Попытка получить fileId для файла: {$nextcloudFilePath} через WebDAV");
|
||
|
||
// XML запрос для получения fileid
|
||
$xmlRequest = '<?xml version="1.0"?>
|
||
<d:propfind xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns">
|
||
<d:prop>
|
||
<oc:fileid/>
|
||
</d:prop>
|
||
</d:propfind>';
|
||
|
||
$ch = curl_init();
|
||
curl_setopt($ch, CURLOPT_URL, $nextcloudUrl . '/remote.php/dav/files/' . $username . '/' . $nextcloudFilePath);
|
||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||
curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password);
|
||
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PROPFIND');
|
||
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlRequest);
|
||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||
'Depth: 0',
|
||
'Content-Type: application/xml'
|
||
]);
|
||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||
$response = curl_exec($ch);
|
||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||
$curlError = curl_error($ch);
|
||
curl_close($ch);
|
||
|
||
if ($response === false) {
|
||
error_log("Nextcloud Editor: Ошибка cURL при запросе WebDAV: " . $curlError);
|
||
} else {
|
||
error_log("Nextcloud Editor: WebDAV Response (HTTP {$httpCode}): " . substr($response, 0, 500));
|
||
|
||
if ($httpCode === 207 && $response) { // 207 = Multi-Status для PROPFIND
|
||
// Простой regex для извлечения fileid
|
||
if (preg_match('/<oc:fileid>(\d+)<\/oc:fileid>/', $response, $matches)) {
|
||
$fileId = $matches[1];
|
||
error_log("Nextcloud Editor: fileId получен через WebDAV regex: " . $fileId);
|
||
} else {
|
||
error_log("Nextcloud Editor: fileid не найден в XML ответе");
|
||
}
|
||
} else {
|
||
error_log("Nextcloud Editor: WebDAV запрос неуспешен. HTTP Code: {$httpCode}");
|
||
}
|
||
}
|
||
|
||
if (!$fileId) {
|
||
die('❌ Ошибка: Не удалось получить fileId для файла ' . $fileName);
|
||
}
|
||
|
||
// Формируем URL для Nextcloud
|
||
// РАБОЧИЙ ФОРМАТ - редирект на файл с автооткрытием редактора!
|
||
$redirectUrl = $nextcloudUrl . '/apps/files/files/' . $fileId . '?dir=/&editing=true&openfile=true';
|
||
|
||
// Логирование
|
||
error_log("Nextcloud Editor: Redirect to $redirectUrl for file $fileName (ID: $fileId)");
|
||
|
||
// Делаем редирект
|
||
header('Location: ' . $redirectUrl);
|
||
exit;
|
||
?>
|