Files
crm.clientright.ru/modules/OnlyOfficeTemplates/actions/UploadTemplate.php
2026-02-16 09:27:19 +03:00

82 lines
3.6 KiB
PHP

<?php
/**
* Upload DOCX template to S3 and save metadata in vtiger_oot_templates.
*/
class OnlyOfficeTemplates_UploadTemplate_Action extends Vtiger_Action_Controller
{
public function checkPermission(Vtiger_Request $request)
{
if (!isPermitted('Settings', 'Edit', '')) {
throw new AppException('LBL_PERMISSION_DENIED');
}
}
public function process(Vtiger_Request $request)
{
$name = $request->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]);
}
}