<?php
/**
- * @copyright Copyright (C) 2010-2021, the Friendica project
+ * @copyright Copyright (C) 2010-2023, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
use Friendica\Core\Renderer;
use Friendica\DI;
-use Friendica\Model\Storage\InvalidClassStorageException;
-use Friendica\Model\Storage\IWritableStorage;
+use Friendica\Core\Storage\Exception\InvalidClassStorageException;
+use Friendica\Core\Storage\Capability\ICanConfigureStorage;
+use Friendica\Core\Storage\Capability\ICanWriteToStorage;
use Friendica\Module\BaseAdmin;
use Friendica\Util\Strings;
class Storage extends BaseAdmin
{
- public static function post(array $parameters = [])
+ protected function post(array $request = [])
{
self::checkAdminAccess();
self::checkFormSecurityTokenRedirectOnError('/admin/storage', 'admin_storage');
- $storagebackend = Strings::escapeTags(trim($parameters['name'] ?? ''));
+ $storagebackend = trim($this->parameters['name'] ?? '');
try {
- /** @var IWritableStorage $newstorage */
- $newstorage = DI::storageManager()->getWritableStorageByName($storagebackend);
+ /** @var ICanConfigureStorage|false $newStorageConfig */
+ $newStorageConfig = DI::storageManager()->getConfigurationByName($storagebackend);
} catch (InvalidClassStorageException $storageException) {
- notice(DI::l10n()->t('Storage backend, %s is invalid.', $storagebackend));
+ DI::sysmsg()->addNotice(DI::l10n()->t('Storage backend, %s is invalid.', $storagebackend));
DI::baseUrl()->redirect('admin/storage');
}
- // save storage backend form
- $storage_opts = $newstorage->getOptions();
- $storage_form_prefix = preg_replace('|[^a-zA-Z0-9]|', '', $storagebackend);
- $storage_opts_data = [];
- foreach ($storage_opts as $name => $info) {
- $fieldname = $storage_form_prefix . '_' . $name;
- switch ($info[0]) { // type
- case 'checkbox':
- case 'yesno':
- $value = !empty($_POST[$fieldname]);
- break;
- default:
- $value = $_POST[$fieldname] ?? '';
+ if ($newStorageConfig !== false) {
+ // save storage backend form
+ $storage_opts = $newStorageConfig->getOptions();
+ $storage_form_prefix = preg_replace('|[^a-zA-Z0-9]|', '', $storagebackend);
+ $storage_opts_data = [];
+ foreach ($storage_opts as $name => $info) {
+ $fieldname = $storage_form_prefix . '_' . $name;
+ switch ($info[0]) { // type
+ case 'checkbox':
+ case 'yesno':
+ $value = !empty($_POST[$fieldname]);
+ break;
+ default:
+ $value = $_POST[$fieldname] ?? '';
+ }
+ $storage_opts_data[$name] = $value;
}
- $storage_opts_data[$name] = $value;
- }
- unset($name);
- unset($info);
+ unset($name);
+ unset($info);
- $storage_form_errors = $newstorage->saveOptions($storage_opts_data);
- if (count($storage_form_errors)) {
- foreach ($storage_form_errors as $name => $err) {
- notice(DI::l10n()->t('Storage backend %s error: %s', $storage_opts[$name][1], $err));
+ $storage_form_errors = $newStorageConfig->saveOptions($storage_opts_data);
+ if (count($storage_form_errors)) {
+ foreach ($storage_form_errors as $name => $err) {
+ DI::sysmsg()->addNotice(DI::l10n()->t('Storage backend %s error: %s', $storage_opts[$name][1], $err));
+ }
+ DI::baseUrl()->redirect('admin/storage');
}
- DI::baseUrl()->redirect('admin/storage');
}
- if (!empty($_POST['submit_save_set'])) {
+ if (!empty($_POST['submit_save_set']) && DI::config()->isWritable('storage', 'name') ) {
try {
- /** @var IWritableStorage $newstorage */
$newstorage = DI::storageManager()->getWritableStorageByName($storagebackend);
if (!DI::storageManager()->setBackend($newstorage)) {
- notice(DI::l10n()->t('Invalid storage backend setting value.'));
+ DI::sysmsg()->addNotice(DI::l10n()->t('Invalid storage backend setting value.'));
}
} catch (InvalidClassStorageException $storageException) {
- notice(DI::l10n()->t('Invalid storage backend setting value.'));
+ DI::sysmsg()->addNotice(DI::l10n()->t('Invalid storage backend setting value.'));
}
}
DI::baseUrl()->redirect('admin/storage');
}
- public static function content(array $parameters = [])
+ protected function content(array $request = []): string
{
- parent::content($parameters);
+ parent::content();
$current_storage_backend = DI::storage();
$available_storage_forms = [];
// build storage config form,
$storage_form_prefix = preg_replace('|[^a-zA-Z0-9]|', '', $name);
- $storage_form = [];
- foreach (DI::storageManager()->getWritableStorageByName($name)->getOptions() as $option => $info) {
- $type = $info[0];
- // Backward compatibilty with yesno field description
- if ($type == 'yesno') {
- $type = 'checkbox';
- // Remove translated labels Yes No from field info
- unset($info[4]);
- }
+ $storage_form = [];
+ $storageConfig = DI::storageManager()->getConfigurationByName($name);
+
+ if ($storageConfig !== false) {
+ foreach ($storageConfig->getOptions() as $option => $info) {
- $info[0] = $storage_form_prefix . '_' . $option;
- $info['type'] = $type;
- $info['field'] = 'field_' . $type . '.tpl';
- $storage_form[$option] = $info;
+ $type = $info[0];
+ // Backward compatibility with yesno field description
+ if ($type == 'yesno') {
+ $type = 'checkbox';
+ // Remove translated labels Yes No from field info
+ unset($info[4]);
+ }
+
+ $info[0] = $storage_form_prefix . '_' . $option;
+ $info['type'] = $type;
+ $info['field'] = 'field_' . $type . '.tpl';
+ $storage_form[$option] = $info;
+ }
}
$available_storage_forms[] = [
'name' => $name,
'prefix' => $storage_form_prefix,
'form' => $storage_form,
- 'active' => $current_storage_backend instanceof IWritableStorage && $name === $current_storage_backend::getName(),
+ 'active' => $current_storage_backend instanceof ICanWriteToStorage && $name === $current_storage_backend::getName(),
];
}
'$label_config' => DI::l10n()->t('Storage Configuration'),
'$page' => DI::l10n()->t('Storage'),
'$save' => DI::l10n()->t('Save'),
- '$save_activate' => DI::l10n()->t('Save & Activate'),
- '$activate' => DI::l10n()->t('Activate'),
+ '$save_use' => DI::l10n()->t('Save & Use storage backend'),
+ '$use' => DI::l10n()->t('Use storage backend'),
'$save_reload' => DI::l10n()->t('Save & Reload'),
'$noconfig' => DI::l10n()->t('This backend doesn\'t have custom settings'),
- '$baseurl' => DI::baseUrl()->get(true),
'$form_security_token' => self::getFormSecurityToken("admin_storage"),
- '$storagebackend' => $current_storage_backend instanceof IWritableStorage ? $current_storage_backend::getName() : DI::l10n()->t('Database (legacy)'),
+ '$storagebackend_ro_txt' => !DI::config()->isWritable('storage', 'name') ? DI::l10n()->t('Changing the current backend is prohibited because it is set by an environment variable') : '',
+ '$is_writable' => DI::config()->isWritable('storage', 'name'),
+ '$storagebackend' => $current_storage_backend instanceof ICanWriteToStorage ? $current_storage_backend::getName() : DI::l10n()->t('Database (legacy)'),
'$availablestorageforms' => $available_storage_forms,
]);
}