Dotclear

source: admin/blog_theme.php @ 1358:f117338392dc

Revision 1358:f117338392dc, 11.4 KB checked in by franck <carnet.franck.paul@…>, 11 years ago (diff)

Messages are now displayed below the breadcrumb, fixes #1528

Line 
1<?php
2# -- BEGIN LICENSE BLOCK ---------------------------------------
3#
4# This file is part of Dotclear 2.
5#
6# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
7# Licensed under the GPL version 2.0 license.
8# See LICENSE file or
9# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10#
11# -- END LICENSE BLOCK -----------------------------------------
12
13require dirname(__FILE__).'/../inc/admin/prepend.php';
14
15dcPage::check('admin');
16
17# Loading themes
18$core->themes = new dcThemes($core);
19$core->themes->loadModules($core->blog->themes_path,null);
20
21# Theme screenshot
22if (!empty($_GET['shot']) && $core->themes->moduleExists($_GET['shot']))
23{
24     if (empty($_GET['src'])) {
25          $f = $core->blog->themes_path.'/'.$_GET['shot'].'/screenshot.jpg';
26     } else {
27          $f = $core->blog->themes_path.'/'.$_GET['shot'].'/'.path::clean($_GET['src']);
28     }
29     
30     $f = path::real($f);
31     
32     if (!file_exists($f)) {
33          $f = dirname(__FILE__).'/images/noscreenshot.png';
34     }
35     
36     http::cache(array_merge(array($f),get_included_files()));
37     
38     header('Content-Type: '.files::getMimeType($f));
39     header('Content-Length: '.filesize($f));
40     readfile($f);
41     
42     exit;
43}
44
45$can_install = $core->auth->isSuperAdmin();
46$is_writable = is_dir($core->blog->themes_path) && is_writable($core->blog->themes_path);
47$default_tab = 'themes-list';
48
49# Selecting theme
50if (!empty($_POST['theme']) && !empty($_POST['select']) && empty($_REQUEST['conf']))
51{
52     $core->blog->settings->addNamespace('system');
53     $core->blog->settings->system->put('theme',$_POST['theme']);
54     $core->blog->triggerBlog();
55     http::redirect('blog_theme.php?upd=1');
56}
57
58if ($can_install && !empty($_POST['theme']) && !empty($_POST['remove']) && empty($_REQUEST['conf']))
59{
60     try
61     {
62          if ($_POST['theme'] == 'default') {
63               throw new Exception(__('You can\'t remove default theme.'));
64          }
65         
66          if (!$core->themes->moduleExists($_POST['theme'])) {
67               throw new Exception(__('Theme does not exist.'));
68          }
69         
70          $theme = $core->themes->getModules($_POST['theme']);
71         
72          # --BEHAVIOR-- themeBeforeDelete
73          $core->callBehavior('themeBeforeDelete',$theme);
74         
75          $core->themes->deleteModule($_POST['theme']);
76         
77          # --BEHAVIOR-- themeAfterDelete
78          $core->callBehavior('themeAfterDelete',$theme);
79         
80          http::redirect('blog_theme.php?del=1');
81     }
82     catch (Exception $e)
83     {
84          $core->error->add($e->getMessage());
85     }
86}
87
88# Theme upload
89if ($can_install && $is_writable && ((!empty($_POST['upload_pkg']) && !empty($_FILES['pkg_file'])) ||
90     (!empty($_POST['fetch_pkg']) && !empty($_POST['pkg_url']))))
91{
92     try
93     {
94          if (empty($_POST['your_pwd']) || !$core->auth->checkPassword(crypt::hmac(DC_MASTER_KEY,$_POST['your_pwd']))) {
95               throw new Exception(__('Password verification failed'));
96          }
97         
98          if (!empty($_POST['upload_pkg']))
99          {
100               files::uploadStatus($_FILES['pkg_file']);
101               
102               $dest = $core->blog->themes_path.'/'.$_FILES['pkg_file']['name'];
103               if (!move_uploaded_file($_FILES['pkg_file']['tmp_name'],$dest)) {
104                    throw new Exception(__('Unable to move uploaded file.'));
105               }
106          }
107          else
108          {
109               $url = urldecode($_POST['pkg_url']);
110               $dest = $core->blog->themes_path.'/'.basename($url);
111               
112               try
113               {
114                    $client = netHttp::initClient($url,$path);
115                    $client->setUserAgent('Dotclear - http://www.dotclear.org/');
116                    $client->useGzip(false);
117                    $client->setPersistReferers(false);
118                    $client->setOutput($dest);
119                    $client->get($path);
120               }
121               catch( Exception $e)
122               {
123                    throw new Exception(__('An error occurred while downloading the file.'));
124               }
125               
126               unset($client);
127          }
128         
129          $ret_code = dcModules::installPackage($dest,$core->themes);
130          http::redirect('blog_theme.php?added='.$ret_code);
131     }
132     catch (Exception $e)
133     {
134          $core->error->add($e->getMessage());
135          $default_tab = 'add-theme';
136     }
137}
138
139$theme_conf_mode = false;
140if (!empty($_REQUEST['conf']))
141{
142     $theme_conf_file = path::real($core->blog->themes_path.'/'.$core->blog->settings->system->theme).'/_config.php';
143     if (file_exists($theme_conf_file)) {
144          $theme_conf_mode = true;
145     }
146}
147
148function display_theme_details($id,$details,$current)
149{
150     global $core;
151     
152     $screenshot = 'images/noscreenshot.png';
153     if (file_exists($core->blog->themes_path.'/'.$id.'/screenshot.jpg')) {
154          $screenshot = 'blog_theme.php?shot='.rawurlencode($id);
155     }
156     
157     $radio_id = 'theme_'.html::escapeHTML($id);
158     if (preg_match('#^http(s)?://#',$core->blog->settings->system->themes_url)) {
159          $theme_url = http::concatURL($core->blog->settings->system->themes_url,'/'.$id);
160     } else {
161          $theme_url = http::concatURL($core->blog->url,$core->blog->settings->system->themes_url.'/'.$id);
162     }
163     $has_conf = file_exists(path::real($core->blog->themes_path.'/'.$id).'/_config.php');
164     $has_css = file_exists(path::real($core->blog->themes_path.'/'.$id).'/style.css');
165     $parent = $core->themes->moduleInfo($id,'parent');
166     $has_parent = (boolean)$parent;
167     if ($has_parent) {
168          $is_parent_present = $core->themes->moduleExists($parent);
169     }
170     
171     $res =
172     '<div class="theme-details'.($current ? ' current-theme' : '').'">'.
173     '<div class="theme-shot"><img src="'.$screenshot.'" alt="" /></div>'.
174     '<div class="theme-info">'.
175          '<h3>'.form::radio(array('theme',$radio_id),html::escapeHTML($id),$current,'','',($has_parent && !$is_parent_present)).' '.
176          '<label class="classic" for="'.$radio_id.'">'.
177          html::escapeHTML($details['name']).'</label></h3>'.
178          '<p><span class="theme-desc">'.html::escapeHTML($details['desc']).'</span> '.
179          '<span class="theme-author">'.sprintf(__('by %s'),html::escapeHTML($details['author'])).'</span> '.
180          '<span class="theme-version">'.sprintf(__('version %s'),html::escapeHTML($details['version'])).'</span> ';
181          if ($has_parent) {
182               if ($is_parent_present) {
183                    $res .= '<span class="theme-parent-ok">'.sprintf(__('(built on "%s")'),html::escapeHTML($parent)).'</span> ';
184               } else {
185                    $res .= '<span class="theme-parent-missing">'.sprintf(__('(requires "%s")'),html::escapeHTML($parent)).'</span> ';
186               }
187          }
188          if ($has_css) {
189               $res .= '<a class="theme-css" href="'.$theme_url.'/style.css">'.__('Stylesheet').'</a>';
190          }
191          $res .= '</p>';
192     $res .=
193     '</div>'.
194     '<div class="theme-actions">';
195          if ($current && $has_conf) {
196               $res .= '<p><a href="blog_theme.php?conf=1" class="button">'.__('Configure theme').'</a></p>';
197          }
198          if ($current) {
199               # --BEHAVIOR-- adminCurrentThemeDetails
200               $res .= $core->callBehavior('adminCurrentThemeDetails',$core,$id,$details);
201          }
202     $res .=
203     '</div>'.
204     '</div>';
205     
206     return $res;
207}
208
209if (!$theme_conf_mode)
210{
211     $breadcrumb = dcPage::breadcrumb(
212          array(
213               html::escapeHTML($core->blog->name) => '',
214               '<span class="page-title">'.__('Blog appearance').'</span>' => ''
215          ));
216} else {
217     $breadcrumb = dcPage::breadcrumb(
218          array(
219               html::escapeHTML($core->blog->name) => '',
220               __('Blog appearance') => 'blog_theme.php',
221               '<span class="page-title">'.__('Theme configuration').'</span>' => ''
222          ));
223}
224
225dcPage::open(__('Blog appearance'),
226     (!$theme_conf_mode ? dcPage::jsLoad('js/_blog_theme.js') : '').
227     dcPage::jsPageTabs($default_tab).
228     dcPage::jsColorPicker(),
229     $breadcrumb
230);
231
232if (!$theme_conf_mode)
233{
234     if (!empty($_GET['upd'])) {
235          dcPage::message(__('Theme has been successfully changed.'));
236     }
237     
238     if (!empty($_GET['added'])) {
239          dcPage::message(($_GET['added'] == 2 ? __('Theme has been successfully upgraded') : __('Theme has been successfully installed.')));
240     }
241     
242     if (!empty($_GET['del'])) {
243          dcPage::message(__('Theme has been successfully deleted.'));
244     }
245     
246     if ($can_install) {
247          echo
248          '<p><strong>'.sprintf(__('You can find additional themes for your blog on %s.'),
249          '<a href="http://themes.dotaddict.org/galerie-dc2/">Dotaddict</a>').'</strong> '.
250          __('To install or upgrade a theme you generally just need to upload it '.
251          'in "Install or upgrade a theme" section.').'</p>';
252     }
253     
254     # Themes list
255     echo '<div class="multi-part" id="themes-list" title="'.__('Themes').'">';
256     
257     $themes = $core->themes->getModules();
258     if (isset($themes[$core->blog->settings->system->theme])) {
259          echo '<h3>'.sprintf(__('You are currently using "%s"'),$themes[$core->blog->settings->system->theme]['name']).'</h3>';
260     }
261     
262     echo
263     '<form action="blog_theme.php" method="post" id="themes-form">'.
264     '<div id="themes">';
265     
266     if (isset($themes[$core->blog->settings->system->theme])) {
267          echo display_theme_details($core->blog->settings->system->theme,$themes[$core->blog->settings->system->theme],true);
268     }
269     
270     foreach ($themes as $k => $v)
271     {
272          if ($core->blog->settings->system->theme == $k) { // Current theme
273               continue;
274          }
275          echo display_theme_details($k,$v,false);
276     }
277     
278     echo '</div>';
279     
280     echo
281     '<div class="two-cols clear" id="themes-actions">'.
282     $core->formNonce().
283     '<p class="col"><input type="submit" name="select" value="'.__('Use selected theme').'" /></p>';
284     
285     if ($can_install) {
286          echo '<p class="col right"><input type="submit" class="delete" name="remove" value="'.__('Delete selected theme').'" /></p>';
287     }
288     
289     echo
290     '</div>'.
291     '</form>'.
292     '</div>';
293     
294     # Add a new theme
295     if ($can_install)
296     {
297          echo
298          '<div class="multi-part clear" id="add-theme" title="'.__('Install or upgrade a theme').'">';
299         
300          if ($is_writable)
301          {
302               echo '<p>'.__('You can install themes by uploading or downloading zip files.').'</p>';
303               
304               # 'Upload theme' form
305               echo
306               '<form method="post" action="blog_theme.php" id="uploadpkg" enctype="multipart/form-data">'.
307               '<fieldset>'.
308               '<legend>'.__('Upload a zip file').'</legend>'.
309               '<p class="field"><label for="pkg_file" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Theme zip file:').' '.
310               '<input type="file" name="pkg_file" id="pkg_file" /></label></p>'.
311               '<p class="field"><label for="your_pwd1" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Your password:').' '.
312               form::password(array('your_pwd','your_pwd1'),20,255).'</label></p>'.
313               '<input type="submit" name="upload_pkg" value="'.__('Upload theme').'" />'.
314               $core->formNonce().
315               '</fieldset>'.
316               '</form>';
317               
318               # 'Fetch theme' form
319               echo
320               '<form method="post" action="blog_theme.php" id="fetchpkg">'.
321               '<fieldset>'.
322               '<legend>'.__('Download a zip file').'</legend>'.
323               '<p class="field"><label for="pkg_url" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Theme zip file URL:').' '.
324               form::field(array('pkg_url','pkg_url'),40,255).'</label></p>'.
325               '<p class="field"><label for="your_pwd2" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Your password:').' '.
326               form::password(array('your_pwd','your_pwd2'),20,255).'</label></p>'.
327               '<input type="submit" name="fetch_pkg" value="'.__('Download theme').'" />'.
328               $core->formNonce().
329               '</fieldset>'.
330               '</form>';
331          }
332          else
333          {
334               echo
335               '<p class="static-msg">'.
336               __('To enable this function, please give write access to your themes directory.').
337               '</p>';
338          }
339          echo '</div>';
340     }
341}
342else
343{
344     $theme_name = $core->themes->moduleInfo($core->blog->settings->system->theme,'name');
345     $core->themes->loadModuleL10Nresources($core->blog->settings->system->theme,$_lang);
346
347     echo
348     '<p><a class="back" href="blog_theme.php">'.__('back').'</a></p>';
349     
350     try
351     {
352          # Let theme configuration set their own form(s) if required
353          $standalone_config = (boolean) $core->themes->moduleInfo($core->blog->settings->system->theme,'standalone_config');
354
355          if (!$standalone_config)
356               echo '<form id="theme_config" action="blog_theme.php?conf=1" method="post" enctype="multipart/form-data">';
357
358          include $theme_conf_file;
359
360          if (!$standalone_config)
361               echo
362               '<p class="clear"><input type="submit" value="'.__('Save').'" />'.
363               $core->formNonce().'</p>'.
364               '</form>';
365
366     }
367     catch (Exception $e)
368     {
369          echo '<div class="error"><p>'.$e->getMessage().'</p></div>';
370     }
371}
372
373dcPage::close();
374?>
Note: See TracBrowser for help on using the repository browser.

Sites map