✅ Что реализовано: - 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 редакторе!
275 lines
9.9 KiB
Markdown
275 lines
9.9 KiB
Markdown
# Интеграция 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 (просмотр)
|
||
- [ ] История изменений
|
||
- [ ] Комментарии в документах
|
||
- [ ] Совместное редактирование с уведомлениями
|
||
|