- Создан API create_document_with_text.php для создания DOCX/XLSX/PPTX с текстом от AI - Поддержка Markdown форматирования (заголовки, жирный, курсив, списки, код) - Установлен PHPWord для красивого форматирования документов - Исправлены пути сохранения (crm2/CRM_Active_Files/... без /crm/ в начале) - Замена пробелов на подчеркивания в именах папок - Создана документация для AI и разработчиков - Добавлены API для работы с шаблонами Nextcloud
139 lines
5.8 KiB
Markdown
139 lines
5.8 KiB
Markdown
# 🔧 ИСПРАВЛЕНИЕ: Кнопки "Папка в Nextcloud" не работали
|
||
|
||
## ❌ ПРОБЛЕМА:
|
||
В модулях CRM кнопка **"Папка в Nextcloud"** была неактивна и не реагировала на клики.
|
||
|
||
## 🔍 ПРИЧИНА:
|
||
В JavaScript файле `crm_extensions/nextcloud_editor/js/nextcloud-editor.js` **отсутствовали функции**, которые вызывались из шаблонов:
|
||
|
||
**Было в JS:**
|
||
- ✅ `openProjectFolder()` — ТОЛЬКО ДЛЯ Project
|
||
|
||
**Вызывалось из шаблонов, но НЕ СУЩЕСТВОВАЛО:**
|
||
- ❌ `openRecordFolder()` — для HelpDesk, Invoice, SalesOrder, PurchaseOrder, Leads, Quotes, Potentials
|
||
- ❌ `openAccountFolder()` — для Accounts
|
||
- ❌ `openContactFolder()` — для Contacts
|
||
|
||
## ✅ РЕШЕНИЕ:
|
||
|
||
### 1. Добавлена универсальная функция `openRecordFolder()`
|
||
```javascript
|
||
function openRecordFolder(moduleName, recordId, recordName) {
|
||
// Нормализация имени (убираем кавычки, заменяем пробелы)
|
||
if (recordName) {
|
||
recordName = recordName.replace(/"/g, '_').replace(/\s+/g, '_');
|
||
}
|
||
|
||
// Формируем путь к папке
|
||
const folderName = recordName ? `${recordName}_${recordId}` : `${moduleName.toLowerCase()}_${recordId}`;
|
||
const encodedFolderName = encodeURIComponent(folderName);
|
||
const nextcloudUrl = 'https://office.clientright.ru:8443';
|
||
|
||
const folderUrl = `${nextcloudUrl}/apps/files/?dir=/crm/crm2/CRM_Active_Files/Documents/${moduleName}/${encodedFolderName}`;
|
||
|
||
// Открываем в новом окне
|
||
window.open(folderUrl, 'nextcloud_folder', 'width=1200,height=800,scrollbars=yes,resizable=yes');
|
||
}
|
||
```
|
||
|
||
**Используется в модулях:**
|
||
- HelpDesk (тикеты)
|
||
- Invoice (счета)
|
||
- SalesOrder (заказы)
|
||
- PurchaseOrder (закупки)
|
||
- Leads (лиды)
|
||
- Quotes (предложения)
|
||
- Potentials (сделки)
|
||
|
||
### 2. Добавлена специализированная функция `openAccountFolder()`
|
||
```javascript
|
||
function openAccountFolder(accountId, accountName) {
|
||
// Нормализация имени контрагента
|
||
if (accountName) {
|
||
accountName = accountName.replace(/"/g, '_').replace(/\s+/g, '_');
|
||
}
|
||
|
||
const folderName = accountName ? `${accountName}_${accountId}` : `account_${accountId}`;
|
||
const encodedFolderName = encodeURIComponent(folderName);
|
||
|
||
const folderUrl = `https://office.clientright.ru:8443/apps/files/?dir=/crm/crm2/CRM_Active_Files/Documents/Accounts/${encodedFolderName}`;
|
||
|
||
window.open(folderUrl, 'nextcloud_folder', 'width=1200,height=800,scrollbars=yes,resizable=yes');
|
||
}
|
||
```
|
||
|
||
**Используется в модуле:**
|
||
- Accounts (контрагенты)
|
||
|
||
### 3. Добавлена специализированная функция `openContactFolder()`
|
||
```javascript
|
||
function openContactFolder(contactId, firstName, lastName) {
|
||
// Составление имени из firstName и lastName
|
||
let contactName = '';
|
||
if (firstName || lastName) {
|
||
contactName = `${firstName || ''}_${lastName || ''}`.replace(/^_+|_+$/g, '');
|
||
contactName = contactName.replace(/"/g, '_').replace(/\s+/g, '_');
|
||
}
|
||
|
||
const folderName = contactName ? `${contactName}_${contactId}` : `contact_${contactId}`;
|
||
const encodedFolderName = encodeURIComponent(folderName);
|
||
|
||
const folderUrl = `https://office.clientright.ru:8443/apps/files/?dir=/crm/crm2/CRM_Active_Files/Documents/Contacts/${encodedFolderName}`;
|
||
|
||
window.open(folderUrl, 'nextcloud_folder', 'width=1200,height=800,scrollbars=yes,resizable=yes');
|
||
}
|
||
```
|
||
|
||
**Используется в модуле:**
|
||
- Contacts (контакты)
|
||
|
||
### 4. Очищен кеш Smarty
|
||
```bash
|
||
rm -rf test/templates_c/v7/*.php
|
||
```
|
||
|
||
## 📋 ПРОВЕРКА:
|
||
|
||
### Функции в JS:
|
||
```bash
|
||
grep -n "^function open.*Folder" crm_extensions/nextcloud_editor/js/nextcloud-editor.js
|
||
```
|
||
|
||
**Результат:**
|
||
```
|
||
9:function openRecordFolder(moduleName, recordId, recordName) {
|
||
37:function openProjectFolder(projectId, projectName) {
|
||
65:function openAccountFolder(accountId, accountName) {
|
||
87:function openContactFolder(contactId, firstName, lastName) {
|
||
```
|
||
|
||
✅ **ВСЕ 4 ФУНКЦИИ НА МЕСТЕ!**
|
||
|
||
### Где используются:
|
||
|
||
| Модуль | Функция | Параметры |
|
||
|--------|---------|-----------|
|
||
| HelpDesk | `openRecordFolder()` | 'HelpDesk', recordId, ticket_no |
|
||
| Invoice | `openRecordFolder()` | 'Invoice', recordId, invoice_no |
|
||
| SalesOrder | `openRecordFolder()` | 'SalesOrder', recordId, salesorder_no |
|
||
| PurchaseOrder | `openRecordFolder()` | 'PurchaseOrder', recordId, purchaseorder_no |
|
||
| Leads | `openRecordFolder()` | 'Leads', recordId, firstname_lastname |
|
||
| Quotes | `openRecordFolder()` | 'Quotes', recordId, quote_no |
|
||
| Potentials | `openRecordFolder()` | 'Potentials', recordId, potentialname |
|
||
| Accounts | `openAccountFolder()` | accountId, accountname |
|
||
| Contacts | `openContactFolder()` | contactId, firstname, lastname |
|
||
| Project | `openProjectFolder()` | projectId, projectname |
|
||
|
||
## 🎯 РЕЗУЛЬТАТ:
|
||
|
||
✅ **КНОПКИ "Папка в Nextcloud" ТЕПЕРЬ РАБОТАЮТ ВО ВСЕХ МОДУЛЯХ!**
|
||
|
||
При клике на кнопку открывается **новое окно** с Nextcloud, где отображается папка соответствующей записи CRM.
|
||
|
||
## 📁 ИЗМЕНЕННЫЕ ФАЙЛЫ:
|
||
- `crm_extensions/nextcloud_editor/js/nextcloud-editor.js` — добавлены 3 недостающие функции
|
||
- `test/templates_c/v7/*.php` — очищен кеш (автоматически пересоздастся)
|
||
|
||
## 📅 ДАТА ИСПРАВЛЕНИЯ:
|
||
02.11.2025
|