Complete OnlyOfficeTemplates safe rollout with module-scoped template paths, placeholder side panel, docx-renderer feature flags/fallback, public OnlyOffice endpoints, and list/delete UX so editing and saving work reliably without breaking legacy flow.
155 lines
7.1 KiB
PHP
155 lines
7.1 KiB
PHP
<?php
|
|
/**
|
|
* OnlyOfficeTemplates module configuration.
|
|
* Reads from environment (.env) or optional external config (crm_extensions/file_storage/config.php).
|
|
* Portable: no hardcoded paths; set S3_*, ONLYOFFICE_* in .env or your config.
|
|
*/
|
|
|
|
$OnlyOfficeTemplatesConfig = null;
|
|
|
|
/**
|
|
* Read env var: getenv() then $_ENV then EnvLoader::get() then direct .env parse.
|
|
*/
|
|
function OnlyOfficeTemplates_env($key, $default = '') {
|
|
$v = getenv($key);
|
|
if ($v !== false && $v !== '') {
|
|
return $v;
|
|
}
|
|
$v = $_ENV[$key] ?? null;
|
|
if ($v !== null && $v !== '') {
|
|
return $v;
|
|
}
|
|
if (class_exists('EnvLoader')) {
|
|
$v = EnvLoader::get($key, $default);
|
|
if ($v !== null && $v !== '') {
|
|
return $v;
|
|
}
|
|
}
|
|
// Fallback: read .env file directly (when EnvLoader not loaded or empty)
|
|
$envPaths = [];
|
|
if (!empty($GLOBALS['root_directory'])) {
|
|
$envPaths[] = rtrim($GLOBALS['root_directory'], '/') . '/crm_extensions/.env';
|
|
}
|
|
$baseDir = dirname(__DIR__);
|
|
$rootDir = dirname(dirname($baseDir));
|
|
$envPaths[] = $rootDir . '/crm_extensions/.env';
|
|
foreach ($envPaths as $envPath) {
|
|
if (file_exists($envPath) && is_readable($envPath)) {
|
|
$content = @file_get_contents($envPath);
|
|
if ($content !== false && preg_match('/^\s*' . preg_quote($key, '/') . '\s*=\s*([^\s#]+)/m', $content, $m)) {
|
|
return trim(trim($m[1]), '"\'');
|
|
}
|
|
}
|
|
}
|
|
return $default;
|
|
}
|
|
|
|
function OnlyOfficeTemplates_getConfig() {
|
|
global $OnlyOfficeTemplatesConfig;
|
|
if ($OnlyOfficeTemplatesConfig !== null) {
|
|
return $OnlyOfficeTemplatesConfig;
|
|
}
|
|
|
|
$baseDir = dirname(__DIR__);
|
|
$rootDir = dirname(dirname($baseDir));
|
|
|
|
// Load .env (EnvLoader uses $_ENV, not getenv)
|
|
if (file_exists($rootDir . '/crm_extensions/shared/EnvLoader.php')) {
|
|
require_once $rootDir . '/crm_extensions/shared/EnvLoader.php';
|
|
$envPath = $rootDir . '/crm_extensions/.env';
|
|
if (file_exists($envPath)) {
|
|
EnvLoader::load($envPath);
|
|
}
|
|
}
|
|
|
|
// 1) Try external config (crm_extensions) if present
|
|
$extConfigPath = $rootDir . '/crm_extensions/file_storage/config.php';
|
|
if (file_exists($extConfigPath)) {
|
|
try {
|
|
$ext = require $extConfigPath;
|
|
if (is_array($ext) && isset($ext['s3'])) {
|
|
$s3 = $ext['s3'];
|
|
$bucket = $s3['bucket'] ?? $ext['bucket'] ?? $ext['s3_bucket'] ?? OnlyOfficeTemplates_env('S3_BUCKET', '');
|
|
if ($bucket === '') {
|
|
$bucket = OnlyOfficeTemplates_env('S3_BUCKET', '');
|
|
}
|
|
$s3['bucket'] = $bucket;
|
|
$OnlyOfficeTemplatesConfig = [
|
|
's3' => $s3,
|
|
's3_prefix' => OnlyOfficeTemplates_env('OOT_S3_PREFIX', 'crm2/OnlyOfficeTemplates'),
|
|
'onlyoffice_convert_url' => OnlyOfficeTemplates_env('OOT_ONLYOFFICE_CONVERT_URL') ?: OnlyOfficeTemplates_env('ONLYOFFICE_CONVERT_URL', ''),
|
|
'onlyoffice_document_server' => OnlyOfficeTemplates_env('OOT_ONLYOFFICE_DOCUMENT_SERVER') ?: OnlyOfficeTemplates_env('ONLYOFFICE_DOCUMENT_SERVER', ''),
|
|
'documents_s3_prefix' => OnlyOfficeTemplates_env('OOT_DOCUMENTS_S3_PREFIX', 'crm2/CRM_Active_Files/Documents'),
|
|
's3_bucket' => $bucket,
|
|
'document_secret' => OnlyOfficeTemplates_env('OOT_DOCUMENT_SECRET', ''),
|
|
'docx_renderer' => [
|
|
'enabled' => strtolower((string)OnlyOfficeTemplates_env('OOT_USE_DOCX_RENDERER', 'false')) === 'true',
|
|
'url' => rtrim((string)OnlyOfficeTemplates_env('OOT_DOCX_RENDERER_URL', ''), '/'),
|
|
'api_key' => (string)OnlyOfficeTemplates_env('OOT_DOCX_RENDERER_API_KEY', ''),
|
|
'timeout_sec' => (int)OnlyOfficeTemplates_env('OOT_DOCX_RENDERER_TIMEOUT', '25'),
|
|
'fallback_enabled' => strtolower((string)OnlyOfficeTemplates_env('OOT_DOCX_RENDERER_FALLBACK', 'true')) !== 'false',
|
|
'module_whitelist' => trim((string)OnlyOfficeTemplates_env('OOT_DOCX_RENDERER_MODULE_WHITELIST', '')),
|
|
'template_whitelist' => trim((string)OnlyOfficeTemplates_env('OOT_DOCX_RENDERER_TEMPLATE_WHITELIST', '')),
|
|
],
|
|
];
|
|
return $OnlyOfficeTemplatesConfig;
|
|
}
|
|
} catch (Exception $e) {
|
|
// fallback to env
|
|
}
|
|
}
|
|
|
|
// 2) Build from environment
|
|
$bucket = OnlyOfficeTemplates_env('S3_BUCKET', '');
|
|
$OnlyOfficeTemplatesConfig = [
|
|
's3' => [
|
|
'key' => OnlyOfficeTemplates_env('S3_ACCESS_KEY', ''),
|
|
'secret' => OnlyOfficeTemplates_env('S3_SECRET_KEY', ''),
|
|
'endpoint' => OnlyOfficeTemplates_env('S3_ENDPOINT', ''),
|
|
'bucket' => $bucket,
|
|
'region' => OnlyOfficeTemplates_env('S3_REGION', 'ru-1'),
|
|
'use_path_style_endpoint' => true,
|
|
'version' => 'latest',
|
|
],
|
|
's3_prefix' => OnlyOfficeTemplates_env('OOT_S3_PREFIX', 'crm2/OnlyOfficeTemplates'),
|
|
'onlyoffice_convert_url' => OnlyOfficeTemplates_env('OOT_ONLYOFFICE_CONVERT_URL') ?: OnlyOfficeTemplates_env('ONLYOFFICE_CONVERT_URL', ''),
|
|
'onlyoffice_document_server' => OnlyOfficeTemplates_env('OOT_ONLYOFFICE_DOCUMENT_SERVER') ?: OnlyOfficeTemplates_env('ONLYOFFICE_DOCUMENT_SERVER', ''),
|
|
'documents_s3_prefix' => OnlyOfficeTemplates_env('OOT_DOCUMENTS_S3_PREFIX', 'crm2/CRM_Active_Files/Documents'),
|
|
's3_bucket' => $bucket,
|
|
'document_secret' => OnlyOfficeTemplates_env('OOT_DOCUMENT_SECRET', ''),
|
|
'docx_renderer' => [
|
|
'enabled' => strtolower((string)OnlyOfficeTemplates_env('OOT_USE_DOCX_RENDERER', 'false')) === 'true',
|
|
'url' => rtrim((string)OnlyOfficeTemplates_env('OOT_DOCX_RENDERER_URL', ''), '/'),
|
|
'api_key' => (string)OnlyOfficeTemplates_env('OOT_DOCX_RENDERER_API_KEY', ''),
|
|
'timeout_sec' => (int)OnlyOfficeTemplates_env('OOT_DOCX_RENDERER_TIMEOUT', '25'),
|
|
'fallback_enabled' => strtolower((string)OnlyOfficeTemplates_env('OOT_DOCX_RENDERER_FALLBACK', 'true')) !== 'false',
|
|
'module_whitelist' => trim((string)OnlyOfficeTemplates_env('OOT_DOCX_RENDERER_MODULE_WHITELIST', '')),
|
|
'template_whitelist' => trim((string)OnlyOfficeTemplates_env('OOT_DOCX_RENDERER_TEMPLATE_WHITELIST', '')),
|
|
],
|
|
];
|
|
|
|
return $OnlyOfficeTemplatesConfig;
|
|
}
|
|
|
|
function OnlyOfficeTemplates_log($event, array $data = [])
|
|
{
|
|
$rootDir = dirname(dirname(__DIR__));
|
|
$logDir = $rootDir . '/cache/logs';
|
|
if (!is_dir($logDir)) {
|
|
@mkdir($logDir, 0755, true);
|
|
}
|
|
$line = date('Y-m-d H:i:s') . ' ' . $event . ' ' . json_encode($data, JSON_UNESCAPED_UNICODE) . "\n";
|
|
@file_put_contents($logDir . '/OnlyOfficeTemplates_runtime.log', $line, FILE_APPEND);
|
|
}
|
|
|
|
function OnlyOfficeTemplates_listFromCsv($value)
|
|
{
|
|
if (!is_string($value) || trim($value) === '') {
|
|
return [];
|
|
}
|
|
$parts = array_map('trim', explode(',', $value));
|
|
return array_values(array_filter($parts, function ($v) {
|
|
return $v !== '';
|
|
}));
|
|
}
|