82 lines
3.6 KiB
PHP
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]);
|
|
}
|
|
}
|