✨ Features: - Migrated ALL files to new S3 structure (Projects, Contacts, Accounts, HelpDesk, Invoice, etc.) - Added Nextcloud folder buttons to ALL modules - Fixed Nextcloud editor integration - WebSocket server for real-time updates - Redis Pub/Sub integration - File path manager for organized storage - Redis caching for performance (Functions.php) 📁 New Structure: Documents/Project/ProjectName_ID/file_docID.ext Documents/Contacts/FirstName_LastName_ID/file_docID.ext Documents/Accounts/AccountName_ID/file_docID.ext 🔧 Technical: - FilePathManager for standardized paths - S3StorageService integration - WebSocket server (Node.js + Docker) - Redis cache for getBasicModuleInfo() - Predis library for Redis connectivity 📝 Scripts: - Migration scripts for all modules - Test pages for WebSocket/SSE/Polling - Documentation (MIGRATION_*.md, REDIS_*.md) 🎯 Result: 15,000+ files migrated successfully!
111 lines
3.9 KiB
PHP
111 lines
3.9 KiB
PHP
<?php
|
||
/**
|
||
* Простой редирект на файл в Nextcloud БЕЗ CSRF проверок
|
||
* Использует FilePathManager для новой структуры файлов
|
||
*/
|
||
|
||
// Включаем отображение ошибок
|
||
error_reporting(E_ALL);
|
||
ini_set('display_errors', 1);
|
||
|
||
// Подключаем конфигурацию и FilePathManager
|
||
require_once '/var/www/fastuser/data/www/crm.clientright.ru/config.inc.php';
|
||
require_once '/var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/FilePathManager.php';
|
||
|
||
// Получаем параметры
|
||
$fileName = isset($_GET['fileName']) ? $_GET['fileName'] : '';
|
||
$recordId = isset($_GET['recordId']) ? $_GET['recordId'] : '';
|
||
|
||
// Если fileName содержит полный URL S3, извлекаем путь к файлу
|
||
$ncPath = '';
|
||
if (strpos($fileName, 'http') === 0) {
|
||
// Декодируем URL
|
||
$fileName = urldecode($fileName);
|
||
|
||
// Извлекаем путь после bucket ID
|
||
// Формат: https://s3.twcstorage.ru/BUCKET_ID/crm2/CRM_Active_Files/...
|
||
$bucketId = 'f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c';
|
||
$pos = strpos($fileName, $bucketId . '/');
|
||
if ($pos !== false) {
|
||
$s3Path = substr($fileName, $pos + strlen($bucketId) + 1);
|
||
|
||
// Nextcloud путь = /crm/ + s3_path
|
||
$ncPath = '/crm/' . $s3Path;
|
||
}
|
||
}
|
||
|
||
if (empty($ncPath)) {
|
||
die("❌ Ошибка: Не удалось извлечь путь из URL: $fileName");
|
||
}
|
||
|
||
// Настройки Nextcloud
|
||
$nextcloudUrl = 'https://office.clientright.ru:8443';
|
||
$username = 'admin';
|
||
$password = 'office';
|
||
|
||
// Вспомогательная функция: кодирование пути по сегментам (WebDAV)
|
||
$encodePath = function(array $segments) {
|
||
return implode('/', array_map('rawurlencode', $segments));
|
||
};
|
||
|
||
// Получаем fileId через WebDAV PROPFIND
|
||
$fileId = null;
|
||
$propfindUrl = $nextcloudUrl . '/remote.php/dav/files/' . $username . $ncPath;
|
||
|
||
error_log("Nextcloud Editor: PROPFIND -> {$propfindUrl}");
|
||
|
||
// 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, $propfindUrl);
|
||
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: " . $curlError);
|
||
} else {
|
||
error_log("Nextcloud Editor: HTTP код: {$httpCode}");
|
||
|
||
if ($httpCode === 207 && preg_match('/<oc:fileid>(\d+)<\/oc:fileid>/', $response, $matches)) {
|
||
$fileId = (int)$matches[1];
|
||
error_log("Nextcloud Editor: Получен fileId: {$fileId}");
|
||
} else {
|
||
error_log("Nextcloud Editor: Файл не найден по пути: {$ncPath} (HTTP {$httpCode})");
|
||
}
|
||
}
|
||
|
||
if (!$fileId) {
|
||
$errorMsg = "❌ Ошибка: Не удалось получить fileId для файла {$fileName}";
|
||
error_log("Nextcloud Editor ERROR: " . $errorMsg);
|
||
die($errorMsg);
|
||
}
|
||
|
||
// Формируем URL для Nextcloud
|
||
// РАБОЧИЙ ФОРМАТ - редирект на файл с автооткрытием редактора!
|
||
$redirectUrl = $nextcloudUrl . '/apps/files/files/' . $fileId . '?dir=/&editing=true&openfile=true';
|
||
|
||
// Логирование
|
||
error_log("Nextcloud Editor: Redirect to $redirectUrl for file (ID: $fileId)");
|
||
|
||
// Делаем редирект
|
||
header('Location: ' . $redirectUrl);
|
||
exit;
|
||
?>
|