Dotclear

source: plugins/blowupConfig/index.php @ 3999:c0171c8cb7d2

Revision 3999:c0171c8cb7d2, 20.7 KB checked in by franck <carnet.franck.paul@…>, 6 years ago (diff)

Switching from inline JS variables to JSON script, blowup config plugin

Line 
1<?php
2/**
3 * @brief blowupConfig, a plugin for Dotclear 2
4 *
5 * @package Dotclear
6 * @subpackage Plugins
7 *
8 * @copyright Olivier Meunier & Association Dotclear
9 * @copyright GPL-2.0-only
10 */
11
12if (!defined('DC_CONTEXT_ADMIN')) {return;}
13
14require dirname(__FILE__) . '/lib/class.blowup.config.php';
15
16$can_write_images = blowupConfig::canWriteImages();
17$can_write_css    = blowupConfig::canWriteCss();
18
19if ($core->error->flag()) {
20    $notices = $core->error->toHTML();
21    $core->error->reset();
22}
23
24$blowup_base = [
25    'body_bg_c'           => null,
26    'body_bg_g'           => 'light',
27
28    'body_txt_f'          => null,
29    'body_txt_s'          => null,
30    'body_txt_c'          => null,
31    'body_line_height'    => null,
32
33    'top_image'           => 'default',
34    'top_height'          => null,
35    'uploaded'            => null,
36
37    'blog_title_hide'     => null,
38    'blog_title_f'        => null,
39    'blog_title_s'        => null,
40    'blog_title_c'        => null,
41    'blog_title_a'        => null,
42    'blog_title_p'        => null,
43
44    'body_link_c'         => null,
45    'body_link_f_c'       => null,
46    'body_link_v_c'       => null,
47
48    'sidebar_position'    => null,
49    'sidebar_text_f'      => null,
50    'sidebar_text_s'      => null,
51    'sidebar_text_c'      => null,
52    'sidebar_title_f'     => null,
53    'sidebar_title_s'     => null,
54    'sidebar_title_c'     => null,
55    'sidebar_title2_f'    => null,
56    'sidebar_title2_s'    => null,
57    'sidebar_title2_c'    => null,
58    'sidebar_line_c'      => null,
59    'sidebar_link_c'      => null,
60    'sidebar_link_f_c'    => null,
61    'sidebar_link_v_c'    => null,
62
63    'date_title_f'        => null,
64    'date_title_s'        => null,
65    'date_title_c'        => null,
66
67    'post_title_f'        => null,
68    'post_title_s'        => null,
69    'post_title_c'        => null,
70    'post_comment_bg_c'   => null,
71    'post_comment_c'      => null,
72    'post_commentmy_bg_c' => null,
73    'post_commentmy_c'    => null,
74
75    'prelude_c'           => null,
76    'footer_f'            => null,
77    'footer_s'            => null,
78    'footer_c'            => null,
79    'footer_l_c'          => null,
80    'footer_bg_c'         => null,
81
82    'extra_css'           => null
83];
84
85$blowup_user = $core->blog->settings->themes->blowup_style;
86
87$blowup_user = @unserialize($blowup_user);
88if (!is_array($blowup_user)) {
89    $blowup_user = [];
90}
91
92$blowup_user = array_merge($blowup_base, $blowup_user);
93
94$gradient_types = [
95    __('Light linear gradient')  => 'light',
96    __('Medium linear gradient') => 'medium',
97    __('Dark linear gradient')   => 'dark',
98    __('Solid color')            => 'solid'
99];
100
101$top_images = [__('Custom...') => 'custom'];
102$top_images = array_merge($top_images, array_flip(blowupConfig::$top_images));
103
104if (!empty($_POST)) {
105    try
106    {
107        $blowup_user['body_txt_f']       = $_POST['body_txt_f'];
108        $blowup_user['body_txt_s']       = dcThemeConfig::adjustFontSize($_POST['body_txt_s']);
109        $blowup_user['body_txt_c']       = dcThemeConfig::adjustColor($_POST['body_txt_c']);
110        $blowup_user['body_line_height'] = dcThemeConfig::adjustFontSize($_POST['body_line_height']);
111
112        $blowup_user['blog_title_hide'] = (integer) !empty($_POST['blog_title_hide']);
113        $update_blog_title              = !$blowup_user['blog_title_hide'] && (
114            !empty($_POST['blog_title_f']) || !empty($_POST['blog_title_s']) ||
115            !empty($_POST['blog_title_c']) || !empty($_POST['blog_title_a']) ||
116            !empty($_POST['blog_title_p'])
117        );
118
119        if ($update_blog_title) {
120            $blowup_user['blog_title_f'] = $_POST['blog_title_f'];
121            $blowup_user['blog_title_s'] = dcThemeConfig::adjustFontSize($_POST['blog_title_s']);
122            $blowup_user['blog_title_c'] = dcThemeConfig::adjustColor($_POST['blog_title_c']);
123            $blowup_user['blog_title_a'] = preg_match('/^(left|center|right)$/', $_POST['blog_title_a']) ? $_POST['blog_title_a'] : null;
124            $blowup_user['blog_title_p'] = dcThemeConfig::adjustPosition($_POST['blog_title_p']);
125        }
126
127        $blowup_user['body_link_c']   = dcThemeConfig::adjustColor($_POST['body_link_c']);
128        $blowup_user['body_link_f_c'] = dcThemeConfig::adjustColor($_POST['body_link_f_c']);
129        $blowup_user['body_link_v_c'] = dcThemeConfig::adjustColor($_POST['body_link_v_c']);
130
131        $blowup_user['sidebar_text_f']   = $_POST['sidebar_text_f'];
132        $blowup_user['sidebar_text_s']   = dcThemeConfig::adjustFontSize($_POST['sidebar_text_s']);
133        $blowup_user['sidebar_text_c']   = dcThemeConfig::adjustColor($_POST['sidebar_text_c']);
134        $blowup_user['sidebar_title_f']  = $_POST['sidebar_title_f'];
135        $blowup_user['sidebar_title_s']  = dcThemeConfig::adjustFontSize($_POST['sidebar_title_s']);
136        $blowup_user['sidebar_title_c']  = dcThemeConfig::adjustColor($_POST['sidebar_title_c']);
137        $blowup_user['sidebar_title2_f'] = $_POST['sidebar_title2_f'];
138        $blowup_user['sidebar_title2_s'] = dcThemeConfig::adjustFontSize($_POST['sidebar_title2_s']);
139        $blowup_user['sidebar_title2_c'] = dcThemeConfig::adjustColor($_POST['sidebar_title2_c']);
140        $blowup_user['sidebar_line_c']   = dcThemeConfig::adjustColor($_POST['sidebar_line_c']);
141        $blowup_user['sidebar_link_c']   = dcThemeConfig::adjustColor($_POST['sidebar_link_c']);
142        $blowup_user['sidebar_link_f_c'] = dcThemeConfig::adjustColor($_POST['sidebar_link_f_c']);
143        $blowup_user['sidebar_link_v_c'] = dcThemeConfig::adjustColor($_POST['sidebar_link_v_c']);
144
145        $blowup_user['sidebar_position'] = ($_POST['sidebar_position'] == 'left') ? 'left' : null;
146
147        $blowup_user['date_title_f'] = $_POST['date_title_f'];
148        $blowup_user['date_title_s'] = dcThemeConfig::adjustFontSize($_POST['date_title_s']);
149        $blowup_user['date_title_c'] = dcThemeConfig::adjustColor($_POST['date_title_c']);
150
151        $blowup_user['post_title_f']     = $_POST['post_title_f'];
152        $blowup_user['post_title_s']     = dcThemeConfig::adjustFontSize($_POST['post_title_s']);
153        $blowup_user['post_title_c']     = dcThemeConfig::adjustColor($_POST['post_title_c']);
154        $blowup_user['post_comment_c']   = dcThemeConfig::adjustColor($_POST['post_comment_c']);
155        $blowup_user['post_commentmy_c'] = dcThemeConfig::adjustColor($_POST['post_commentmy_c']);
156
157        $blowup_user['footer_f']    = $_POST['footer_f'];
158        $blowup_user['footer_s']    = dcThemeConfig::adjustFontSize($_POST['footer_s']);
159        $blowup_user['footer_c']    = dcThemeConfig::adjustColor($_POST['footer_c']);
160        $blowup_user['footer_l_c']  = dcThemeConfig::adjustColor($_POST['footer_l_c']);
161        $blowup_user['footer_bg_c'] = dcThemeConfig::adjustColor($_POST['footer_bg_c']);
162
163        $blowup_user['extra_css'] = dcThemeConfig::cleanCSS($_POST['extra_css']);
164
165        if ($can_write_images) {
166            $uploaded = null;
167            if ($blowup_user['uploaded'] && is_file(blowupConfig::imagesPath() . '/' . $blowup_user['uploaded'])) {
168                $uploaded = blowupConfig::imagesPath() . '/' . $blowup_user['uploaded'];
169            }
170
171            if (!empty($_FILES['upfile']) && !empty($_FILES['upfile']['name'])) {
172                files::uploadStatus($_FILES['upfile']);
173                $uploaded                = blowupConfig::uploadImage($_FILES['upfile']);
174                $blowup_user['uploaded'] = basename($uploaded);
175            }
176
177            $blowup_user['top_image'] = in_array($_POST['top_image'], $top_images) ? $_POST['top_image'] : 'default';
178
179            $blowup_user['body_bg_c']           = dcThemeConfig::adjustColor($_POST['body_bg_c']);
180            $blowup_user['body_bg_g']           = in_array($_POST['body_bg_g'], $gradient_types) ? $_POST['body_bg_g'] : '';
181            $blowup_user['post_comment_bg_c']   = dcThemeConfig::adjustColor($_POST['post_comment_bg_c']);
182            $blowup_user['post_commentmy_bg_c'] = dcThemeConfig::adjustColor($_POST['post_commentmy_bg_c']);
183            $blowup_user['prelude_c']           = dcThemeConfig::adjustColor($_POST['prelude_c']);
184            blowupConfig::createImages($blowup_user, $uploaded);
185        }
186
187        if ($can_write_css) {
188            blowupConfig::createCss($blowup_user);
189        }
190
191        $core->blog->settings->addNamespace('themes');
192        $core->blog->settings->themes->put('blowup_style', serialize($blowup_user));
193        $core->blog->triggerBlog();
194
195        dcPage::addSuccessNotice(__('Theme configuration has been successfully updated.'));
196        http::redirect($p_url);
197    } catch (Exception $e) {
198        $core->error->add($e->getMessage());
199    }
200}
201?>
202<html>
203<head>
204  <title><?php echo __('Blowup configuration'); ?></title>
205  <?php
206$js = [
207    'blowup_public_url' => blowupConfig::imagesURL(),
208    'msg'               => [
209        'predefined_styles'      => __('Predefined styles'),
210        'apply_code'             => __('Apply code'),
211        'predefined_style_title' => __('Choose a predefined style')
212    ]
213];
214echo dcPage::jsJson('blowup', $js);
215echo dcPage::jsLoad(dcPage::getPF('blowupConfig/js/config.js'));
216?>
217</head>
218
219<body>
220<?php
221echo dcPage::breadcrumb(
222    [
223        html::escapeHTML($core->blog->name) => '',
224        __('Blog appearance')               => $core->adminurl->get('admin.blog.theme'),
225        __('Blowup configuration')          => ''
226    ]) . dcPage::notices();
227
228echo
229'<p><a class="back" href="' . $core->adminurl->get('admin.blog.theme') . '">' . __('Back to Blog appearance') . '</a></p>';
230
231if (!$can_write_images) {
232    dcPage::message(__('For the following reasons, images cannot be created. You won\'t be able to change some background properties.') .
233        $notices, false, true);
234}
235
236echo '<form id="theme_config" action="' . $p_url . '" method="post" enctype="multipart/form-data">';
237
238echo '<div class="fieldset"><h3>' . __('Customization') . '</h3>' .
239'<h4>' . __('General') . '</h4>';
240
241if ($can_write_images) {
242    echo
243    '<p class="field"><label for="body_bg_c">' . __('Background color:') . '</label> ' .
244    form::color('body_bg_c', ['default' => $blowup_user['body_bg_c']]) . '</p>' .
245
246    '<p class="field"><label for="body_bg_g">' . __('Background color fill:') . '</label> ' .
247    form::combo('body_bg_g', $gradient_types, $blowup_user['body_bg_g']) . '</p>';
248}
249
250echo
251'<p class="field"><label for="body_txt_f">' . __('Main text font:') . '</label> ' .
252form::combo('body_txt_f', blowupConfig::fontsList(), $blowup_user['body_txt_f']) . '</p>' .
253
254'<p class="field"><label for="body_txt_s">' . __('Main text font size:') . '</label> ' .
255form::field('body_txt_s', 7, 7, $blowup_user['body_txt_s']) . '</p>' .
256
257'<p class="field"><label for="body_txt_c">' . __('Main text color:') . '</label> ' .
258form::color('body_txt_c', ['default' => $blowup_user['body_txt_c']]) . '</p>' .
259
260'<p class="field"><label for="body_line_height">' . __('Text line height:') . '</label> ' .
261form::field('body_line_height', 7, 7, $blowup_user['body_line_height']) . '</p>' .
262
263'<h4 class="border-top">' . __('Links') . '</h4>' .
264'<p class="field"><label for="body_link_c">' . __('Links color:') . '</label> ' .
265form::color('body_link_c', ['default' => $blowup_user['body_link_c']]) . '</p>' .
266
267'<p class="field"><label for="body_link_v_c">' . __('Visited links color:') . '</label> ' .
268form::color('body_link_v_c', ['default' => $blowup_user['body_link_v_c']]) . '</p>' .
269
270'<p class="field"><label for="body_link_f_c">' . __('Focus links color:') . '</label> ' .
271form::color('body_link_f_c', ['default' => $blowup_user['body_link_f_c']]) . '</p>' .
272
273'<h4 class="border-top">' . __('Page top') . '</h4>';
274
275if ($can_write_images) {
276    echo
277    '<p class="field"><label for="prelude_c">' . __('Prelude color:') . '</label> ' .
278    form::color('prelude_c', ['default' => $blowup_user['prelude_c']]) . '</p>';
279}
280
281echo
282'<p class="field"><label for="blog_title_hide">' . __('Hide main title') . '</label> ' .
283form::checkbox('blog_title_hide', 1, $blowup_user['blog_title_hide']) . '</p>' .
284
285'<p class="field"><label for="blog_title_f">' . __('Main title font:') . '</label> ' .
286form::combo('blog_title_f', blowupConfig::fontsList(), $blowup_user['blog_title_f']) . '</p>' .
287
288'<p class="field"><label for="blog_title_s">' . __('Main title font size:') . '</label> ' .
289form::field('blog_title_s', 7, 7, $blowup_user['blog_title_s']) . '</p>' .
290
291'<p class="field"><label for="blog_title_c">' . __('Main title color:') . '</label> ' .
292form::color('blog_title_c', ['default' => $blowup_user['blog_title_c']]) . '</p>' .
293
294'<p class="field"><label for="blog_title_a">' . __('Main title alignment:') . '</label> ' .
295form::combo('blog_title_a', [__('center') => 'center', __('left') => 'left', __('right') => 'right'], $blowup_user['blog_title_a']) . '</p>' .
296
297'<p class="field"><label for="blog_title_p">' . __('Main title position (x:y)') . '</label> ' .
298form::field('blog_title_p', 7, 7, $blowup_user['blog_title_p']) . '</p>';
299
300if ($can_write_images) {
301    if ($blowup_user['top_image'] == 'custom' && $blowup_user['uploaded']) {
302        $preview_image = http::concatURL($core->blog->url, blowupConfig::imagesURL() . '/page-t.png');
303    } else {
304        $preview_image = dcPage::getPF('blowupConfig/alpha-img/page-t/' . $blowup_user['top_image'] . '.png');
305    }
306
307    echo
308    '<h5 class="pretty-title">' . __('Top image') . '</h5>' .
309    '<p class="field"><label for="top_image">' . __('Top image') . '</label> ' .
310    form::combo('top_image', $top_images, ($blowup_user['top_image'] ?: 'default')) . '</p>' .
311    '<p>' . __('Choose "Custom..." to upload your own image.') . '</p>' .
312
313    '<p id="uploader"><label for="upfile">' . __('Add your image:') . '</label> ' .
314    ' (' . sprintf(__('JPEG or PNG file, 800 pixels wide, maximum size %s'), files::size(DC_MAX_UPLOAD_SIZE)) . ')' .
315    '<input type="file" name="upfile" id="upfile" size="35" />' .
316    '</p>' .
317
318    '<h5>' . __('Preview') . '</h5>' .
319        '<div class="grid" style="width:800px;border:1px solid #ccc;">' .
320        '<img style="display:block;" src="' . $preview_image . '" alt="" id="image-preview" />' .
321        '</div>';
322}
323
324echo
325'<h4 class="border-top">' . __('Sidebar') . '</h4>' .
326'<p class="field"><label for="sidebar_position">' . __('Sidebar position:') . '</label> ' .
327form::combo('sidebar_position', [__('right') => 'right', __('left') => 'left'], $blowup_user['sidebar_position']) . '</p>' .
328
329'<p class="field"><label for="sidebar_text_f">' . __('Sidebar text font:') . '</label> ' .
330form::combo('sidebar_text_f', blowupConfig::fontsList(), $blowup_user['sidebar_text_f']) . '</p>' .
331
332'<p class="field"><label for="sidebar_text_s">' . __('Sidebar text font size:') . '</label> ' .
333form::field('sidebar_text_s', 7, 7, $blowup_user['sidebar_text_s']) . '</p>' .
334
335'<p class="field"><label for="sidebar_text_c">' . __('Sidebar text color:') . '</label> ' .
336form::color('sidebar_text_c', ['default' => $blowup_user['sidebar_text_c']]) . '</p>' .
337
338'<p class="field"><label for="sidebar_title_f">' . __('Sidebar titles font:') . '</label> ' .
339form::combo('sidebar_title_f', blowupConfig::fontsList(), $blowup_user['sidebar_title_f']) . '</p>' .
340
341'<p class="field"><label for="sidebar_title_s">' . __('Sidebar titles font size:') . '</label> ' .
342form::field('sidebar_title_s', 7, 7, $blowup_user['sidebar_title_s']) . '</p>' .
343
344'<p class="field"><label for="sidebar_title_c">' . __('Sidebar titles color:') . '</label> ' .
345form::color('sidebar_title_c', ['default' => $blowup_user['sidebar_title_c']]) . '</p>' .
346
347'<p class="field"><label for="sidebar_title2_f">' . __('Sidebar 2nd level titles font:') . '</label> ' .
348form::combo('sidebar_title2_f', blowupConfig::fontsList(), $blowup_user['sidebar_title2_f']) . '</p>' .
349
350'<p class="field"><label for="sidebar_title2_s">' . __('Sidebar 2nd level titles font size:') . '</label> ' .
351form::field('sidebar_title2_s', 7, 7, $blowup_user['sidebar_title2_s']) . '</p>' .
352
353'<p class="field"><label for="sidebar_title2_c">' . __('Sidebar 2nd level titles color:') . '</label> ' .
354form::color('sidebar_title2_c', ['default' => $blowup_user['sidebar_title2_c']]) . '</p>' .
355
356'<p class="field"><label for="sidebar_line_c">' . __('Sidebar lines color:') . '</label> ' .
357form::color('sidebar_line_c', ['default' => $blowup_user['sidebar_line_c']]) . '</p>' .
358
359'<p class="field"><label for="sidebar_link_c">' . __('Sidebar links color:') . '</label> ' .
360form::color('sidebar_link_c', ['default' => $blowup_user['sidebar_link_c']]) . '</p>' .
361
362'<p class="field"><label for="sidebar_link_v_c">' . __('Sidebar visited links color:') . '</label> ' .
363form::color('sidebar_link_v_c', ['default' => $blowup_user['sidebar_link_v_c']]) . '</p>' .
364
365'<p class="field"><label for="sidebar_link_f_c">' . __('Sidebar focus links color:') . '</label> ' .
366form::color('sidebar_link_f_c', ['default' => $blowup_user['sidebar_link_f_c']]) . '</p>' .
367
368'<h4 class="border-top">' . __('Entries') . '</h4>' .
369'<p class="field"><label for="date_title_f">' . __('Date title font:') . '</label> ' .
370form::combo('date_title_f', blowupConfig::fontsList(), $blowup_user['date_title_f']) . '</p>' .
371
372'<p class="field"><label for="date_title_s">' . __('Date title font size:') . '</label> ' .
373form::field('date_title_s', 7, 7, $blowup_user['date_title_s']) . '</p>' .
374
375'<p class="field"><label for="date_title_c">' . __('Date title color:') . '</label> ' .
376form::color('date_title_c', ['default' => $blowup_user['date_title_c']]) . '</p>' .
377
378'<p class="field"><label for="post_title_f">' . __('Entry title font:') . '</label> ' .
379form::combo('post_title_f', blowupConfig::fontsList(), $blowup_user['post_title_f']) . '</p>' .
380
381'<p class="field"><label for="post_title_s">' . __('Entry title font size:') . '</label> ' .
382form::field('post_title_s', 7, 7, $blowup_user['post_title_s']) . '</p>' .
383
384'<p class="field"><label for="post_title_c">' . __('Entry title color:') . '</label> ' .
385form::color('post_title_c', ['default' => $blowup_user['post_title_c']]) . '</p>';
386
387if ($can_write_images) {
388    echo
389    '<p class="field"><label for="post_comment_bg_c">' . __('Comment background color:') . '</label> ' .
390    form::color('post_comment_bg_c', ['default' => $blowup_user['post_comment_bg_c']]) . '</p>';
391}
392
393echo
394'<p class="field"><label for="post_comment_c">' . __('Comment text color:') . '</label> ' .
395form::color('post_comment_c', ['default' => $blowup_user['post_comment_c']]) . '</p>';
396
397if ($can_write_images) {
398    echo
399    '<p class="field"><label for="post_commentmy_bg_c">' . __('My comment background color:') . '</label> ' .
400    form::color('post_commentmy_bg_c', ['default' => $blowup_user['post_commentmy_bg_c']]) . '</p>';
401}
402
403echo
404'<p class="field"><label for="post_commentmy_c">' . __('My comment text color:') . '</label> ' .
405form::color('post_commentmy_c', ['default' => $blowup_user['post_commentmy_c']]) . '</p>' .
406
407'<h4 class="border-top">' . __('Footer') . '</h4>' .
408'<p class="field"><label for="footer_f">' . __('Footer font:') . '</label> ' .
409form::combo('footer_f', blowupConfig::fontsList(), $blowup_user['footer_f']) . '</p>' .
410
411'<p class="field"><label for="footer_s">' . __('Footer font size:') . '</label> ' .
412form::field('footer_s', 7, 7, $blowup_user['footer_s']) . '</p>' .
413
414'<p class="field"><label for="footer_c">' . __('Footer color:') . '</label> ' .
415form::color('footer_c', ['default' => $blowup_user['footer_c']]) . '</p>' .
416
417'<p class="field"><label for="footer_l_c">' . __('Footer links color:') . '</label> ' .
418form::color('footer_l_c', ['default' => $blowup_user['footer_l_c']]) . '</p>' .
419
420'<p class="field"><label for="footer_bg_c">' . __('Footer background color:') . '</label> ' .
421form::color('footer_bg_c', ['default' => $blowup_user['footer_bg_c']]) . '</p>';
422
423echo
424'<h4 class="border-top">' . __('Additional CSS') . '</h4>' .
425'<p><label for="extra_css">' . __('Any additional CSS styles (must be written using the CSS syntax):') . '</label> ' .
426form::textarea('extra_css', 72, 5, [
427    'default'    => html::escapeHTML($blowup_user['extra_css']),
428    'class'      => 'maximal',
429    'extra_html' => 'title="' . __('Additional CSS') . '"'
430]) .
431    '</p>' .
432    '</div>';
433
434// Import / Export configuration
435$tmp_array   = [];
436$tmp_exclude = ['uploaded', 'top_height'];
437if ($blowup_user['top_image'] == 'custom') {
438    $tmp_exclude[] = 'top_image';
439}
440foreach ($blowup_user as $k => $v) {
441    if (!in_array($k, $tmp_exclude)) {
442        $tmp_array[] = $k . ':' . '"' . $v . '"';
443    }
444}
445echo
446'<div class="fieldset">' .
447'<h3 id="bu_export">' . __('Configuration import / export') . '</h3>' .
448'<div id="bu_export_content">' .
449'<p>' . __('You can share your configuration using the following code. To apply a configuration, paste the code, click on "Apply code" and save.') . '</p>' .
450'<p>' . form::textarea('export_code', 72, 5, [
451    'default'    => implode('; ', $tmp_array),
452    'class'      => 'maximal',
453    'extra_html' => 'title="' . __('Copy this code:') . '"'
454]) . '</p>' .
455    '</div>' .
456    '</div>';
457
458echo
459'<p class="clear"><input type="submit" value="' . __('Save') . '" />' .
460$core->formNonce() . '</p>' .
461    '</form>';
462
463dcPage::helpBlock('blowupConfig');
464?>
465</body>
466</html>
Note: See TracBrowser for help on using the repository browser.

Sites map