xref: /plugin/fontello/admin.php (revision 1776c5c5befa8de3cc97e981444f6918b129ab85)
1*1776c5c5Sdh-tools<?php
2*1776c5c5Sdh-tools
3*1776c5c5Sdh-toolsuse dokuwiki\Extension\AdminPlugin;
4*1776c5c5Sdh-tools
5*1776c5c5Sdh-tools/**
6*1776c5c5Sdh-tools * Admin component for importing Fontello ZIP packages.
7*1776c5c5Sdh-tools */
8*1776c5c5Sdh-toolsclass admin_plugin_fontello extends AdminPlugin
9*1776c5c5Sdh-tools{
10*1776c5c5Sdh-tools    /** @var helper_plugin_fontello */
11*1776c5c5Sdh-tools    protected $helper;
12*1776c5c5Sdh-tools
13*1776c5c5Sdh-tools    public function __construct()
14*1776c5c5Sdh-tools    {
15*1776c5c5Sdh-tools        $this->helper = $this->loadHelper('fontello');
16*1776c5c5Sdh-tools    }
17*1776c5c5Sdh-tools
18*1776c5c5Sdh-tools    /**
19*1776c5c5Sdh-tools     * return sort order for position in admin menu
20*1776c5c5Sdh-tools     *
21*1776c5c5Sdh-tools     * @return int
22*1776c5c5Sdh-tools     */
23*1776c5c5Sdh-tools    public function getMenuSort()
24*1776c5c5Sdh-tools    {
25*1776c5c5Sdh-tools        return 300;
26*1776c5c5Sdh-tools    }
27*1776c5c5Sdh-tools
28*1776c5c5Sdh-tools    /**
29*1776c5c5Sdh-tools     * Handle ZIP uploads.
30*1776c5c5Sdh-tools     *
31*1776c5c5Sdh-tools     * @return void
32*1776c5c5Sdh-tools     */
33*1776c5c5Sdh-tools    public function handle()
34*1776c5c5Sdh-tools    {
35*1776c5c5Sdh-tools        global $ID;
36*1776c5c5Sdh-tools
37*1776c5c5Sdh-tools        if (($_POST['fontello_action'] ?? '') === 'save_enabled') {
38*1776c5c5Sdh-tools            if (!checkSecurityToken()) {
39*1776c5c5Sdh-tools                msg($this->getLang('err_bad_token'), -1);
40*1776c5c5Sdh-tools                return;
41*1776c5c5Sdh-tools            }
42*1776c5c5Sdh-tools
43*1776c5c5Sdh-tools            $enabledIcons = $_POST['enabled_icons'] ?? [];
44*1776c5c5Sdh-tools            if (!is_array($enabledIcons)) $enabledIcons = [];
45*1776c5c5Sdh-tools
46*1776c5c5Sdh-tools            try {
47*1776c5c5Sdh-tools                $this->helper->saveEnabledIconNames($enabledIcons);
48*1776c5c5Sdh-tools                msg($this->getLang('activation_ok'), 1);
49*1776c5c5Sdh-tools                send_redirect(wl($ID, ['do' => 'admin', 'page' => 'fontello'], true, '&'));
50*1776c5c5Sdh-tools            } catch (RuntimeException $exception) {
51*1776c5c5Sdh-tools                msg(hsc($exception->getMessage()), -1);
52*1776c5c5Sdh-tools            }
53*1776c5c5Sdh-tools
54*1776c5c5Sdh-tools            return;
55*1776c5c5Sdh-tools        }
56*1776c5c5Sdh-tools
57*1776c5c5Sdh-tools        if (!isset($_FILES['fontellozip']) || ($_FILES['fontellozip']['error'] ?? UPLOAD_ERR_NO_FILE) === UPLOAD_ERR_NO_FILE) {
58*1776c5c5Sdh-tools            return;
59*1776c5c5Sdh-tools        }
60*1776c5c5Sdh-tools
61*1776c5c5Sdh-tools        if (!checkSecurityToken()) {
62*1776c5c5Sdh-tools            msg($this->getLang('err_bad_token'), -1);
63*1776c5c5Sdh-tools            return;
64*1776c5c5Sdh-tools        }
65*1776c5c5Sdh-tools
66*1776c5c5Sdh-tools        try {
67*1776c5c5Sdh-tools            $this->helper->importPackage($_FILES['fontellozip']);
68*1776c5c5Sdh-tools            msg($this->getLang('upload_ok'), 1);
69*1776c5c5Sdh-tools            send_redirect(wl($ID, ['do' => 'admin', 'page' => 'fontello'], true, '&'));
70*1776c5c5Sdh-tools        } catch (RuntimeException $exception) {
71*1776c5c5Sdh-tools            msg(hsc($exception->getMessage()), -1);
72*1776c5c5Sdh-tools        }
73*1776c5c5Sdh-tools    }
74*1776c5c5Sdh-tools
75*1776c5c5Sdh-tools    /**
76*1776c5c5Sdh-tools     * Output the admin page.
77*1776c5c5Sdh-tools     *
78*1776c5c5Sdh-tools     * @return void
79*1776c5c5Sdh-tools     */
80*1776c5c5Sdh-tools    public function html()
81*1776c5c5Sdh-tools    {
82*1776c5c5Sdh-tools        global $lang;
83*1776c5c5Sdh-tools
84*1776c5c5Sdh-tools        $package = $this->helper->getPackageInfo();
85*1776c5c5Sdh-tools
86*1776c5c5Sdh-tools        echo '<h1>' . hsc($this->getLang('menu')) . '</h1>';
87*1776c5c5Sdh-tools        echo $this->locale_xhtml('intro');
88*1776c5c5Sdh-tools
89*1776c5c5Sdh-tools        echo '<form action="" method="post" enctype="multipart/form-data"><div class="no">';
90*1776c5c5Sdh-tools        formSecurityToken();
91*1776c5c5Sdh-tools        echo '<p>';
92*1776c5c5Sdh-tools        echo '<label for="fontellozip">' . hsc($this->getLang('label_zip')) . '</label><br />';
93*1776c5c5Sdh-tools        echo '<input type="file" name="fontellozip" id="fontellozip" accept=".zip,application/zip" /> ';
94*1776c5c5Sdh-tools        echo '<button type="submit">' . hsc($lang['btn_upload']) . '</button>';
95*1776c5c5Sdh-tools        echo '</p>';
96*1776c5c5Sdh-tools        echo '</div></form>';
97*1776c5c5Sdh-tools
98*1776c5c5Sdh-tools        if ($package === null) {
99*1776c5c5Sdh-tools            echo '<p>' . hsc($this->getLang('no_package')) . '</p>';
100*1776c5c5Sdh-tools            return;
101*1776c5c5Sdh-tools        }
102*1776c5c5Sdh-tools
103*1776c5c5Sdh-tools        echo '<div class="table"><table class="inline"><tbody>';
104*1776c5c5Sdh-tools        echo '<tr><th>' . hsc($this->getLang('current_zip')) . '</th><td>' . hsc($package['zip_name']) . '</td></tr>';
105*1776c5c5Sdh-tools        echo '<tr><th>' . hsc($this->getLang('current_prefix')) . '</th><td>' . hsc($package['prefix']) . '</td></tr>';
106*1776c5c5Sdh-tools        echo '<tr><th>' . hsc($this->getLang('current_count')) . '</th><td>' . (int) $package['icon_count'] . '</td></tr>';
107*1776c5c5Sdh-tools        echo '<tr><th>' . hsc($this->getLang('current_enabled')) . '</th><td>' . (int) $package['enabled_count'] . '</td></tr>';
108*1776c5c5Sdh-tools        echo '<tr><th>' . hsc($this->getLang('current_imported')) . '</th><td>' .
109*1776c5c5Sdh-tools            hsc($package['imported_at'] ? $package['imported_at'] : $this->getLang('unknown')) . '</td></tr>';
110*1776c5c5Sdh-tools        echo '</tbody></table></div>';
111*1776c5c5Sdh-tools
112*1776c5c5Sdh-tools        echo '<h2>' . hsc($this->getLang('icons_heading')) . '</h2>';
113*1776c5c5Sdh-tools        echo '<form action="" method="post"><div class="no">';
114*1776c5c5Sdh-tools        formSecurityToken();
115*1776c5c5Sdh-tools        echo '<input type="hidden" name="fontello_action" value="save_enabled" />';
116*1776c5c5Sdh-tools        echo '<div class="table"><table class="inline"><thead><tr>';
117*1776c5c5Sdh-tools        echo '<th>' . hsc($this->getLang('icon_enabled')) . '</th>';
118*1776c5c5Sdh-tools        echo '<th>' . hsc($this->getLang('icon_name')) . '</th>';
119*1776c5c5Sdh-tools        echo '<th>' . hsc($this->getLang('icon_class')) . '</th>';
120*1776c5c5Sdh-tools        echo '<th>' . hsc($this->getLang('icon_preview')) . '</th>';
121*1776c5c5Sdh-tools        echo '</tr></thead><tbody>';
122*1776c5c5Sdh-tools
123*1776c5c5Sdh-tools        foreach ($package['icons'] as $icon) {
124*1776c5c5Sdh-tools            $fieldId = 'fontello-enabled-' . preg_replace('/[^A-Za-z0-9_-]/', '-', $icon['name']);
125*1776c5c5Sdh-tools            echo '<tr>';
126*1776c5c5Sdh-tools            echo '<td><input type="checkbox" name="enabled_icons[]" id="' . hsc($fieldId) . '" value="' .
127*1776c5c5Sdh-tools                hsc($icon['name']) . '"' . (!empty($icon['enabled']) ? ' checked="checked"' : '') . ' /></td>';
128*1776c5c5Sdh-tools            echo '<td><label for="' . hsc($fieldId) . '"><code>' . hsc($icon['name']) . '</code></label></td>';
129*1776c5c5Sdh-tools            echo '<td><code>' . hsc($icon['class']) . '</code></td>';
130*1776c5c5Sdh-tools            echo '<td><span class="fontello-icon ' . hsc($icon['class']) . '" aria-hidden="true"></span></td>';
131*1776c5c5Sdh-tools            echo '</tr>';
132*1776c5c5Sdh-tools        }
133*1776c5c5Sdh-tools
134*1776c5c5Sdh-tools        echo '</tbody></table></div>';
135*1776c5c5Sdh-tools        echo '<p><button type="submit">' . hsc($this->getLang('save_activation')) . '</button></p>';
136*1776c5c5Sdh-tools        echo '</div></form>';
137*1776c5c5Sdh-tools    }
138*1776c5c5Sdh-tools}
139