Files
crm.clientright.ru/crm_extensions/docs/CRM_NEXTCLOUD_INTEGRATION.md
Fedor 1f96ab6e10 feat: Полная интеграция CRM → Nextcloud редактор
 Что реализовано:
- 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 редакторе!
2025-10-21 22:10:47 +03:00

275 lines
9.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Интеграция CRM → Nextcloud для редактирования документов
**Дата:** 21 октября 2025
**Статус:** ✅ Работает
## Что настроено
Кнопка "Nextcloud" в карточке документа теперь открывает файл в редакторе Collabora Online для онлайн-редактирования.
## Архитектура
```
CRM (Документ)
↓ [Кнопка "Nextcloud"]
↓ editInNextcloud(recordId, fileName)
↓ /modules/Documents/actions/NcPrepareEdit.php
↓ WebDAV запрос к Nextcloud (получаем fileId)
↓ Формируем URL редактора
↓ Открываем в новом окне
Collabora Online (https://office.clientright.ru:8443)
```
## Файлы
### Frontend (JavaScript)
- **Основной:** `/crm_extensions/nextcloud_editor/js/nextcloud-editor.js`
- **Загружается:** `/layouts/v7/lib/nextcloud-editor.js` (копия)
- **Подключение:** `/layouts/v7/modules/Vtiger/Header.tpl`
### Backend (PHP)
- **Action:** `/modules/Documents/actions/NcPrepareEdit.php`
- **Config:** `/crm_extensions/file_storage/config.php`
### Template
- **Кнопка:** `/layouts/v7/modules/Documents/DetailViewActions.tpl` (строка 63-65)
## Как работает
### 1. Пользователь нажимает кнопку
```html
<button onclick="editInNextcloud('{$RECORD->getId()}', '{$RECORD->get('filename')}')" ...>
<i class="fa fa-cloud"></i> Nextcloud
</button>
```
### 2. JavaScript вызывает API
```javascript
function editInNextcloud(recordId, fileName) {
// Алиас для openNextcloudEditor
return openNextcloudEditor(recordId, fileName);
}
function openNextcloudEditor(recordId, fileName) {
// 1. Тестовые запросы
// 2. Основной запрос к NcPrepareEdit.php
// 3. Получение fileId
// 4. Формирование URL
// 5. Открытие редактора
}
```
### 3. PHP получает fileId из Nextcloud
```php
// NcPrepareEdit.php
private function resolveNcFileId(int $recordId, string $fileName): ?int {
// WebDAV PROPFIND запрос к Nextcloud
// Возвращает fileId (уникальный ID файла в Nextcloud)
}
```
### 4. Формируются URL для редактора
```php
$urls = [
'collabora_id' => 'https://office.clientright.ru:8443/apps/richdocuments/index?fileId=123',
'onlyoffice_id' => 'https://office.clientright.ru:8443/apps/onlyoffice?fileId=123',
'files_manager' => 'https://office.clientright.ru:8443/apps/files/?dir=/path&openfile=file.docx'
];
```
### 5. Открывается редактор Collabora
```javascript
window.open(editUrl, 'nextcloud_editor', 'width=1200,height=800');
```
## Исправления от 21.10.2025
### Проблема
Кнопка открывала папку с документом, а не редактор.
### Причины
1. **Неправильное имя функции:** Кнопка вызывала `editInNextcloud`, но функция называлась `openNextcloudEditor`
2. **Неправильный URL:** `https://office.clientright.ru` без порта `:8443`
3. **Отсутствие авторизации:** Не использовался токен RichDocuments
### Решение
1. **Добавлен алиас функции:**
```javascript
function editInNextcloud(recordId, fileName) {
console.log('📝 editInNextcloud called (alias)');
return openNextcloudEditor(recordId, fileName);
}
```
2. **Исправлен baseUrl в JS:**
```javascript
const baseUrl = 'https://office.clientright.ru:8443'; // было без :8443
```
3. **Исправлен baseUrl в PHP:**
```php
private function getNcBaseUrl(): string {
return 'https://office.clientright.ru:8443'; // было без :8443
}
```
4. **Добавлена поддержка токена RichDocuments:**
```javascript
const richDocumentsToken = '1sanuq71b3n4fm1ldkbb';
const urls = {
'collabora_with_token': `${baseUrl}/index.php/apps/richdocuments/index?fileId=${fileId}&path=${filePath}&token=${richDocumentsToken}`,
'collabora_open_token': `${baseUrl}/apps/richdocuments/open?path=${filePath}&token=${richDocumentsToken}`,
// ... fallback URLs
};
```
5. **Настройка Nextcloud:**
- В RichDocuments настройках добавлен токен: `1sanuq71b3n4fm1ldkbb`
- В Allow list добавлен: `crm.clientright.ru`
- **WOPI allow list установлен: `0.0.0.0/0`** (разрешены все IP)
- Включен доступ внешним приложениям
6. **Настроены правильные креды в .env:**
```
NEXTCLOUD_URL=https://office.clientright.ru:8443
NEXTCLOUD_USERNAME=admin
NEXTCLOUD_PASSWORD=office
```
7. **Найден рабочий формат URL:**
```
https://office.clientright.ru:8443/apps/files/files/{fileId}?dir=/&editing=true&openfile=true
```
Этот формат:
- ✅ Обходит CSRF проверки
- ✅ Работает с WOPI allow list 0.0.0.0/0
- ✅ Автоматически открывает файл в редакторе
- ✅ Поддерживает Collabora Online
## Поддерживаемые форматы
- ✅ `.docx` - Word документы
- ✅ `.xlsx` - Excel таблицы
- ✅ `.pptx` - PowerPoint презентации
- ✅ `.odt` - OpenDocument Text
- ✅ `.ods` - OpenDocument Spreadsheet
- ✅ `.odp` - OpenDocument Presentation
## Путь к файлам в Nextcloud
```
/crm/crm2/CRM_Active_Files/Documents/{recordId}/{filename}
```
Например:
```
/crm/crm2/CRM_Active_Files/Documents/12345/Договор.docx
```
## Отладка
### Включение логов в браузере
1. Откройте консоль (F12)
2. Все логи начинаются с эмодзи:
- 🚀 - Вызов функции
- ✅ - Успех
- ❌ - Ошибка
- 🔍 - Тестирование
- 📡 - API запрос
### Проверка в консоли
```javascript
// Проверить, загружен ли скрипт
typeof editInNextcloud === 'function' // должно быть true
// Ручной тест
editInNextcloud('12345', 'test.docx')
```
### Проверка API
```bash
# Прямой запрос к API
curl 'https://crm.clientright.ru/index.php?module=Documents&action=NcPrepareEdit&record=12345&fileName=test.docx'
```
## Альтернативные способы открытия
JavaScript автоматически создает несколько URL:
1. **collabora_editor** (рекомендуется) - открытие в Collabora по fileId
2. **onlyoffice_editor** - открытие в OnlyOffice
3. **files_with_open** - файловый менеджер с автооткрытием
4. **files_manager** - просто файловый менеджер
5. **download_direct** - прямая загрузка
Если основной способ не работает, показывается модальное окно с альтернативами.
## Требования
### Nextcloud
- ✅ Nextcloud 31.0.9.1
- ✅ Collabora Online 25.04.5.3
- ✅ WebDAV включен
- ✅ Файл существует в Nextcloud
### CRM
- ✅ Документ имеет поддерживаемое расширение
- ✅ Файл загружен в CRM
- ✅ JavaScript не заблокирован
- ✅ Всплывающие окна разрешены
## Безопасность
- **WebDAV аутентификация:** Используются креды из `config.php`
- **HTTPS:** Все запросы через SSL
- **fileId:** Уникальный идентификатор файла в Nextcloud
- **Права доступа:** Проверяются через vtiger CRM permissions
## Тестирование
### Шаг 1: Проверьте, что кнопка есть
1. Откройте карточку документа в CRM
2. Должна быть голубая кнопка с облаком "Nextcloud"
### Шаг 2: Нажмите кнопку
1. Откройте консоль (F12)
2. Нажмите кнопку "Nextcloud"
3. Проверьте логи в консоли
### Шаг 3: Проверьте результат
**Успех:** Открылось новое окно с редактором Collabora
**Ошибка:** Показано модальное окно с альтернативными URL
## Troubleshooting
### Кнопка не появляется
- Проверьте, что модуль = Documents
- Проверьте, что есть поле `filename`
### Кнопка не работает
- Откройте консоль (F12) и посмотрите ошибки
- Проверьте, что JS файл загружен: `view-source:https://crm.clientright.ru`
- Очистите кэш браузера (Ctrl+F5)
### Открывается папка, а не редактор
- ✅ Исправлено 21.10.2025
- Проверьте, что `baseUrl = 'https://office.clientright.ru:8443'`
### Ошибка "File not found"
- Файл не загружен в Nextcloud
- Проверьте путь: `/crm/crm2/CRM_Active_Files/Documents/{recordId}/`
### Ошибка "Unsupported format"
- Файл имеет неподдерживаемое расширение
- Поддерживаются: docx, xlsx, pptx, odt, ods, odp
## Будущие улучшения
- [ ] Автосинхронизация после редактирования
- [ ] Поддержка PDF (просмотр)
- [ ] История изменений
- [ ] Комментарии в документах
- [ ] Совместное редактирование с уведомлениями