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

9.9 KiB
Raw Blame History

Интеграция 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. Пользователь нажимает кнопку

<button onclick="editInNextcloud('{$RECORD->getId()}', '{$RECORD->get('filename')}')" ...>
    <i class="fa fa-cloud"></i> Nextcloud
</button>

2. JavaScript вызывает API

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

// NcPrepareEdit.php
private function resolveNcFileId(int $recordId, string $fileName): ?int {
    // WebDAV PROPFIND запрос к Nextcloud
    // Возвращает fileId (уникальный ID файла в Nextcloud)
}

4. Формируются URL для редактора

$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

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. Добавлен алиас функции:

    function editInNextcloud(recordId, fileName) {
        console.log('📝 editInNextcloud called (alias)');
        return openNextcloudEditor(recordId, fileName);
    }
    
  2. Исправлен baseUrl в JS:

    const baseUrl = 'https://office.clientright.ru:8443';  // было без :8443
    
  3. Исправлен baseUrl в PHP:

    private function getNcBaseUrl(): string {
        return 'https://office.clientright.ru:8443';  // было без :8443
    }
    
  4. Добавлена поддержка токена RichDocuments:

    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 запрос

Проверка в консоли

// Проверить, загружен ли скрипт
typeof editInNextcloud === 'function'  // должно быть true

// Ручной тест
editInNextcloud('12345', 'test.docx')

Проверка API

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