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