aboutsummaryrefslogtreecommitdiffhomepage
path: root/application/front/controller/admin/PluginsController.php
blob: 1eb7e6357a346dd7e889c0ba4b89ff0c58994102 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php

declare(strict_types=1);

namespace Shaarli\Front\Controller\Admin;

use Exception;
use Shaarli\Render\TemplatePage;
use Slim\Http\Request;
use Slim\Http\Response;

/**
 * Class PluginsController
 *
 * Slim controller used to handle Shaarli plugins configuration page (display + save new config).
 */
class PluginsController extends ShaarliAdminController
{
    /**
     * GET /admin/plugins - Displays the configuration page
     */
    public function index(Request $request, Response $response): Response
    {
        $pluginMeta = $this->container->pluginManager->getPluginsMeta();

        // Split plugins into 2 arrays: ordered enabled plugins and disabled.
        $enabledPlugins = array_filter($pluginMeta, function ($v) {
            return ($v['order'] ?? false) !== false;
        });
        $enabledPlugins = load_plugin_parameter_values($enabledPlugins, $this->container->conf->get('plugins', []));
        uasort(
            $enabledPlugins,
            function ($a, $b) {
                return $a['order'] - $b['order'];
            }
        );
        $disabledPlugins = array_filter($pluginMeta, function ($v) {
            return ($v['order'] ?? false) === false;
        });

        $this->assignView('enabledPlugins', $enabledPlugins);
        $this->assignView('disabledPlugins', $disabledPlugins);
        $this->assignView(
            'pagetitle',
            t('Plugin Administration') .' - '. $this->container->conf->get('general.title', 'Shaarli')
        );

        return $response->write($this->render(TemplatePage::PLUGINS_ADMIN));
    }

    /**
     * POST /admin/plugins - Update Shaarli's configuration
     */
    public function save(Request $request, Response $response): Response
    {
        $this->checkToken($request);

        try {
            $parameters = $request->getParams() ?? [];

            $this->executeHooks($parameters);

            if (isset($parameters['parameters_form'])) {
                unset($parameters['parameters_form']);
                foreach ($parameters as $param => $value) {
                    $this->container->conf->set('plugins.'. $param, escape($value));
                }
            } else {
                $this->container->conf->set('general.enabled_plugins', save_plugin_config($parameters));
            }

            $this->container->conf->write($this->container->loginManager->isLoggedIn());
            $this->container->history->updateSettings();

            $this->saveSuccessMessage(t('Setting successfully saved.'));
        } catch (Exception $e) {
            $this->saveErrorMessage(
                t('Error while saving plugin configuration: ') . PHP_EOL . $e->getMessage()
            );
        }

        return $this->redirect($response, '/admin/plugins');
    }

    /**
     * @param mixed[] $data Variables passed to the template engine
     *
     * @return mixed[] Template data after active plugins render_picwall hook execution.
     */
    protected function executeHooks(array $data): array
    {
        $this->container->pluginManager->executeHooks(
            'save_plugin_parameters',
            $data
        );

        return $data;
    }
}