1123bc813SAndreas Gohr<?php 2123bc813SAndreas Gohr/** 3123bc813SAndreas Gohr * DokuWiki Plugin styling (Admin Component) 4123bc813SAndreas Gohr * 5123bc813SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 6123bc813SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 7123bc813SAndreas Gohr */ 871a75f04SAndreas Gohrclass admin_plugin_styling extends DokuWiki_Admin_Plugin 971a75f04SAndreas Gohr{ 10123bc813SAndreas Gohr 116667cd87SAndreas Gohr public $ispopup = false; 126667cd87SAndreas Gohr 13123bc813SAndreas Gohr /** 14123bc813SAndreas Gohr * @return int sort number in admin menu 15123bc813SAndreas Gohr */ 1671a75f04SAndreas Gohr public function getMenuSort() 1771a75f04SAndreas Gohr { 18123bc813SAndreas Gohr return 1000; 19123bc813SAndreas Gohr } 20123bc813SAndreas Gohr 21123bc813SAndreas Gohr /** 22123bc813SAndreas Gohr * @return bool true if only access for superuser, false is for superusers and moderators 23123bc813SAndreas Gohr */ 2471a75f04SAndreas Gohr public function forAdminOnly() 2571a75f04SAndreas Gohr { 26123bc813SAndreas Gohr return true; 27123bc813SAndreas Gohr } 28123bc813SAndreas Gohr 29123bc813SAndreas Gohr /** 30123bc813SAndreas Gohr * handle the different actions (also called from ajax) 31123bc813SAndreas Gohr */ 3271a75f04SAndreas Gohr public function handle() 3371a75f04SAndreas Gohr { 34123bc813SAndreas Gohr global $INPUT; 35123bc813SAndreas Gohr $run = $INPUT->extract('run')->str('run'); 36123bc813SAndreas Gohr if (!$run) return; 3771a75f04SAndreas Gohr $run = 'run'.ucfirst($run); 38123bc813SAndreas Gohr $this->$run(); 39123bc813SAndreas Gohr } 40123bc813SAndreas Gohr 41123bc813SAndreas Gohr /** 42123bc813SAndreas Gohr * Render HTML output, e.g. helpful text and a form 43123bc813SAndreas Gohr */ 4471a75f04SAndreas Gohr public function html() 4571a75f04SAndreas Gohr { 466667cd87SAndreas Gohr $class = 'nopopup'; 47d634152eSAnika Henke if ($this->ispopup) $class = 'ispopup page'; 486667cd87SAndreas Gohr 496667cd87SAndreas Gohr echo '<div id="plugin__styling" class="'.$class.'">'; 506667cd87SAndreas Gohr ptln('<h1>'.$this->getLang('menu').'</h1>'); 516667cd87SAndreas Gohr $this->form(); 52123bc813SAndreas Gohr echo '</div>'; 53123bc813SAndreas Gohr } 54123bc813SAndreas Gohr 55123bc813SAndreas Gohr /** 56123bc813SAndreas Gohr * Create the actual editing form 57123bc813SAndreas Gohr */ 5871a75f04SAndreas Gohr public function form() 5971a75f04SAndreas Gohr { 60123bc813SAndreas Gohr global $conf; 61123bc813SAndreas Gohr global $ID; 62fb1f9089SMichael Große 634593dbd2SAnna Dabrowska $styleUtil = new \dokuwiki\StyleUtils($conf['template'], true); 644593dbd2SAnna Dabrowska $styleini = $styleUtil->cssStyleini(); 65123bc813SAndreas Gohr $replacements = $styleini['replacements']; 66123bc813SAndreas Gohr 676667cd87SAndreas Gohr if ($this->ispopup) { 686667cd87SAndreas Gohr $target = DOKU_BASE.'lib/plugins/styling/popup.php'; 69123bc813SAndreas Gohr } else { 70123bc813SAndreas Gohr $target = wl($ID, array('do' => 'admin', 'page' => 'styling')); 71123bc813SAndreas Gohr } 72123bc813SAndreas Gohr 73123bc813SAndreas Gohr if (empty($replacements)) { 74123bc813SAndreas Gohr echo '<p class="error">'.$this->getLang('error').'</p>'; 75123bc813SAndreas Gohr } else { 76123bc813SAndreas Gohr echo $this->locale_xhtml('intro'); 77123bc813SAndreas Gohr 78123bc813SAndreas Gohr echo '<form class="styling" method="post" action="'.$target.'">'; 79123bc813SAndreas Gohr 80d634152eSAnika Henke echo '<table><tbody>'; 81123bc813SAndreas Gohr foreach ($replacements as $key => $value) { 82123bc813SAndreas Gohr $name = tpl_getLang($key); 83123bc813SAndreas Gohr if (empty($name)) $name = $this->getLang($key); 84123bc813SAndreas Gohr if (empty($name)) $name = $key; 85123bc813SAndreas Gohr 86123bc813SAndreas Gohr echo '<tr>'; 87147d8f48SAnika Henke echo '<td><label for="tpl__'.hsc($key).'">'.$name.'</label></td>'; 88*3465db0cSAndreas Gohr echo '<td><input type="'.$this->colorType($key).'" name="tpl['.hsc($key).']" id="tpl__'.hsc($key).'" 89*3465db0cSAndreas Gohr value="'.hsc($value).'" dir="ltr" /></td>'; 90123bc813SAndreas Gohr echo '</tr>'; 91123bc813SAndreas Gohr } 92d634152eSAnika Henke echo '</tbody></table>'; 93123bc813SAndreas Gohr 94418cb617SAndreas Gohr echo '<p>'; 9564159a61SAndreas Gohr echo '<button type="submit" name="run[preview]" class="btn_preview primary">'. 9664159a61SAndreas Gohr $this->getLang('btn_preview').'</button> '; 9764159a61SAndreas Gohr #FIXME only if preview.ini exists: 9864159a61SAndreas Gohr echo '<button type="submit" name="run[reset]">'.$this->getLang('btn_reset').'</button>'; 99123bc813SAndreas Gohr echo '</p>'; 100123bc813SAndreas Gohr 101418cb617SAndreas Gohr echo '<p>'; 102cf2c8e75SAnika Henke echo '<button type="submit" name="run[save]" class="primary">'.$this->getLang('btn_save').'</button>'; 103123bc813SAndreas Gohr echo '</p>'; 104123bc813SAndreas Gohr 105418cb617SAndreas Gohr echo '<p>'; 10664159a61SAndreas Gohr #FIXME only if local.ini exists: 10764159a61SAndreas Gohr echo '<button type="submit" name="run[revert]">'.$this->getLang('btn_revert').'</button>'; 108123bc813SAndreas Gohr echo '</p>'; 109123bc813SAndreas Gohr 110123bc813SAndreas Gohr echo '</form>'; 111123bc813SAndreas Gohr 112123bc813SAndreas Gohr echo tpl_locale_xhtml('style'); 113123bc813SAndreas Gohr } 114123bc813SAndreas Gohr } 115123bc813SAndreas Gohr 116123bc813SAndreas Gohr /** 117*3465db0cSAndreas Gohr * Decide the input type based on the key name 118*3465db0cSAndreas Gohr * 119*3465db0cSAndreas Gohr * @param string $key 120*3465db0cSAndreas Gohr * @return string color|text 121123bc813SAndreas Gohr */ 122*3465db0cSAndreas Gohr protected function colorType($key) 12371a75f04SAndreas Gohr { 124123bc813SAndreas Gohr static $colors = array( 125123bc813SAndreas Gohr 'text', 126123bc813SAndreas Gohr 'background', 127123bc813SAndreas Gohr 'text_alt', 128123bc813SAndreas Gohr 'background_alt', 129123bc813SAndreas Gohr 'text_neu', 130123bc813SAndreas Gohr 'background_neu', 131123bc813SAndreas Gohr 'border', 132123bc813SAndreas Gohr 'highlight', 133123bc813SAndreas Gohr 'background_site', 134123bc813SAndreas Gohr 'link', 135123bc813SAndreas Gohr 'existing', 136123bc813SAndreas Gohr 'missing', 137123bc813SAndreas Gohr ); 138123bc813SAndreas Gohr 139123bc813SAndreas Gohr if (preg_match('/colou?r/', $key) || in_array(trim($key, '_'), $colors)) { 140*3465db0cSAndreas Gohr return 'color'; 141123bc813SAndreas Gohr } else { 142*3465db0cSAndreas Gohr return 'text'; 143123bc813SAndreas Gohr } 144123bc813SAndreas Gohr } 145123bc813SAndreas Gohr 146123bc813SAndreas Gohr /** 147123bc813SAndreas Gohr * saves the preview.ini (alos called from ajax directly) 148123bc813SAndreas Gohr */ 14971a75f04SAndreas Gohr public function runPreview() 15071a75f04SAndreas Gohr { 151123bc813SAndreas Gohr global $conf; 152123bc813SAndreas Gohr $ini = $conf['cachedir'].'/preview.ini'; 153123bc813SAndreas Gohr io_saveFile($ini, $this->makeini()); 154123bc813SAndreas Gohr } 155123bc813SAndreas Gohr 156123bc813SAndreas Gohr /** 157123bc813SAndreas Gohr * deletes the preview.ini 158123bc813SAndreas Gohr */ 15971a75f04SAndreas Gohr protected function runReset() 16071a75f04SAndreas Gohr { 161123bc813SAndreas Gohr global $conf; 162123bc813SAndreas Gohr $ini = $conf['cachedir'].'/preview.ini'; 163123bc813SAndreas Gohr io_saveFile($ini, ''); 164123bc813SAndreas Gohr } 165123bc813SAndreas Gohr 166123bc813SAndreas Gohr /** 167123bc813SAndreas Gohr * deletes the local style.ini replacements 168123bc813SAndreas Gohr */ 16971a75f04SAndreas Gohr protected function runRevert() 17071a75f04SAndreas Gohr { 17171a75f04SAndreas Gohr $this->replaceIni(''); 17271a75f04SAndreas Gohr $this->runReset(); 173123bc813SAndreas Gohr } 174123bc813SAndreas Gohr 175123bc813SAndreas Gohr /** 176123bc813SAndreas Gohr * save the local style.ini replacements 177123bc813SAndreas Gohr */ 17871a75f04SAndreas Gohr protected function runSave() 17971a75f04SAndreas Gohr { 18071a75f04SAndreas Gohr $this->replaceIni($this->makeini()); 18171a75f04SAndreas Gohr $this->runReset(); 182123bc813SAndreas Gohr } 183123bc813SAndreas Gohr 184123bc813SAndreas Gohr /** 185123bc813SAndreas Gohr * create the replacement part of a style.ini from submitted data 186123bc813SAndreas Gohr * 187123bc813SAndreas Gohr * @return string 188123bc813SAndreas Gohr */ 18971a75f04SAndreas Gohr protected function makeini() 19071a75f04SAndreas Gohr { 191123bc813SAndreas Gohr global $INPUT; 192123bc813SAndreas Gohr 193123bc813SAndreas Gohr $ini = "[replacements]\n"; 194123bc813SAndreas Gohr $ini .= ";These overwrites have been generated from the Template styling Admin interface\n"; 195123bc813SAndreas Gohr $ini .= ";Any values in this section will be overwritten by that tool again\n"; 196123bc813SAndreas Gohr foreach ($INPUT->arr('tpl') as $key => $val) { 197123bc813SAndreas Gohr $ini .= $key.' = "'.addslashes($val).'"'."\n"; 198123bc813SAndreas Gohr } 199123bc813SAndreas Gohr 200123bc813SAndreas Gohr return $ini; 201123bc813SAndreas Gohr } 202123bc813SAndreas Gohr 203123bc813SAndreas Gohr /** 204123bc813SAndreas Gohr * replaces the replacement parts in the local ini 205123bc813SAndreas Gohr * 206123bc813SAndreas Gohr * @param string $new the new ini contents 207123bc813SAndreas Gohr */ 20871a75f04SAndreas Gohr protected function replaceIni($new) 20971a75f04SAndreas Gohr { 210123bc813SAndreas Gohr global $conf; 211123bc813SAndreas Gohr $ini = DOKU_CONF."tpl/".$conf['template']."/style.ini"; 212123bc813SAndreas Gohr if (file_exists($ini)) { 213123bc813SAndreas Gohr $old = io_readFile($ini); 214123bc813SAndreas Gohr $old = preg_replace('/\[replacements\]\n.*?(\n\[.*]|$)/s', '\\1', $old); 215123bc813SAndreas Gohr $old = trim($old); 216123bc813SAndreas Gohr } else { 217123bc813SAndreas Gohr $old = ''; 218123bc813SAndreas Gohr } 219123bc813SAndreas Gohr 220123bc813SAndreas Gohr io_makeFileDir($ini); 221123bc813SAndreas Gohr io_saveFile($ini, "$old\n\n$new"); 222123bc813SAndreas Gohr } 223123bc813SAndreas Gohr} 224123bc813SAndreas Gohr 225123bc813SAndreas Gohr// vim:ts=4:sw=4:et: 226