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 (просмотр)
|
|||
|
|
- [ ] История изменений
|
|||
|
|
- [ ] Комментарии в документах
|
|||
|
|
- [ ] Совместное редактирование с уведомлениями
|
|||
|
|
|