get('name') ?: $request->get('template_name'); $module = $request->get('module_name'); $file = $_FILES['file'] ?? $_FILES['template_file'] ?? null; $redirect = $request->get('redirect'); $doRedirect = ($redirect === 'List'); if (!$name || !$module || !$file || empty($file['tmp_name']) || $file['error'] !== UPLOAD_ERR_OK) { if ($doRedirect) { header('Location: index.php?module=OnlyOfficeTemplates&view=AddTemplate&app=TOOLS&error=' . urlencode('Укажите название, модуль и выберите файл DOCX')); return; } echo json_encode(['success' => false, 'error' => 'Missing name, module_name, or valid file upload']); return; } $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION)); if ($ext !== 'docx') { if ($doRedirect) { header('Location: index.php?module=OnlyOfficeTemplates&view=AddTemplate&app=TOOLS&error=' . urlencode('Допускаются только файлы DOCX')); return; } echo json_encode(['success' => false, 'error' => 'Only DOCX files are allowed']); return; } require_once dirname(__DIR__) . '/models/OnlyOfficeTemplates_Model.php'; require_once dirname(__DIR__) . '/resources/S3Helper.php'; $model = new OnlyOfficeTemplates_Model(); $config = $model->getConfig(); $s3 = new OnlyOfficeTemplates_S3Helper($config); $owner = Users_Record_Model::getCurrentUserModel()->getId(); $adb = PearDatabase::getInstance(); $adb->pquery("INSERT INTO vtiger_oot_templates (name, module, s3_key, file_name, owner, created_at) VALUES ('_pending', ?, '', '', ?, NOW())", [$module, $owner]); $templateId = (int)$adb->getLastInsertID(); if ($templateId <= 0) { $r = $adb->pquery("SELECT MAX(id) AS m FROM vtiger_oot_templates", []); $templateId = (int)$adb->query_result($r, 0, 'm'); } $fileName = basename($file['name']); $s3Key = $s3->getTemplateKey($templateId, $fileName); try { $s3->uploadFile($file['tmp_name'], $s3Key, 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'); } catch (Exception $e) { $adb->pquery("DELETE FROM vtiger_oot_templates WHERE id = ?", [$templateId]); if ($doRedirect) { header('Location: index.php?module=OnlyOfficeTemplates&view=AddTemplate&app=TOOLS&error=' . urlencode('Ошибка загрузки: ' . $e->getMessage())); return; } echo json_encode(['success' => false, 'error' => 'S3 upload failed: ' . $e->getMessage()]); return; } $adb->pquery("UPDATE vtiger_oot_templates SET name = ?, s3_key = ?, file_name = ? WHERE id = ?", [$name, $s3Key, $fileName, $templateId]); $id = $templateId; if ($doRedirect) { header('Location: index.php?module=OnlyOfficeTemplates&view=List&app=TOOLS'); return; } echo json_encode(['success' => true, 'id' => $id, 's3_key' => $s3Key]); } }