~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/php/phpBB3/includes/acp/acp_styles.php

Merge from no-phpbb-for-you. phpBB is no longer available by default.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
<?php
2
 
/**
3
 
*
4
 
* @package acp
5
 
* @version $Id: acp_styles.php,v 1.117 2007/10/21 11:26:24 acydburn Exp $
6
 
* @copyright (c) 2005 phpBB Group
7
 
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
8
 
*
9
 
*/
10
 
 
11
 
/**
12
 
* @ignore
13
 
*/
14
 
if (!defined('IN_PHPBB'))
15
 
{
16
 
        exit;
17
 
}
18
 
 
19
 
/**
20
 
* @package acp
21
 
*/
22
 
class acp_styles
23
 
{
24
 
        var $u_action;
25
 
 
26
 
        var $style_cfg;
27
 
        var $template_cfg;
28
 
        var $theme_cfg;
29
 
        var $imageset_cfg;
30
 
        var $imageset_keys;
31
 
 
32
 
        function main($id, $mode)
33
 
        {
34
 
                global $db, $user, $auth, $template, $cache;
35
 
                global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
36
 
 
37
 
                // Hardcoded template bitfield to add for new templates
38
 
                $bitfield = new bitfield();
39
 
                $bitfield->set(0);
40
 
                $bitfield->set(3);
41
 
                $bitfield->set(8);
42
 
                $bitfield->set(9);
43
 
                $bitfield->set(11);
44
 
                $bitfield->set(12);
45
 
                define('TEMPLATE_BITFIELD', $bitfield->get_base64());
46
 
                unset($bitfield);
47
 
 
48
 
                $user->add_lang('acp/styles');
49
 
 
50
 
                $this->tpl_name = 'acp_styles';
51
 
                $this->page_title = 'ACP_CAT_STYLES';
52
 
 
53
 
                $action = request_var('action', '');
54
 
                $action = (isset($_POST['add'])) ? 'add' : $action;
55
 
                $style_id = request_var('id', 0);
56
 
 
57
 
                // Fill the configuration variables
58
 
                $this->style_cfg = $this->template_cfg = $this->theme_cfg = $this->imageset_cfg = '
59
 
#
60
 
# phpBB {MODE} configuration file
61
 
#
62
 
# @package phpBB3
63
 
# @copyright (c) 2005 phpBB Group
64
 
# @license http://opensource.org/licenses/gpl-license.php GNU Public License
65
 
#
66
 
#
67
 
# At the left is the name, please do not change this
68
 
# At the right the value is entered
69
 
# For on/off options the valid values are on, off, 1, 0, true and false
70
 
#
71
 
# Values get trimmed, if you want to add a space in front or at the end of
72
 
# the value, then enclose the value with single or double quotes.
73
 
# Single and double quotes do not need to be escaped.
74
 
#
75
 
#
76
 
 
77
 
# General Information about this {MODE}
78
 
name = {NAME}
79
 
copyright = {COPYRIGHT}
80
 
version = {VERSION}
81
 
';
82
 
 
83
 
                $this->theme_cfg .= '
84
 
# Some configuration options
85
 
 
86
 
#
87
 
# You have to turn this option on if you want to use the
88
 
# path template variables ({T_IMAGESET_PATH} for example) within
89
 
# your css file.
90
 
# This is mostly the case if you want to use language specific
91
 
# images within your css file.
92
 
#
93
 
parse_css_file = {PARSE_CSS_FILE}
94
 
';
95
 
 
96
 
                $this->imageset_keys = array(
97
 
                        'logos' => array(
98
 
                                'site_logo',
99
 
                        ),
100
 
                        'buttons'       => array(
101
 
                                'icon_back_top', 'icon_contact_aim', 'icon_contact_email', 'icon_contact_icq', 'icon_contact_jabber', 'icon_contact_msnm', 'icon_contact_pm', 'icon_contact_yahoo', 'icon_contact_www', 'icon_post_delete', 'icon_post_edit', 'icon_post_info', 'icon_post_quote', 'icon_post_report', 'icon_user_online', 'icon_user_offline', 'icon_user_profile', 'icon_user_search', 'icon_user_warn', 'button_pm_forward', 'button_pm_new', 'button_pm_reply', 'button_topic_locked', 'button_topic_new', 'button_topic_reply',
102
 
                        ),
103
 
                        'icons'         => array(
104
 
                                'icon_post_target', 'icon_post_target_unread', 'icon_topic_attach', 'icon_topic_latest', 'icon_topic_newest', 'icon_topic_reported', 'icon_topic_unapproved', 'icon_friend', 'icon_foe',
105
 
                        ),
106
 
                        'forums'        => array(
107
 
                                'forum_link', 'forum_read', 'forum_read_locked', 'forum_read_subforum', 'forum_unread', 'forum_unread_locked', 'forum_unread_subforum', 'subforum_read', 'subforum_unread'
108
 
                        ),
109
 
                        'folders'       => array(
110
 
                                'topic_moved', 'topic_read', 'topic_read_mine', 'topic_read_hot', 'topic_read_hot_mine', 'topic_read_locked', 'topic_read_locked_mine', 'topic_unread', 'topic_unread_mine', 'topic_unread_hot', 'topic_unread_hot_mine', 'topic_unread_locked', 'topic_unread_locked_mine', 'sticky_read', 'sticky_read_mine', 'sticky_read_locked', 'sticky_read_locked_mine', 'sticky_unread', 'sticky_unread_mine', 'sticky_unread_locked', 'sticky_unread_locked_mine', 'announce_read', 'announce_read_mine', 'announce_read_locked', 'announce_read_locked_mine', 'announce_unread', 'announce_unread_mine', 'announce_unread_locked', 'announce_unread_locked_mine', 'global_read', 'global_read_mine', 'global_read_locked', 'global_read_locked_mine', 'global_unread', 'global_unread_mine', 'global_unread_locked', 'global_unread_locked_mine', 'pm_read', 'pm_unread',
111
 
                        ),
112
 
                        'polls'         => array(
113
 
                                'poll_left', 'poll_center', 'poll_right',
114
 
                        ),
115
 
                        'ui'            => array(
116
 
                                'upload_bar',
117
 
                        ),
118
 
                        'user'          => array(
119
 
                                'user_icon1', 'user_icon2', 'user_icon3', 'user_icon4', 'user_icon5', 'user_icon6', 'user_icon7', 'user_icon8', 'user_icon9', 'user_icon10',
120
 
                        ),
121
 
                );
122
 
 
123
 
                // Execute overall actions
124
 
                switch ($action)
125
 
                {
126
 
                        case 'delete':
127
 
                                if ($style_id)
128
 
                                {
129
 
                                        $this->remove($mode, $style_id);
130
 
                                        return;
131
 
                                }
132
 
                        break;
133
 
 
134
 
                        case 'export':
135
 
                                if ($style_id)
136
 
                                {
137
 
                                        $this->export($mode, $style_id);
138
 
                                        return;
139
 
                                }
140
 
                        break;
141
 
 
142
 
                        case 'install':
143
 
                                $this->install($mode);
144
 
                                return;
145
 
                        break;
146
 
 
147
 
                        case 'add':
148
 
                                $this->add($mode);
149
 
                                return;
150
 
                        break;
151
 
 
152
 
                        case 'details':
153
 
                                if ($style_id)
154
 
                                {
155
 
                                        $this->details($mode, $style_id);
156
 
                                        return;
157
 
                                }
158
 
                        break;
159
 
 
160
 
                        case 'edit':
161
 
                                if ($style_id)
162
 
                                {
163
 
                                        switch ($mode)
164
 
                                        {
165
 
                                                case 'imageset':
166
 
                                                        return $this->edit_imageset($style_id);
167
 
                                                case 'template':
168
 
                                                        return $this->edit_template($style_id);
169
 
                                                case 'theme':
170
 
                                                        return $this->edit_theme($style_id);
171
 
                                        }
172
 
                                }
173
 
                        break;
174
 
 
175
 
                        case 'cache':
176
 
                                if ($style_id)
177
 
                                {
178
 
                                        switch ($mode)
179
 
                                        {
180
 
                                                case 'template':
181
 
                                                        return $this->template_cache($style_id);
182
 
                                        }
183
 
                                }
184
 
                        break;
185
 
                }
186
 
 
187
 
                switch ($mode)
188
 
                {
189
 
                        case 'style':
190
 
 
191
 
                                switch ($action)
192
 
                                {
193
 
                                        case 'activate':
194
 
                                        case 'deactivate':
195
 
 
196
 
                                                if ($style_id == $config['default_style'])
197
 
                                                {
198
 
                                                        trigger_error($user->lang['DEACTIVATE_DEFAULT'] . adm_back_link($this->u_action), E_USER_WARNING);
199
 
                                                }
200
 
 
201
 
                                                $sql = 'UPDATE ' . STYLES_TABLE . '
202
 
                                                        SET style_active = ' . (($action == 'activate') ? 1 : 0) . '
203
 
                                                        WHERE style_id = ' . $style_id;
204
 
                                                $db->sql_query($sql);
205
 
 
206
 
                                                // Set style to default for any member using deactivated style
207
 
                                                if ($action == 'deactivate')
208
 
                                                {
209
 
                                                        $sql = 'UPDATE ' . USERS_TABLE . '
210
 
                                                                SET user_style = ' . $config['default_style'] . "
211
 
                                                                WHERE user_style = $style_id";
212
 
                                                        $db->sql_query($sql);
213
 
 
214
 
                                                        $sql = 'UPDATE ' . FORUMS_TABLE . '
215
 
                                                                SET forum_style = 0
216
 
                                                                WHERE forum_style = ' . $style_id;
217
 
                                                        $db->sql_query($sql);
218
 
                                                }
219
 
                                        break;
220
 
                                }
221
 
 
222
 
                                $this->frontend('style', array('details'), array('export', 'delete'));
223
 
                        break;
224
 
 
225
 
                        case 'template':
226
 
 
227
 
                                switch ($action)
228
 
                                {
229
 
                                        // Refresh template data stored in db and clear cache
230
 
                                        case 'refresh':
231
 
 
232
 
                                                $sql = 'SELECT *
233
 
                                                        FROM ' . STYLES_TEMPLATE_TABLE . "
234
 
                                                        WHERE template_id = $style_id";
235
 
                                                $result = $db->sql_query($sql);
236
 
                                                $template_row = $db->sql_fetchrow($result);
237
 
                                                $db->sql_freeresult($result);
238
 
 
239
 
                                                if (!$template_row)
240
 
                                                {
241
 
                                                        trigger_error($user->lang['NO_TEMPLATE'] . adm_back_link($this->u_action), E_USER_WARNING);
242
 
                                                }
243
 
 
244
 
                                                if (confirm_box(true))
245
 
                                                {
246
 
                                                        $template_refreshed = '';
247
 
 
248
 
                                                        // Only refresh database if the template is stored in the database
249
 
                                                        if ($template_row['template_storedb'] && file_exists("{$phpbb_root_path}styles/{$template_row['template_path']}/template/"))
250
 
                                                        {
251
 
                                                                $filelist = array('' => array());
252
 
 
253
 
                                                                $sql = 'SELECT template_filename, template_mtime
254
 
                                                                        FROM ' . STYLES_TEMPLATE_DATA_TABLE . "
255
 
                                                                        WHERE template_id = $style_id";
256
 
                                                                $result = $db->sql_query($sql);
257
 
 
258
 
                                                                while ($row = $db->sql_fetchrow($result))
259
 
                                                                {
260
 
//                                                                      if (@filemtime("{$phpbb_root_path}styles/{$template_row['template_path']}/template/" . $row['template_filename']) > $row['template_mtime'])
261
 
//                                                                      {
262
 
                                                                                // get folder info from the filename
263
 
                                                                                if (($slash_pos = strrpos($row['template_filename'], '/')) === false)
264
 
                                                                                {
265
 
                                                                                        $filelist[''][] = $row['template_filename'];
266
 
                                                                                }
267
 
                                                                                else
268
 
                                                                                {
269
 
                                                                                        $filelist[substr($row['template_filename'], 0, $slash_pos + 1)][] = substr($row['template_filename'], $slash_pos + 1, strlen($row['template_filename']) - $slash_pos - 1);
270
 
                                                                                }
271
 
//                                                                      }
272
 
                                                                }
273
 
                                                                $db->sql_freeresult($result);
274
 
 
275
 
                                                                $this->store_templates('update', $style_id, $template_row['template_path'], $filelist);
276
 
                                                                unset($filelist);
277
 
 
278
 
                                                                $template_refreshed = $user->lang['TEMPLATE_REFRESHED'] . '<br />';
279
 
                                                                add_log('admin', 'LOG_TEMPLATE_REFRESHED', $template_row['template_name']);
280
 
                                                        }
281
 
 
282
 
                                                        $this->clear_template_cache($template_row);
283
 
 
284
 
                                                        trigger_error($template_refreshed . $user->lang['TEMPLATE_CACHE_CLEARED'] . adm_back_link($this->u_action));
285
 
                                                }
286
 
                                                else
287
 
                                                {
288
 
                                                        confirm_box(false, ($template_row['template_storedb']) ? $user->lang['CONFIRM_TEMPLATE_REFRESH'] : $user->lang['CONFIRM_TEMPLATE_CLEAR_CACHE'], build_hidden_fields(array(
289
 
                                                                'i'                     => $id,
290
 
                                                                'mode'          => $mode,
291
 
                                                                'action'        => $action,
292
 
                                                                'id'            => $style_id
293
 
                                                        )));
294
 
                                                }
295
 
 
296
 
                                        break;
297
 
                                }
298
 
 
299
 
                                $this->frontend('template', array('edit', 'cache', 'details'), array('refresh', 'export', 'delete'));
300
 
                        break;
301
 
 
302
 
                        case 'theme':
303
 
 
304
 
                                switch ($action)
305
 
                                {
306
 
                                        // Refresh theme data stored in the database
307
 
                                        case 'refresh':
308
 
 
309
 
                                                $sql = 'SELECT *
310
 
                                                        FROM ' . STYLES_THEME_TABLE . "
311
 
                                                        WHERE theme_id = $style_id";
312
 
                                                $result = $db->sql_query($sql);
313
 
                                                $theme_row = $db->sql_fetchrow($result);
314
 
                                                $db->sql_freeresult($result);
315
 
 
316
 
                                                if (!$theme_row)
317
 
                                                {
318
 
                                                        trigger_error($user->lang['NO_THEME'] . adm_back_link($this->u_action), E_USER_WARNING);
319
 
                                                }
320
 
 
321
 
                                                if (!$theme_row['theme_storedb'])
322
 
                                                {
323
 
                                                        trigger_error($user->lang['THEME_ERR_REFRESH_FS'] . adm_back_link($this->u_action), E_USER_WARNING);
324
 
                                                }
325
 
 
326
 
                                                if (confirm_box(true))
327
 
                                                {
328
 
                                                        if ($theme_row['theme_storedb'] && file_exists("{$phpbb_root_path}styles/{$theme_row['theme_path']}/theme/stylesheet.css"))
329
 
                                                        {
330
 
                                                                // Save CSS contents
331
 
                                                                $sql_ary = array(
332
 
                                                                        'theme_mtime'   => (int) filemtime("{$phpbb_root_path}styles/{$theme_row['theme_path']}/theme/stylesheet.css"),
333
 
                                                                        'theme_data'    => $this->db_theme_data($theme_row)
334
 
                                                                );
335
 
 
336
 
                                                                $sql = 'UPDATE ' . STYLES_THEME_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
337
 
                                                                        WHERE theme_id = $style_id";
338
 
                                                                $db->sql_query($sql);
339
 
 
340
 
                                                                $cache->destroy('sql', STYLES_THEME_TABLE);
341
 
 
342
 
                                                                add_log('admin', 'LOG_THEME_REFRESHED', $theme_row['theme_name']);
343
 
                                                                trigger_error($user->lang['THEME_REFRESHED'] . adm_back_link($this->u_action));
344
 
                                                        }
345
 
                                                }
346
 
                                                else
347
 
                                                {
348
 
                                                        confirm_box(false, $user->lang['CONFIRM_THEME_REFRESH'], build_hidden_fields(array(
349
 
                                                                'i'                     => $id,
350
 
                                                                'mode'          => $mode,
351
 
                                                                'action'        => $action,
352
 
                                                                'id'            => $style_id
353
 
                                                        )));
354
 
                                                }
355
 
                                        break;
356
 
                                }
357
 
 
358
 
                                $this->frontend('theme', array('edit', 'details'), array('refresh', 'export', 'delete'));
359
 
                        break;
360
 
 
361
 
                        case 'imageset':
362
 
 
363
 
                                switch ($action)
364
 
                                {
365
 
                                        case 'refresh':
366
 
 
367
 
                                                $sql = 'SELECT *
368
 
                                                        FROM ' . STYLES_IMAGESET_TABLE . "
369
 
                                                        WHERE imageset_id = $style_id";
370
 
                                                $result = $db->sql_query($sql);
371
 
                                                $imageset_row = $db->sql_fetchrow($result);
372
 
                                                $db->sql_freeresult($result);
373
 
 
374
 
                                                if (!$imageset_row)
375
 
                                                {
376
 
                                                        trigger_error($user->lang['NO_IMAGESET'] . adm_back_link($this->u_action), E_USER_WARNING);
377
 
                                                }
378
 
 
379
 
                                                if (confirm_box(true))
380
 
                                                {
381
 
                                                        $sql_ary = array();
382
 
 
383
 
                                                        $imageset_definitions = array();
384
 
                                                        foreach ($this->imageset_keys as $topic => $key_array)
385
 
                                                        {
386
 
                                                                $imageset_definitions = array_merge($imageset_definitions, $key_array);
387
 
                                                        }
388
 
 
389
 
                                                        $cfg_data_imageset = parse_cfg_file("{$phpbb_root_path}styles/{$imageset_row['imageset_path']}/imageset/imageset.cfg");
390
 
 
391
 
                                                        $db->sql_transaction('begin');
392
 
 
393
 
                                                        $sql = 'DELETE FROM ' . STYLES_IMAGESET_DATA_TABLE . '
394
 
                                                                WHERE imageset_id = ' . $style_id;
395
 
                                                        $result = $db->sql_query($sql);
396
 
 
397
 
                                                        foreach ($cfg_data_imageset as $image_name => $value)
398
 
                                                        {
399
 
                                                                if (strpos($value, '*') !== false)
400
 
                                                                {
401
 
                                                                        if (substr($value, -1, 1) === '*')
402
 
                                                                        {
403
 
                                                                                list($image_filename, $image_height) = explode('*', $value);
404
 
                                                                                $image_width = 0;
405
 
                                                                        }
406
 
                                                                        else
407
 
                                                                        {
408
 
                                                                                list($image_filename, $image_height, $image_width) = explode('*', $value);
409
 
                                                                        }
410
 
                                                                }
411
 
                                                                else
412
 
                                                                {
413
 
                                                                        $image_filename = $value;
414
 
                                                                        $image_height = $image_width = 0;
415
 
                                                                }
416
 
 
417
 
                                                                if (strpos($image_name, 'img_') === 0 && $image_filename)
418
 
                                                                {
419
 
                                                                        $image_name = substr($image_name, 4);
420
 
                                                                        if (in_array($image_name, $imageset_definitions))
421
 
                                                                        {
422
 
                                                                                $sql_ary[] = array(
423
 
                                                                                        'image_name'            => (string) $image_name,
424
 
                                                                                        'image_filename'        => (string) $image_filename,
425
 
                                                                                        'image_height'          => (int) $image_height,
426
 
                                                                                        'image_width'           => (int) $image_width,
427
 
                                                                                        'imageset_id'           => (int) $style_id,
428
 
                                                                                        'image_lang'            => '',
429
 
                                                                                );
430
 
                                                                        }
431
 
                                                                }
432
 
                                                        }
433
 
 
434
 
                                                        $sql = 'SELECT lang_dir
435
 
                                                                FROM ' . LANG_TABLE;
436
 
                                                        $result = $db->sql_query($sql);
437
 
 
438
 
                                                        while ($row = $db->sql_fetchrow($result))
439
 
                                                        {
440
 
                                                                if (@file_exists("{$phpbb_root_path}styles/{$imageset_row['imageset_path']}/imageset/{$row['lang_dir']}/imageset.cfg"))
441
 
                                                                {
442
 
                                                                        $cfg_data_imageset_data = parse_cfg_file("{$phpbb_root_path}styles/{$imageset_row['imageset_path']}/imageset/{$row['lang_dir']}/imageset.cfg");
443
 
                                                                        foreach ($cfg_data_imageset_data as $image_name => $value)
444
 
                                                                        {
445
 
                                                                                if (strpos($value, '*') !== false)
446
 
                                                                                {
447
 
                                                                                        if (substr($value, -1, 1) === '*')
448
 
                                                                                        {
449
 
                                                                                                list($image_filename, $image_height) = explode('*', $value);
450
 
                                                                                                $image_width = 0;
451
 
                                                                                        }
452
 
                                                                                        else
453
 
                                                                                        {
454
 
                                                                                                list($image_filename, $image_height, $image_width) = explode('*', $value);
455
 
                                                                                        }
456
 
                                                                                }
457
 
                                                                                else
458
 
                                                                                {
459
 
                                                                                        $image_filename = $value;
460
 
                                                                                        $image_height = $image_width = 0;
461
 
                                                                                }
462
 
 
463
 
                                                                                if (strpos($image_name, 'img_') === 0 && $image_filename)
464
 
                                                                                {
465
 
                                                                                        $image_name = substr($image_name, 4);
466
 
                                                                                        if (in_array($image_name, $imageset_definitions))
467
 
                                                                                        {
468
 
                                                                                                $sql_ary[] = array(
469
 
                                                                                                        'image_name'            => (string) $image_name,
470
 
                                                                                                        'image_filename'        => (string) $image_filename,
471
 
                                                                                                        'image_height'          => (int) $image_height,
472
 
                                                                                                        'image_width'           => (int) $image_width,
473
 
                                                                                                        'imageset_id'           => (int) $style_id,
474
 
                                                                                                        'image_lang'            => (string) $row['lang_dir'],
475
 
                                                                                                );
476
 
                                                                                        }
477
 
                                                                                }
478
 
                                                                        }
479
 
                                                                }
480
 
                                                        }
481
 
                                                        $db->sql_freeresult($result);
482
 
 
483
 
                                                        $db->sql_multi_insert(STYLES_IMAGESET_DATA_TABLE, $sql_ary);
484
 
 
485
 
                                                        $db->sql_transaction('commit');
486
 
 
487
 
                                                        $cache->destroy('sql', STYLES_IMAGESET_DATA_TABLE);
488
 
 
489
 
                                                        add_log('admin', 'LOG_IMAGESET_REFRESHED', $imageset_row['imageset_name']);
490
 
                                                        trigger_error($user->lang['IMAGESET_REFRESHED'] . adm_back_link($this->u_action));
491
 
                                                }
492
 
                                                else
493
 
                                                {
494
 
                                                        confirm_box(false, $user->lang['CONFIRM_IMAGESET_REFRESH'], build_hidden_fields(array(
495
 
                                                                'i'                     => $id,
496
 
                                                                'mode'          => $mode,
497
 
                                                                'action'        => $action,
498
 
                                                                'id'            => $style_id
499
 
                                                        )));
500
 
                                                }
501
 
                                        break;
502
 
                                }
503
 
 
504
 
                                $this->frontend('imageset', array('edit', 'details'), array('refresh', 'export', 'delete'));
505
 
                        break;
506
 
                }
507
 
        }
508
 
 
509
 
        /**
510
 
        * Build Frontend with supplied options
511
 
        */
512
 
        function frontend($mode, $options, $actions)
513
 
        {
514
 
                global $user, $template, $db, $config, $phpbb_root_path, $phpEx;
515
 
 
516
 
                $sql_from = '';
517
 
                $style_count = array();
518
 
 
519
 
                switch ($mode)
520
 
                {
521
 
                        case 'style':
522
 
                                $sql_from = STYLES_TABLE;
523
 
 
524
 
                                $sql = 'SELECT user_style, COUNT(user_style) AS style_count
525
 
                                        FROM ' . USERS_TABLE . '
526
 
                                        GROUP BY user_style';
527
 
                                $result = $db->sql_query($sql);
528
 
 
529
 
                                while ($row = $db->sql_fetchrow($result))
530
 
                                {
531
 
                                        $style_count[$row['user_style']] = $row['style_count'];
532
 
                                }
533
 
                                $db->sql_freeresult($result);
534
 
 
535
 
                        break;
536
 
 
537
 
                        case 'template':
538
 
                                $sql_from = STYLES_TEMPLATE_TABLE;
539
 
                        break;
540
 
 
541
 
                        case 'theme':
542
 
                                $sql_from = STYLES_THEME_TABLE;
543
 
                        break;
544
 
 
545
 
                        case 'imageset':
546
 
                                $sql_from = STYLES_IMAGESET_TABLE;
547
 
                        break;
548
 
                }
549
 
 
550
 
                $l_prefix = strtoupper($mode);
551
 
 
552
 
                $this->page_title = 'ACP_' . $l_prefix . 'S';
553
 
 
554
 
                $template->assign_vars(array(
555
 
                        'S_FRONTEND'            => true,
556
 
                        'S_STYLE'                       => ($mode == 'style') ? true : false,
557
 
 
558
 
                        'L_TITLE'                       => $user->lang[$this->page_title],
559
 
                        'L_EXPLAIN'                     => $user->lang[$this->page_title . '_EXPLAIN'],
560
 
                        'L_NAME'                        => $user->lang[$l_prefix . '_NAME'],
561
 
                        'L_INSTALLED'           => $user->lang['INSTALLED_' . $l_prefix],
562
 
                        'L_UNINSTALLED'         => $user->lang['UNINSTALLED_' . $l_prefix],
563
 
                        'L_NO_UNINSTALLED'      => $user->lang['NO_UNINSTALLED_' . $l_prefix],
564
 
                        'L_CREATE'                      => $user->lang['CREATE_' . $l_prefix],
565
 
 
566
 
                        'U_ACTION'                      => $this->u_action,
567
 
                        )
568
 
                );
569
 
 
570
 
                $sql = "SELECT *
571
 
                        FROM $sql_from";
572
 
                $result = $db->sql_query($sql);
573
 
 
574
 
                $installed = array();
575
 
 
576
 
                $basis_options = '<option class="sep" value="">' . $user->lang['OPTIONAL_BASIS'] . '</option>';
577
 
                while ($row = $db->sql_fetchrow($result))
578
 
                {
579
 
                        $installed[] = $row[$mode . '_name'];
580
 
                        $basis_options .= '<option value="' . $row[$mode . '_id'] . '">' . $row[$mode . '_name'] . '</option>';
581
 
 
582
 
                        $stylevis = ($mode == 'style' && !$row['style_active']) ? 'activate' : 'deactivate';
583
 
 
584
 
                        $s_options = array();
585
 
                        foreach ($options as $option)
586
 
                        {
587
 
                                $s_options[] = '<a href="' . $this->u_action . "&amp;action=$option&amp;id=" . $row[$mode . '_id'] . '">' . $user->lang[strtoupper($option)] . '</a>';
588
 
                        }
589
 
 
590
 
                        $s_actions = array();
591
 
                        foreach ($actions as $option)
592
 
                        {
593
 
                                $s_actions[] = '<a href="' . $this->u_action . "&amp;action=$option&amp;id=" . $row[$mode . '_id'] . '">' . $user->lang[strtoupper($option)] . '</a>';
594
 
                        }
595
 
 
596
 
                        $template->assign_block_vars('installed', array(
597
 
                                'S_DEFAULT_STYLE'               => ($mode == 'style' && $row['style_id'] == $config['default_style']) ? true : false,
598
 
                                'U_EDIT'                                => $this->u_action . '&amp;action=' . (($mode == 'style') ? 'details' : 'edit') . '&amp;id=' . $row[$mode . '_id'],
599
 
                                'U_STYLE_ACT_DEACT'             => $this->u_action . '&amp;action=' . $stylevis . '&amp;id=' . $row[$mode . '_id'],
600
 
                                'L_STYLE_ACT_DEACT'             => $user->lang['STYLE_' . strtoupper($stylevis)],
601
 
                                'S_OPTIONS'                             => implode(' | ', $s_options),
602
 
                                'S_ACTIONS'                             => implode(' | ', $s_actions),
603
 
                                'U_PREVIEW'                             => ($mode == 'style') ? append_sid("{$phpbb_root_path}index.$phpEx", "$mode=" . $row[$mode . '_id']) : '',
604
 
 
605
 
                                'NAME'                                  => $row[$mode . '_name'],
606
 
                                'STYLE_COUNT'                   => ($mode == 'style' && isset($style_count[$row['style_id']])) ? $style_count[$row['style_id']] : 0,
607
 
                                )
608
 
                        );
609
 
                }
610
 
                $db->sql_freeresult($result);
611
 
 
612
 
                // Grab uninstalled items
613
 
                $new_ary = $cfg = array();
614
 
 
615
 
                $dp = @opendir("{$phpbb_root_path}styles");
616
 
 
617
 
                if ($dp)
618
 
                {
619
 
                        while (($file = readdir($dp)) !== false)
620
 
                        {
621
 
                                $subpath = ($mode != 'style') ? "$mode/" : '';
622
 
                                if ($file[0] != '.' && file_exists("{$phpbb_root_path}styles/$file/$subpath$mode.cfg"))
623
 
                                {
624
 
                                        if ($cfg = file("{$phpbb_root_path}styles/$file/$subpath$mode.cfg"))
625
 
                                        {
626
 
                                                $items = parse_cfg_file('', $cfg);
627
 
                                                $name = (isset($items['name'])) ? trim($items['name']) : false;
628
 
 
629
 
                                                if ($name && !in_array($name, $installed))
630
 
                                                {
631
 
                                                        $new_ary[] = array(
632
 
                                                                'path'          => $file,
633
 
                                                                'name'          => $name,
634
 
                                                                'copyright'     => $items['copyright'],
635
 
                                                        );
636
 
                                                }
637
 
                                        }
638
 
                                }
639
 
                        }
640
 
                        closedir($dp);
641
 
                }
642
 
 
643
 
                unset($installed);
644
 
 
645
 
                if (sizeof($new_ary))
646
 
                {
647
 
                        foreach ($new_ary as $cfg)
648
 
                        {
649
 
                                $template->assign_block_vars('uninstalled', array(
650
 
                                        'NAME'                  => $cfg['name'],
651
 
                                        'COPYRIGHT'             => $cfg['copyright'],
652
 
                                        'U_INSTALL'             => $this->u_action . '&amp;action=install&amp;path=' . urlencode($cfg['path']))
653
 
                                );
654
 
                        }
655
 
                }
656
 
                unset($new_ary);
657
 
 
658
 
                $template->assign_vars(array(
659
 
                        'S_BASIS_OPTIONS'               => $basis_options)
660
 
                );
661
 
 
662
 
        }
663
 
 
664
 
        /**
665
 
        * Provides a template editor which allows saving changes to template files on the filesystem or in the database.
666
 
        *
667
 
        * @param int $template_id specifies which template set is being edited
668
 
        */
669
 
        function edit_template($template_id)
670
 
        {
671
 
                global $phpbb_root_path, $phpEx, $config, $db, $cache, $user, $template, $safe_mode;
672
 
 
673
 
                $this->page_title = 'EDIT_TEMPLATE';
674
 
 
675
 
                $filelist = $filelist_cats = array();
676
 
 
677
 
                $template_data  = utf8_normalize_nfc(request_var('template_data', '', true));
678
 
                $template_data  = htmlspecialchars_decode($template_data);
679
 
                $template_file  = utf8_normalize_nfc(request_var('template_file', '', true));
680
 
                $text_rows              = max(5, min(999, request_var('text_rows', 20)));
681
 
                $save_changes   = (isset($_POST['save'])) ? true : false;
682
 
 
683
 
                // make sure template_file path doesn't go upwards
684
 
                $template_file = str_replace('..', '.', $template_file);
685
 
                
686
 
                // Retrieve some information about the template
687
 
                $sql = 'SELECT template_storedb, template_path, template_name
688
 
                        FROM ' . STYLES_TEMPLATE_TABLE . "
689
 
                        WHERE template_id = $template_id";
690
 
                $result = $db->sql_query($sql);
691
 
                $template_info = $db->sql_fetchrow($result);
692
 
                $db->sql_freeresult($result);
693
 
 
694
 
                if (!$template_info)
695
 
                {
696
 
                        trigger_error($user->lang['NO_TEMPLATE'] . adm_back_link($this->u_action), E_USER_WARNING);
697
 
                }
698
 
 
699
 
                // save changes to the template if the user submitted any
700
 
                if ($save_changes && $template_file)
701
 
                {
702
 
                        // Get the filesystem location of the current file
703
 
                        $file = "{$phpbb_root_path}styles/{$template_info['template_path']}/template/$template_file";
704
 
                        $additional = '';
705
 
 
706
 
                        // If the template is stored on the filesystem try to write the file else store it in the database
707
 
                        if (!$safe_mode && !$template_info['template_storedb'] && file_exists($file) && @is_writable($file))
708
 
                        {
709
 
                                if (!($fp = @fopen($file, 'wb')))
710
 
                                {
711
 
                                        trigger_error($user->lang['NO_TEMPLATE'] . adm_back_link($this->u_action), E_USER_WARNING);
712
 
                                }
713
 
                                fwrite($fp, $template_data);
714
 
                                fclose($fp);
715
 
                        }
716
 
                        else
717
 
                        {
718
 
                                $db->sql_transaction('begin');
719
 
 
720
 
                                // If it's not stored in the db yet, then update the template setting and store all template files in the db
721
 
                                if (!$template_info['template_storedb'])
722
 
                                {
723
 
                                        $sql = 'UPDATE ' . STYLES_TEMPLATE_TABLE . '
724
 
                                                SET template_storedb = 1
725
 
                                                WHERE template_id = ' . $template_id;
726
 
                                        $db->sql_query($sql);
727
 
 
728
 
                                        $filelist = filelist("{$phpbb_root_path}styles/{$template_info['template_path']}/template", '', 'html');
729
 
                                        $this->store_templates('insert', $template_id, $template_info['template_path'], $filelist);
730
 
 
731
 
                                        add_log('admin', 'LOG_TEMPLATE_EDIT_DETAILS', $template_info['template_name']);
732
 
                                        $additional .= '<br />' . $user->lang['EDIT_TEMPLATE_STORED_DB'];
733
 
                                }
734
 
 
735
 
                                // Update the template_data table entry for this template file
736
 
                                $sql = 'UPDATE ' . STYLES_TEMPLATE_DATA_TABLE . "
737
 
                                        SET template_data = '" . $db->sql_escape($template_data) . "', template_mtime = " . time() . "
738
 
                                        WHERE template_id = $template_id
739
 
                                                AND template_filename = '" . $db->sql_escape($template_file) . "'";
740
 
                                $db->sql_query($sql);
741
 
 
742
 
                                $db->sql_transaction('commit');
743
 
                        }
744
 
 
745
 
                        // destroy the cached version of the template (filename without extension)
746
 
                        $this->clear_template_cache($template_info, array(substr($template_file, 0, -5)));
747
 
 
748
 
                        $cache->destroy('sql', STYLES_TABLE);
749
 
 
750
 
                        add_log('admin', 'LOG_TEMPLATE_EDIT', $template_info['template_name'], $template_file);
751
 
                        trigger_error($user->lang['TEMPLATE_FILE_UPDATED'] . $additional . adm_back_link($this->u_action . "&amp;action=edit&amp;id=$template_id&amp;text_rows=$text_rows&amp;template_file=$template_file"));
752
 
                }
753
 
 
754
 
                // Generate a category array containing template filenames
755
 
                if (!$template_info['template_storedb'])
756
 
                {
757
 
                        $template_path = "{$phpbb_root_path}styles/{$template_info['template_path']}/template";
758
 
 
759
 
                        $filelist = filelist($template_path, '', 'html');
760
 
                        $filelist[''] = array_diff($filelist[''], array('bbcode.html'));
761
 
 
762
 
                        if ($template_file)
763
 
                        {
764
 
                                if (!file_exists($template_path . "/$template_file") || !($template_data = file_get_contents($template_path . "/$template_file")))
765
 
                                {
766
 
                                        trigger_error($user->lang['NO_TEMPLATE'] . adm_back_link($this->u_action), E_USER_WARNING);
767
 
                                }
768
 
                        }
769
 
                }
770
 
                else
771
 
                {
772
 
                        $sql = 'SELECT *
773
 
                                FROM ' . STYLES_TEMPLATE_DATA_TABLE . "
774
 
                                WHERE template_id = $template_id";
775
 
                        $result = $db->sql_query($sql);
776
 
 
777
 
                        $filelist = array('' => array());
778
 
                        while ($row = $db->sql_fetchrow($result))
779
 
                        {
780
 
                                $file_info = pathinfo($row['template_filename']);
781
 
 
782
 
                                if (($file_info['basename'] != 'bbcode') && ($file_info['extension'] == 'html'))
783
 
                                {
784
 
                                        if (($file_info['dirname'] == '.') || empty($file_info['dirname']))
785
 
                                        {
786
 
                                                $filelist[''][] = $row['template_filename'];
787
 
                                        }
788
 
                                        else
789
 
                                        {
790
 
                                                $filelist[$file_info['dirname'] . '/'][] = $file_info['basename'];
791
 
                                        }
792
 
                                }
793
 
 
794
 
                                if ($row['template_filename'] == $template_file)
795
 
                                {
796
 
                                        $template_data = $row['template_data'];
797
 
                                }
798
 
                        }
799
 
                        $db->sql_freeresult($result);
800
 
                        unset($file_info);
801
 
                }
802
 
 
803
 
                // Now create the categories
804
 
                $filelist_cats[''] = array();
805
 
                foreach ($filelist as $pathfile => $file_ary)
806
 
                {
807
 
                        // Use the directory name as category name
808
 
                        if (!empty($pathfile))
809
 
                        {
810
 
                                $filelist_cats[$pathfile] = array();
811
 
                                foreach ($file_ary as $file)
812
 
                                {
813
 
                                        $filelist_cats[$pathfile][$pathfile . $file] = $file;
814
 
                                }
815
 
                        }
816
 
                        // or if it's in the main category use the word before the first underscore to group files
817
 
                        else
818
 
                        {
819
 
                                $cats = array();
820
 
                                foreach ($file_ary as $file)
821
 
                                {
822
 
                                        $cats[] = substr($file, 0, strpos($file, '_'));
823
 
                                        $filelist_cats[substr($file, 0, strpos($file, '_'))][$file] = $file;
824
 
                                }
825
 
 
826
 
                                $cats = array_values(array_unique($cats));
827
 
 
828
 
                                // we don't need any single element categories so put them into the misc '' category
829
 
                                for ($i = 0, $n = sizeof($cats); $i < $n; $i++)
830
 
                                {
831
 
                                        if (sizeof($filelist_cats[$cats[$i]]) == 1 && $cats[$i] !== '')
832
 
                                        {
833
 
                                                $filelist_cats[''][key($filelist_cats[$cats[$i]])] = current($filelist_cats[$cats[$i]]);
834
 
                                                unset($filelist_cats[$cats[$i]]);
835
 
                                        }
836
 
                                }
837
 
                                unset($cats);
838
 
                        }
839
 
                }
840
 
                unset($filelist);
841
 
 
842
 
                // Generate list of categorised template files
843
 
                $tpl_options = '';
844
 
                ksort($filelist_cats);
845
 
                foreach ($filelist_cats as $category => $tpl_ary)
846
 
                {
847
 
                        ksort($tpl_ary);
848
 
 
849
 
                        if (!empty($category))
850
 
                        {
851
 
                                $tpl_options .= '<option class="sep" value="">' . $category . '</option>';
852
 
                        }
853
 
 
854
 
                        foreach ($tpl_ary as $filename => $file)
855
 
                        {
856
 
                                $selected = ($template_file == $filename) ? ' selected="selected"' : '';
857
 
                                $tpl_options .= '<option value="' . $filename . '"' . $selected . '>' . $file . '</option>';
858
 
                        }
859
 
                }
860
 
 
861
 
                $template->assign_vars(array(
862
 
                        'S_EDIT_TEMPLATE'       => true,
863
 
                        'S_HIDDEN_FIELDS'       => build_hidden_fields(array('template_file' => $template_file)),
864
 
                        'S_TEMPLATES'           => $tpl_options,
865
 
 
866
 
                        'U_ACTION'                      => $this->u_action . "&amp;action=edit&amp;id=$template_id&amp;text_rows=$text_rows",
867
 
                        'U_BACK'                        => $this->u_action,
868
 
 
869
 
                        'L_EDIT'                        => $user->lang['EDIT_TEMPLATE'],
870
 
                        'L_EDIT_EXPLAIN'        => $user->lang['EDIT_TEMPLATE_EXPLAIN'],
871
 
                        'L_EDITOR'                      => $user->lang['TEMPLATE_EDITOR'],
872
 
                        'L_EDITOR_HEIGHT'       => $user->lang['TEMPLATE_EDITOR_HEIGHT'],
873
 
                        'L_FILE'                        => $user->lang['TEMPLATE_FILE'],
874
 
                        'L_SELECT'                      => $user->lang['SELECT_TEMPLATE'],
875
 
                        'L_SELECTED'            => $user->lang['SELECTED_TEMPLATE'],
876
 
                        'L_SELECTED_FILE'       => $user->lang['SELECTED_TEMPLATE_FILE'],
877
 
 
878
 
                        'SELECTED_TEMPLATE'     => $template_info['template_name'],
879
 
                        'TEMPLATE_FILE'         => $template_file,
880
 
                        'TEMPLATE_DATA'         => utf8_htmlspecialchars($template_data),
881
 
                        'TEXT_ROWS'                     => $text_rows)
882
 
                );
883
 
        }
884
 
 
885
 
        /**
886
 
        * Allows the admin to view cached versions of template files and clear single template cache files
887
 
        *
888
 
        * @param int $template_id specifies which template's cache is shown
889
 
        */
890
 
        function template_cache($template_id)
891
 
        {
892
 
                global $phpbb_root_path, $phpEx, $config, $db, $cache, $user, $template;
893
 
 
894
 
                $source         = str_replace('/', '.', request_var('source', ''));
895
 
                $file_ary       = array_diff(request_var('delete', array('')), array(''));
896
 
                $submit         = isset($_POST['submit']) ? true : false;
897
 
 
898
 
                $sql = 'SELECT *
899
 
                        FROM ' . STYLES_TEMPLATE_TABLE . "
900
 
                        WHERE template_id = $template_id";
901
 
                $result = $db->sql_query($sql);
902
 
                $template_row = $db->sql_fetchrow($result);
903
 
                $db->sql_freeresult($result);
904
 
 
905
 
                if (!$template_row)
906
 
                {
907
 
                        trigger_error($user->lang['NO_TEMPLATE'] . adm_back_link($this->u_action), E_USER_WARNING);
908
 
                }
909
 
 
910
 
                // User wants to delete one or more files ...
911
 
                if ($submit && $file_ary)
912
 
                {
913
 
                        $this->clear_template_cache($template_row, $file_ary);
914
 
                        trigger_error($user->lang['TEMPLATE_CACHE_CLEARED'] . adm_back_link($this->u_action . "&amp;action=cache&amp;id=$template_id"));
915
 
                }
916
 
 
917
 
                $cache_prefix = 'tpl_' . $template_row['template_path'];
918
 
 
919
 
                // Someone wants to see the cached source ... so we'll highlight it,
920
 
                // add line numbers and indent it appropriately. This could be nasty
921
 
                // on larger source files ...
922
 
                if ($source && file_exists("{$phpbb_root_path}cache/{$cache_prefix}_$source.html.$phpEx"))
923
 
                {
924
 
                        adm_page_header($user->lang['TEMPLATE_CACHE']);
925
 
 
926
 
                        $template->set_filenames(array(
927
 
                                'body'  => 'viewsource.html')
928
 
                        );
929
 
 
930
 
                        $template->assign_vars(array(
931
 
                                'FILENAME'      => str_replace('.', '/', $source) . '.html')
932
 
                        );
933
 
 
934
 
                        $code = str_replace(array("\r\n", "\r"), array("\n", "\n"), file_get_contents("{$phpbb_root_path}cache/{$cache_prefix}_$source.html.$phpEx"));
935
 
 
936
 
                        $conf = array('highlight.bg', 'highlight.comment', 'highlight.default', 'highlight.html', 'highlight.keyword', 'highlight.string');
937
 
                        foreach ($conf as $ini_var)
938
 
                        {
939
 
                                @ini_set($ini_var, str_replace('highlight.', 'syntax', $ini_var));
940
 
                        }
941
 
 
942
 
                        $marker = 'MARKER' . time();
943
 
                        $code = highlight_string(str_replace("\n", $marker, $code), true);
944
 
                        $code = str_replace($marker, "\n", $code);
945
 
                        $str_from = array('<span style="color: ', '<font color="syntax', '</font>', '<code>', '</code>','[', ']', '.', ':');
946
 
                        $str_to = array('<span class="', '<span class="syntax', '</span>', '', '', '&#91;', '&#93;', '&#46;', '&#58;');
947
 
 
948
 
                        $code = str_replace($str_from, $str_to, $code);
949
 
                        $code = preg_replace('#^(<span class="[a-z_]+">)\n?(.*?)\n?(</span>)$#ism', '$1$2$3', $code);
950
 
                        $code = substr($code, strlen('<span class="syntaxhtml">'));
951
 
                        $code = substr($code, 0, -1 * strlen('</ span>'));
952
 
                        $code = explode("\n", $code);
953
 
 
954
 
                        foreach ($code as $key => $line)
955
 
                        {
956
 
                                $template->assign_block_vars('source', array(
957
 
                                        'LINENUM'       => $key + 1,
958
 
                                        'LINE'          => preg_replace('#([^ ;])&nbsp;([^ &])#', '$1 $2', $line))
959
 
                                );
960
 
                                unset($code[$key]);
961
 
                        }
962
 
 
963
 
                        adm_page_footer();
964
 
                }
965
 
 
966
 
                $filemtime = array();
967
 
                if ($template_row['template_storedb'])
968
 
                {
969
 
                        $sql = 'SELECT template_filename, template_mtime
970
 
                                FROM ' . STYLES_TEMPLATE_DATA_TABLE . "
971
 
                                WHERE template_id = $template_id";
972
 
                        $result = $db->sql_query($sql);
973
 
 
974
 
                        $filemtime = array();
975
 
                        while ($row = $db->sql_fetchrow($result))
976
 
                        {
977
 
                                $filemtime[$row['template_filename']] = $row['template_mtime'];
978
 
                        }
979
 
                        $db->sql_freeresult($result);
980
 
                }
981
 
 
982
 
                // Get a list of cached template files and then retrieve additional information about them
983
 
                $file_ary = $this->template_cache_filelist($template_row['template_path']);
984
 
 
985
 
                foreach ($file_ary as $file)
986
 
                {
987
 
                        $file           = str_replace('/', '.', $file);
988
 
                        
989
 
                        // perform some dirty guessing to get the path right.
990
 
                        // We assume that three dots in a row were '../'
991
 
                        $tpl_file       = str_replace('.', '/', $file);
992
 
                        $tpl_file       = str_replace('///', '../', $tpl_file);
993
 
                        
994
 
                        $filename = "{$cache_prefix}_$file.html.$phpEx";
995
 
 
996
 
                        if (!file_exists("{$phpbb_root_path}cache/$filename"))
997
 
                        {
998
 
                                continue;
999
 
                        }
1000
 
 
1001
 
                        $template->assign_block_vars('file', array(
1002
 
                                'U_VIEWSOURCE'  => $this->u_action . "&amp;action=cache&amp;id=$template_id&amp;source=$file",
1003
 
 
1004
 
                                'CACHED'                => $user->format_date(filemtime("{$phpbb_root_path}cache/$filename")),
1005
 
                                'FILENAME'              => $file,
1006
 
                                'FILESIZE'              => sprintf('%.1f KB', filesize("{$phpbb_root_path}cache/$filename") / 1024),
1007
 
                                'MODIFIED'              => $user->format_date((!$template_row['template_storedb']) ? filemtime("{$phpbb_root_path}styles/{$template_row['template_path']}/template/$tpl_file.html") : $filemtime[$file . '.html']))
1008
 
                        );
1009
 
                }
1010
 
                unset($filemtime);
1011
 
 
1012
 
                $template->assign_vars(array(
1013
 
                        'S_CACHE'                       => true,
1014
 
                        'S_TEMPLATE'            => true,
1015
 
 
1016
 
                        'U_ACTION'                      => $this->u_action . "&amp;action=cache&amp;id=$template_id",
1017
 
                        'U_BACK'                        => $this->u_action)
1018
 
                );
1019
 
        }
1020
 
 
1021
 
        /**
1022
 
        * Provides a css editor and a basic easier to use stylesheet editing tool for less experienced (or lazy) users
1023
 
        *
1024
 
        * @param int $theme_id specifies which theme is being edited
1025
 
        */
1026
 
        function edit_theme($theme_id)
1027
 
        {
1028
 
                global $phpbb_root_path, $phpEx, $config, $db, $cache, $user, $template, $safe_mode;
1029
 
 
1030
 
                $this->page_title = 'EDIT_THEME';
1031
 
 
1032
 
                $filelist = $filelist_cats = array();
1033
 
 
1034
 
                $theme_data             = utf8_normalize_nfc(request_var('template_data', '', true));
1035
 
                $theme_data             = htmlspecialchars_decode($theme_data);
1036
 
                $theme_file             = utf8_normalize_nfc(request_var('template_file', '', true));
1037
 
                $text_rows              = max(5, min(999, request_var('text_rows', 20)));
1038
 
                $save_changes   = (isset($_POST['save'])) ? true : false;
1039
 
 
1040
 
                // make sure theme_file path doesn't go upwards
1041
 
                $theme_file = str_replace('..', '.', $theme_file);
1042
 
                
1043
 
                // Retrieve some information about the theme
1044
 
                $sql = 'SELECT theme_storedb, theme_path, theme_name, theme_data
1045
 
                        FROM ' . STYLES_THEME_TABLE . "
1046
 
                        WHERE theme_id = $theme_id";
1047
 
                $result = $db->sql_query($sql);
1048
 
 
1049
 
                if (!($theme_info = $db->sql_fetchrow($result)))
1050
 
                {
1051
 
                        trigger_error($user->lang['NO_THEME'] . adm_back_link($this->u_action), E_USER_WARNING);
1052
 
                }
1053
 
                $db->sql_freeresult($result);
1054
 
 
1055
 
                // save changes to the theme if the user submitted any
1056
 
                if ($save_changes)
1057
 
                {
1058
 
                        // Get the filesystem location of the current file
1059
 
                        $file = "{$phpbb_root_path}styles/{$theme_info['theme_path']}/theme/$theme_file";
1060
 
                        $additional = '';
1061
 
                        $message = $user->lang['THEME_UPDATED'];
1062
 
 
1063
 
                        // If the theme is stored on the filesystem try to write the file else store it in the database
1064
 
                        if (!$safe_mode && !$theme_info['theme_storedb'] && file_exists($file) && @is_writable($file))
1065
 
                        {
1066
 
                                if (!($fp = @fopen($file, 'wb')))
1067
 
                                {
1068
 
                                        trigger_error($user->lang['NO_THEME'] . adm_back_link($this->u_action), E_USER_WARNING);
1069
 
                                }
1070
 
                                fwrite($fp, $theme_data);
1071
 
                                fclose($fp);
1072
 
                        }
1073
 
                        else
1074
 
                        {
1075
 
                                // Write stylesheet to db
1076
 
                                $sql_ary = array(
1077
 
                                        'theme_mtime'           => time(),
1078
 
                                        'theme_storedb'         => 1,
1079
 
                                        'theme_data'            => $this->db_theme_data($theme_info, $theme_data),
1080
 
                                );
1081
 
                                $sql = 'UPDATE ' . STYLES_THEME_TABLE . '
1082
 
                                        SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
1083
 
                                        WHERE theme_id = ' . $theme_id;
1084
 
                                $db->sql_query($sql);
1085
 
 
1086
 
                                $cache->destroy('sql', STYLES_THEME_TABLE);
1087
 
 
1088
 
                                // notify the user if the theme was not stored in the db before his modification
1089
 
                                if (!$theme_info['theme_storedb'])
1090
 
                                {
1091
 
                                        add_log('admin', 'LOG_THEME_EDIT_DETAILS', $theme_info['theme_name']);
1092
 
                                        $message .= '<br />' . $user->lang['EDIT_THEME_STORED_DB'];
1093
 
                                }
1094
 
                        }
1095
 
                        $cache->destroy('sql', STYLES_THEME_TABLE);
1096
 
                        add_log('admin', (!$theme_info['theme_storedb']) ? 'LOG_THEME_EDIT_FILE' : 'LOG_THEME_EDIT', $theme_info['theme_name'], (!$theme_info['theme_storedb']) ? $theme_file : '');
1097
 
 
1098
 
                        trigger_error($message . adm_back_link($this->u_action . "&amp;action=edit&amp;id=$theme_id&amp;template_file=$theme_file&amp;text_rows=$text_rows"));
1099
 
                }
1100
 
 
1101
 
                // Generate a category array containing theme filenames
1102
 
                if (!$theme_info['theme_storedb'])
1103
 
                {
1104
 
                        $theme_path = "{$phpbb_root_path}styles/{$theme_info['theme_path']}/theme";
1105
 
 
1106
 
                        $filelist = filelist($theme_path, '', 'css');
1107
 
 
1108
 
                        if ($theme_file)
1109
 
                        {
1110
 
                                if (!file_exists($theme_path . "/$theme_file") || !($theme_data = file_get_contents($theme_path . "/$theme_file")))
1111
 
                                {
1112
 
                                        trigger_error($user->lang['NO_THEME'] . adm_back_link($this->u_action), E_USER_WARNING);
1113
 
                                }
1114
 
                        }
1115
 
                }
1116
 
                else
1117
 
                {
1118
 
                        $theme_data = &$theme_info['theme_data'];
1119
 
                }
1120
 
 
1121
 
                // Now create the categories
1122
 
                $filelist_cats[''] = array();
1123
 
                foreach ($filelist as $pathfile => $file_ary)
1124
 
                {
1125
 
                        // Use the directory name as category name
1126
 
                        if (!empty($pathfile))
1127
 
                        {
1128
 
                                $filelist_cats[$pathfile] = array();
1129
 
                                foreach ($file_ary as $file)
1130
 
                                {
1131
 
                                        $filelist_cats[$pathfile][$pathfile . $file] = $file;
1132
 
                                }
1133
 
                        }
1134
 
                        // or if it's in the main category use the word before the first underscore to group files
1135
 
                        else
1136
 
                        {
1137
 
                                $cats = array();
1138
 
                                foreach ($file_ary as $file)
1139
 
                                {
1140
 
                                        $cats[] = substr($file, 0, strpos($file, '_'));
1141
 
                                        $filelist_cats[substr($file, 0, strpos($file, '_'))][$file] = $file;
1142
 
                                }
1143
 
 
1144
 
                                $cats = array_values(array_unique($cats));
1145
 
 
1146
 
                                // we don't need any single element categories so put them into the misc '' category
1147
 
                                for ($i = 0, $n = sizeof($cats); $i < $n; $i++)
1148
 
                                {
1149
 
                                        if (sizeof($filelist_cats[$cats[$i]]) == 1 && $cats[$i] !== '')
1150
 
                                        {
1151
 
                                                $filelist_cats[''][key($filelist_cats[$cats[$i]])] = current($filelist_cats[$cats[$i]]);
1152
 
                                                unset($filelist_cats[$cats[$i]]);
1153
 
                                        }
1154
 
                                }
1155
 
                                unset($cats);
1156
 
                        }
1157
 
                }
1158
 
                unset($filelist);
1159
 
 
1160
 
                // Generate list of categorised theme files
1161
 
                $tpl_options = '';
1162
 
                ksort($filelist_cats);
1163
 
                foreach ($filelist_cats as $category => $tpl_ary)
1164
 
                {
1165
 
                        ksort($tpl_ary);
1166
 
 
1167
 
                        if (!empty($category))
1168
 
                        {
1169
 
                                $tpl_options .= '<option class="sep" value="">' . $category . '</option>';
1170
 
                        }
1171
 
 
1172
 
                        foreach ($tpl_ary as $filename => $file)
1173
 
                        {
1174
 
                                $selected = ($theme_file == $filename) ? ' selected="selected"' : '';
1175
 
                                $tpl_options .= '<option value="' . $filename . '"' . $selected . '>' . $file . '</option>';
1176
 
                        }
1177
 
                }
1178
 
 
1179
 
                $template->assign_vars(array(
1180
 
                        'S_EDIT_THEME'          => true,
1181
 
                        'S_HIDDEN_FIELDS'       => build_hidden_fields(array('template_file' => $theme_file)),
1182
 
                        'S_THEME_IN_DB'         => $theme_info['theme_storedb'],
1183
 
                        'S_TEMPLATES'           => $tpl_options,
1184
 
 
1185
 
                        'U_ACTION'                      => $this->u_action . "&amp;action=edit&amp;id=$theme_id&amp;text_rows=$text_rows",
1186
 
                        'U_BACK'                        => $this->u_action,
1187
 
 
1188
 
                        'L_EDIT'                        => $user->lang['EDIT_THEME'],
1189
 
                        'L_EDIT_EXPLAIN'        => $user->lang['EDIT_THEME_EXPLAIN'],
1190
 
                        'L_EDITOR'                      => $user->lang['THEME_EDITOR'],
1191
 
                        'L_EDITOR_HEIGHT'       => $user->lang['THEME_EDITOR_HEIGHT'],
1192
 
                        'L_FILE'                        => $user->lang['THEME_FILE'],
1193
 
                        'L_SELECT'                      => $user->lang['SELECT_THEME'],
1194
 
                        'L_SELECTED'            => $user->lang['SELECTED_THEME'],
1195
 
                        'L_SELECTED_FILE'       => $user->lang['SELECTED_THEME_FILE'],
1196
 
 
1197
 
                        'SELECTED_TEMPLATE'     => $theme_info['theme_name'],
1198
 
                        'TEMPLATE_FILE'         => $theme_file,
1199
 
                        'TEMPLATE_DATA'         => utf8_htmlspecialchars($theme_data),
1200
 
                        'TEXT_ROWS'                     => $text_rows)
1201
 
                );
1202
 
        }
1203
 
 
1204
 
 
1205
 
        /**
1206
 
        * Edit imagesets
1207
 
        *
1208
 
        * @param int $imageset_id specifies which imageset is being edited
1209
 
        */
1210
 
        function edit_imageset($imageset_id)
1211
 
        {
1212
 
                global $db, $user, $phpbb_root_path, $cache, $template;
1213
 
 
1214
 
                $this->page_title = 'EDIT_IMAGESET';
1215
 
 
1216
 
                $update         = (isset($_POST['update'])) ? true : false;
1217
 
 
1218
 
                $imgname        = request_var('imgname', '');
1219
 
                $imgpath        = request_var('imgpath', '');
1220
 
                $imgsize        = request_var('imgsize', false);
1221
 
                $imgwidth       = request_var('imgwidth', 0);
1222
 
                $imgheight      = request_var('imgheight', 0);
1223
 
                
1224
 
                $imgname        = preg_replace('#[^a-z0-9\-+_]#i', '', $imgname);
1225
 
                $imgpath        = str_replace('..', '.', $imgpath);
1226
 
 
1227
 
                if ($imageset_id)
1228
 
                {
1229
 
                        $sql = 'SELECT imageset_path, imageset_name
1230
 
                                FROM ' . STYLES_IMAGESET_TABLE . "
1231
 
                                WHERE imageset_id = $imageset_id";
1232
 
                        $result = $db->sql_query($sql);
1233
 
                        $imageset_row = $db->sql_fetchrow($result);
1234
 
                        $db->sql_freeresult($result);
1235
 
 
1236
 
                        $imageset_path          = $imageset_row['imageset_path'];
1237
 
                        $imageset_name          = $imageset_row['imageset_name'];
1238
 
 
1239
 
                        $sql_extra = '';
1240
 
                        if (strpos($imgname, '-') !== false)
1241
 
                        {
1242
 
                                list($imgname, $imgnamelang) = explode('-', $imgname);
1243
 
                                $sql_extra = " AND image_lang IN ('" . $db->sql_escape($imgnamelang) . "', '')";
1244
 
                        }
1245
 
 
1246
 
                        $sql = 'SELECT image_filename, image_width, image_height, image_lang, image_id
1247
 
                                FROM ' . STYLES_IMAGESET_DATA_TABLE . "
1248
 
                                WHERE imageset_id = $imageset_id
1249
 
                                        AND image_name = '" . $db->sql_escape($imgname) . "'$sql_extra";
1250
 
                        $result = $db->sql_query($sql);
1251
 
                        $imageset_data_row = $db->sql_fetchrow($result);
1252
 
                        $db->sql_freeresult($result);
1253
 
 
1254
 
                        $image_filename = $imageset_data_row['image_filename'];
1255
 
                        $image_width    = $imageset_data_row['image_width'];
1256
 
                        $image_height   = $imageset_data_row['image_height'];
1257
 
                        $image_lang             = $imageset_data_row['image_lang'];
1258
 
                        $image_id               = $imageset_data_row['image_id'];
1259
 
 
1260
 
                        if (!$imageset_row)
1261
 
                        {
1262
 
                                trigger_error($user->lang['NO_IMAGESET'] . adm_back_link($this->u_action), E_USER_WARNING);
1263
 
                        }
1264
 
 
1265
 
                        // Check to see whether the selected image exists in the table
1266
 
                        $valid_name = ($update) ? false : true;
1267
 
 
1268
 
                        foreach ($this->imageset_keys as $category => $img_ary)
1269
 
                        {
1270
 
                                if (in_array($imgname, $img_ary))
1271
 
                                {
1272
 
                                        $valid_name = true;
1273
 
                                        break;
1274
 
                                }
1275
 
                        }
1276
 
 
1277
 
                        if ($update && isset($_POST['imgpath']))
1278
 
                        {
1279
 
                                if ($valid_name)
1280
 
                                {
1281
 
                                        // If imgwidth and imgheight are non-zero grab the actual size
1282
 
                                        // from the image itself ... we ignore width settings for the poll center image
1283
 
                                        $imgwidth       = request_var('imgwidth', 0);
1284
 
                                        $imgheight      = request_var('imgheight', 0);
1285
 
                                        $imglang = '';
1286
 
 
1287
 
                                        if ($imgpath && !file_exists("{$phpbb_root_path}styles/$imageset_path/imageset/$imgpath"))
1288
 
                                        {
1289
 
                                                trigger_error($user->lang['NO_IMAGE_ERROR'] . adm_back_link($this->u_action), E_USER_WARNING);
1290
 
                                        }
1291
 
 
1292
 
                                        if ($imgsize && $imgpath)
1293
 
                                        {
1294
 
                                                if (!$imgwidth || !$imgheight)
1295
 
                                                {
1296
 
                                                        list($imgwidth_file, $imgheight_file) = getimagesize("{$phpbb_root_path}styles/$imageset_path/imageset/$imgpath");
1297
 
                                                        $imgwidth = ($imgwidth) ? $imgwidth : $imgwidth_file;
1298
 
                                                        $imgheight = ($imgheight) ? $imgheight : $imgheight_file;
1299
 
                                                }
1300
 
                                                $imgwidth       = ($imgname != 'poll_center') ? (int) $imgwidth : 0;
1301
 
                                                $imgheight      = (int) $imgheight;
1302
 
                                        }
1303
 
 
1304
 
 
1305
 
                                        if (strpos($imgpath, '/') !== false)
1306
 
                                        {
1307
 
                                                list($imglang, $imgfilename) = explode('/', $imgpath);
1308
 
                                        }
1309
 
                                        else
1310
 
                                        {
1311
 
                                                $imgfilename = $imgpath;
1312
 
                                        }
1313
 
 
1314
 
                                        $sql_ary = array(
1315
 
                                                'image_filename'        => (string) $imgfilename,
1316
 
                                                'image_width'           => (int) $imgwidth,
1317
 
                                                'image_height'          => (int) $imgheight,
1318
 
                                                'image_lang'            => (string) $imglang,
1319
 
                                        );
1320
 
 
1321
 
                                        // already exists
1322
 
                                        if ($imageset_data_row)
1323
 
                                        {
1324
 
                                                $sql = 'UPDATE ' . STYLES_IMAGESET_DATA_TABLE . '
1325
 
                                                        SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
1326
 
                                                        WHERE image_id = $image_id";
1327
 
                                                $db->sql_query($sql);
1328
 
                                        }
1329
 
                                        // does not exist
1330
 
                                        else if (!$imageset_data_row)
1331
 
                                        {
1332
 
                                                $sql_ary['image_name']  = $imgname;
1333
 
                                                $sql_ary['imageset_id'] = (int) $imageset_id;
1334
 
                                                $db->sql_query('INSERT INTO ' . STYLES_IMAGESET_DATA_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
1335
 
                                        }
1336
 
 
1337
 
                                        $cache->destroy('sql', STYLES_IMAGESET_DATA_TABLE);
1338
 
 
1339
 
                                        add_log('admin', 'LOG_IMAGESET_EDIT', $imageset_name);
1340
 
 
1341
 
                                        $template->assign_var('SUCCESS', true);
1342
 
 
1343
 
                                        $image_filename = $imgfilename;
1344
 
                                        $image_width    = $imgwidth;
1345
 
                                        $image_height   = $imgheight;
1346
 
                                        $image_lang             = $imglang;
1347
 
                                }
1348
 
                        }
1349
 
                }
1350
 
 
1351
 
                $imglang = '';
1352
 
                $imagesetlist = array('nolang' => array(), 'lang' => array());
1353
 
                $langs = array();
1354
 
 
1355
 
                $dir = "{$phpbb_root_path}styles/$imageset_path/imageset";
1356
 
                $dp = @opendir($dir);
1357
 
 
1358
 
                if ($dp)
1359
 
                {
1360
 
                        while (($file = readdir($dp)) !== false)
1361
 
                        {
1362
 
                                if ($file[0] != '.' && strtoupper($file) != 'CVS' && !is_file($dir . '/' . $file) && !is_link($dir . '/' . $file))
1363
 
                                {
1364
 
                                        $langs[] = $file;
1365
 
                                }
1366
 
                                else if (preg_match('#\.(?:gif|jpg|png)$#', $file))
1367
 
                                {
1368
 
                                        $imagesetlist['nolang'][] = $file;
1369
 
                                }
1370
 
                        }
1371
 
 
1372
 
                        if ($sql_extra)
1373
 
                        {
1374
 
                                $dp2 = @opendir("$dir/$imgnamelang");
1375
 
 
1376
 
                                if ($dp2)
1377
 
                                {
1378
 
                                        while (($file2 = readdir($dp2)) !== false)
1379
 
                                        {
1380
 
                                                if (preg_match('#\.(?:gif|jpg|png)$#', $file2))
1381
 
                                                {
1382
 
                                                        $imagesetlist['lang'][] = "$imgnamelang/$file2";
1383
 
                                                }
1384
 
                                        }
1385
 
                                        closedir($dp2);
1386
 
                                }
1387
 
                        }
1388
 
                        closedir($dp);
1389
 
                }
1390
 
 
1391
 
                // Generate list of image options
1392
 
                $img_options = '';
1393
 
                foreach ($this->imageset_keys as $category => $img_ary)
1394
 
                {
1395
 
                        $template->assign_block_vars('category', array(
1396
 
                                'NAME'                  => $user->lang['IMG_CAT_' . strtoupper($category)]
1397
 
                        ));
1398
 
 
1399
 
                        foreach ($img_ary as $img)
1400
 
                        {
1401
 
                                if ($category == 'buttons')
1402
 
                                {
1403
 
                                        foreach ($langs as $language)
1404
 
                                        {
1405
 
                                                $template->assign_block_vars('category.images', array(
1406
 
                                                        'SELECTED'                      => ($img == $imgname && $language == $imgnamelang),
1407
 
                                                        'VALUE'                         => $img . '-' . $language,
1408
 
                                                        'TEXT'                          => $user->lang['IMG_' . strtoupper($img)] . ' [ ' . $language . ' ]'
1409
 
                                                ));
1410
 
                                        }
1411
 
                                }
1412
 
                                else
1413
 
                                {
1414
 
                                        $template->assign_block_vars('category.images', array(
1415
 
                                                'SELECTED'                      => ($img == $imgname),
1416
 
                                                'VALUE'                         => $img,
1417
 
                                                'TEXT'                          => (($category == 'custom') ? $img : $user->lang['IMG_' . strtoupper($img)])
1418
 
                                        ));
1419
 
                                }
1420
 
                        }
1421
 
                }
1422
 
 
1423
 
                // Make sure the list of possible images is sorted alphabetically
1424
 
                sort($imagesetlist['lang']);
1425
 
                sort($imagesetlist['nolang']);
1426
 
 
1427
 
                $image_found = false;
1428
 
                $img_val = '';
1429
 
                foreach ($imagesetlist as $type => $img_ary)
1430
 
                {
1431
 
                        if ($type !== 'lang' || $sql_extra)
1432
 
                        {
1433
 
                                $template->assign_block_vars('imagesetlist', array(
1434
 
                                        'TYPE'  => ($type == 'lang')
1435
 
                                ));
1436
 
                        }
1437
 
 
1438
 
                        foreach ($img_ary as $img)
1439
 
                        {
1440
 
                                $imgtext = preg_replace('/^([^\/]+\/)/', '', $img);
1441
 
                                $selected = (!empty($imgname) && strpos($image_filename, $imgtext) !== false);
1442
 
                                if ($selected)
1443
 
                                {
1444
 
                                        $image_found = true;
1445
 
                                        $img_val = htmlspecialchars($img);
1446
 
                                }
1447
 
                                $template->assign_block_vars('imagesetlist.images', array(
1448
 
                                        'SELECTED'                      => $selected,
1449
 
                                        'TEXT'                          => $imgtext,
1450
 
                                        'VALUE'                         => htmlspecialchars($img)
1451
 
                                ));
1452
 
                        }
1453
 
                }
1454
 
 
1455
 
                $imgsize_bool = (!empty($imgname) && $image_width && $image_height) ? true : false;
1456
 
                $image_request = '../styles/' . $imageset_path . '/imageset/' . ($image_lang ? $imgnamelang . '/' : '') . $image_filename;
1457
 
 
1458
 
                $template->assign_vars(array(
1459
 
                        'S_EDIT_IMAGESET'       => true,
1460
 
                        'L_TITLE'                       => $user->lang[$this->page_title],
1461
 
                        'L_EXPLAIN'                     => $user->lang[$this->page_title . '_EXPLAIN'],
1462
 
                        'IMAGE_OPTIONS'         => $img_options,
1463
 
                        'IMAGE_SIZE'            => $image_width,
1464
 
                        'IMAGE_HEIGHT'          => $image_height,
1465
 
                        'IMAGE_REQUEST'         => (empty($image_filename)) ? 'images/no_image.png' : $image_request,
1466
 
                        'U_ACTION'                      => $this->u_action . "&amp;action=edit&amp;id=$imageset_id",
1467
 
                        'U_BACK'                        => $this->u_action,
1468
 
                        'NAME'                          => $imageset_name,
1469
 
                        'A_NAME'                        => addslashes($imageset_name),
1470
 
                        'ERROR'                         => !$valid_name,
1471
 
                        'IMG_SRC'                       => ($image_found) ? '../styles/' . $imageset_path . '/imageset/' . $img_val : 'images/no_image.png',
1472
 
                        'IMAGE_SELECT'          => $image_found
1473
 
                ));
1474
 
        }
1475
 
 
1476
 
        /**
1477
 
        * Remove style/template/theme/imageset
1478
 
        */
1479
 
        function remove($mode, $style_id)
1480
 
        {
1481
 
                global $db, $template, $user, $phpbb_root_path, $cache, $config;
1482
 
 
1483
 
                $new_id = request_var('new_id', 0);
1484
 
                $update = (isset($_POST['update'])) ? true : false;
1485
 
                $sql_where = '';
1486
 
 
1487
 
                switch ($mode)
1488
 
                {
1489
 
                        case 'style':
1490
 
                                $sql_from = STYLES_TABLE;
1491
 
                                $sql_select = 'style_name';
1492
 
                                $sql_where = 'AND style_active = 1';
1493
 
                        break;
1494
 
 
1495
 
                        case 'template':
1496
 
                                $sql_from = STYLES_TEMPLATE_TABLE;
1497
 
                                $sql_select = 'template_name, template_path, template_storedb';
1498
 
                        break;
1499
 
 
1500
 
                        case 'theme':
1501
 
                                $sql_from = STYLES_THEME_TABLE;
1502
 
                                $sql_select = 'theme_name, theme_path, theme_storedb';
1503
 
                        break;
1504
 
 
1505
 
                        case 'imageset':
1506
 
                                $sql_from = STYLES_IMAGESET_TABLE;
1507
 
                                $sql_select = 'imageset_name, imageset_path';
1508
 
                        break;
1509
 
                }
1510
 
 
1511
 
                $l_prefix = strtoupper($mode);
1512
 
 
1513
 
                $sql = "SELECT $sql_select
1514
 
                        FROM $sql_from
1515
 
                        WHERE {$mode}_id = $style_id";
1516
 
                $result = $db->sql_query($sql);
1517
 
                $style_row = $db->sql_fetchrow($result);
1518
 
                $db->sql_freeresult($result);
1519
 
 
1520
 
                if (!$style_row)
1521
 
                {
1522
 
                        trigger_error($user->lang['NO_' . $l_prefix] . adm_back_link($this->u_action), E_USER_WARNING);
1523
 
                }
1524
 
 
1525
 
                $sql = "SELECT {$mode}_id, {$mode}_name
1526
 
                        FROM $sql_from
1527
 
                        WHERE {$mode}_id <> $style_id
1528
 
                        $sql_where
1529
 
                        ORDER BY {$mode}_name ASC";
1530
 
                $result = $db->sql_query($sql);
1531
 
 
1532
 
                $s_options = '';
1533
 
 
1534
 
                if ($row = $db->sql_fetchrow($result))
1535
 
                {
1536
 
                        do
1537
 
                        {
1538
 
                                $s_options .= '<option value="' . $row[$mode . '_id'] . '">' . $row[$mode . '_name'] . '</option>';
1539
 
                        }
1540
 
                        while ($row = $db->sql_fetchrow($result));
1541
 
                }
1542
 
                else
1543
 
                {
1544
 
                        trigger_error($user->lang['ONLY_' . $l_prefix] . adm_back_link($this->u_action), E_USER_WARNING);
1545
 
                }
1546
 
                $db->sql_freeresult($result);
1547
 
 
1548
 
                if ($update)
1549
 
                {
1550
 
                        $sql = "DELETE FROM $sql_from
1551
 
                                WHERE {$mode}_id = $style_id";
1552
 
                        $db->sql_query($sql);
1553
 
 
1554
 
                        if ($mode == 'style')
1555
 
                        {
1556
 
                                $sql = 'UPDATE ' . USERS_TABLE . "
1557
 
                                        SET user_style = $new_id
1558
 
                                        WHERE user_style = $style_id";
1559
 
                                $db->sql_query($sql);
1560
 
 
1561
 
                                $sql = 'UPDATE ' . FORUMS_TABLE . "
1562
 
                                        SET forum_style = $new_id
1563
 
                                        WHERE forum_style = $style_id";
1564
 
                                $db->sql_query($sql);
1565
 
 
1566
 
                                if ($style_id == $config['default_style'])
1567
 
                                {
1568
 
                                        set_config('default_style', $new_id);
1569
 
                                }
1570
 
                        }
1571
 
                        else
1572
 
                        {
1573
 
                                if ($mode == 'imageset')
1574
 
                                {
1575
 
                                        $sql = 'DELETE FROM ' . STYLES_IMAGESET_DATA_TABLE . "
1576
 
                                                WHERE imageset_id = $style_id";
1577
 
                                        $db->sql_query($sql);
1578
 
                                }
1579
 
                                $sql = 'UPDATE ' . STYLES_TABLE . "
1580
 
                                        SET {$mode}_id = $new_id
1581
 
                                        WHERE {$mode}_id = $style_id";
1582
 
                                $db->sql_query($sql);
1583
 
                        }
1584
 
 
1585
 
                        $cache->destroy('sql', STYLES_TABLE);
1586
 
 
1587
 
                        add_log('admin', 'LOG_' . $l_prefix . '_DELETE', $style_row[$mode . '_name']);
1588
 
                        $message = ($mode != 'style') ? $l_prefix . '_DELETED_FS' : $l_prefix . '_DELETED';
1589
 
                        trigger_error($user->lang[$message] . adm_back_link($this->u_action));
1590
 
                }
1591
 
 
1592
 
                $this->page_title = 'DELETE_' . $l_prefix;
1593
 
 
1594
 
                $template->assign_vars(array(
1595
 
                        'S_DELETE'                      => true,
1596
 
                        'S_REPLACE_OPTIONS'     => $s_options,
1597
 
 
1598
 
                        'L_TITLE'                       => $user->lang[$this->page_title],
1599
 
                        'L_EXPLAIN'                     => $user->lang[$this->page_title . '_EXPLAIN'],
1600
 
                        'L_NAME'                        => $user->lang[$l_prefix . '_NAME'],
1601
 
                        'L_REPLACE'                     => $user->lang['REPLACE_' . $l_prefix],
1602
 
                        'L_REPLACE_EXPLAIN'     => $user->lang['REPLACE_' . $l_prefix . '_EXPLAIN'],
1603
 
 
1604
 
                        'U_ACTION'              => $this->u_action . "&amp;action=delete&amp;id=$style_id",
1605
 
                        'U_BACK'                => $this->u_action,
1606
 
 
1607
 
                        'NAME'                  => $style_row[$mode . '_name'],
1608
 
                        )
1609
 
                );
1610
 
        }
1611
 
 
1612
 
        /**
1613
 
        * Export style or style elements
1614
 
        */
1615
 
        function export($mode, $style_id)
1616
 
        {
1617
 
                global $db, $template, $user, $phpbb_root_path, $cache, $phpEx, $config;
1618
 
 
1619
 
                $update = (isset($_POST['update'])) ? true : false;
1620
 
 
1621
 
                $inc_template = request_var('inc_template', 0);
1622
 
                $inc_theme = request_var('inc_theme', 0);
1623
 
                $inc_imageset = request_var('inc_imageset', 0);
1624
 
                $store = request_var('store', 0);
1625
 
                $format = request_var('format', '');
1626
 
 
1627
 
                $error = array();
1628
 
                $methods = array('tar');
1629
 
 
1630
 
                $available_methods = array('tar.gz' => 'zlib', 'tar.bz2' => 'bz2', 'zip' => 'zlib');
1631
 
                foreach ($available_methods as $type => $module)
1632
 
                {
1633
 
                        if (!@extension_loaded($module))
1634
 
                        {
1635
 
                                continue;
1636
 
                        }
1637
 
 
1638
 
                        $methods[] = $type;
1639
 
                }
1640
 
 
1641
 
                if (!in_array($format, $methods))
1642
 
                {
1643
 
                        $format = 'tar';
1644
 
                }
1645
 
 
1646
 
                switch ($mode)
1647
 
                {
1648
 
                        case 'style':
1649
 
                                if ($update && ($inc_template + $inc_theme + $inc_imageset) < 1)
1650
 
                                {
1651
 
                                        $error[] = $user->lang['STYLE_ERR_MORE_ELEMENTS'];
1652
 
                                }
1653
 
 
1654
 
                                $name = 'style_name';
1655
 
 
1656
 
                                $sql_select = 's.style_id, s.style_name, s.style_copyright';
1657
 
                                $sql_select .= ($inc_template) ? ', t.*' : ', t.template_name';
1658
 
                                $sql_select .= ($inc_theme) ? ', c.*' : ', c.theme_name';
1659
 
                                $sql_select .= ($inc_imageset) ? ', i.*' : ', i.imageset_name';
1660
 
                                $sql_from = STYLES_TABLE . ' s, ' . STYLES_TEMPLATE_TABLE . ' t, ' . STYLES_THEME_TABLE . ' c, ' . STYLES_IMAGESET_TABLE . ' i';
1661
 
                                $sql_where = "s.style_id = $style_id AND t.template_id = s.template_id AND c.theme_id = s.theme_id AND i.imageset_id = s.imageset_id";
1662
 
 
1663
 
                                $l_prefix = 'STYLE';
1664
 
                        break;
1665
 
 
1666
 
                        case 'template':
1667
 
                                $name = 'template_name';
1668
 
 
1669
 
                                $sql_select = '*';
1670
 
                                $sql_from = STYLES_TEMPLATE_TABLE;
1671
 
                                $sql_where = "template_id = $style_id";
1672
 
 
1673
 
                                $l_prefix = 'TEMPLATE';
1674
 
                        break;
1675
 
 
1676
 
                        case 'theme':
1677
 
                                $name = 'theme_name';
1678
 
 
1679
 
                                $sql_select = '*';
1680
 
                                $sql_from = STYLES_THEME_TABLE;
1681
 
                                $sql_where = "theme_id = $style_id";
1682
 
 
1683
 
                                $l_prefix = 'THEME';
1684
 
                        break;
1685
 
 
1686
 
                        case 'imageset':
1687
 
                                $name = 'imageset_name';
1688
 
 
1689
 
                                $sql_select = '*';
1690
 
                                $sql_from = STYLES_IMAGESET_TABLE;
1691
 
                                $sql_where = "imageset_id = $style_id";
1692
 
 
1693
 
                                $l_prefix = 'IMAGESET';
1694
 
                        break;
1695
 
                }
1696
 
 
1697
 
                if ($update && !sizeof($error))
1698
 
                {
1699
 
                        $sql = "SELECT $sql_select
1700
 
                                FROM $sql_from
1701
 
                                WHERE $sql_where";
1702
 
                        $result = $db->sql_query($sql);
1703
 
                        $style_row = $db->sql_fetchrow($result);
1704
 
                        $db->sql_freeresult($result);
1705
 
 
1706
 
                        if (!$style_row)
1707
 
                        {
1708
 
                                trigger_error($user->lang['NO_' . $l_prefix] . adm_back_link($this->u_action), E_USER_WARNING);
1709
 
                        }
1710
 
 
1711
 
                        $var_ary = array('style_id', 'style_name', 'style_copyright', 'template_id', 'template_name', 'template_path', 'template_copyright', 'template_storedb', 'bbcode_bitfield', 'theme_id', 'theme_name', 'theme_path', 'theme_copyright', 'theme_storedb', 'theme_mtime', 'theme_data', 'imageset_id', 'imageset_name', 'imageset_path', 'imageset_copyright');
1712
 
 
1713
 
                        foreach ($var_ary as $var)
1714
 
                        {
1715
 
                                if (!isset($style_row[$var]))
1716
 
                                {
1717
 
                                        $style_row[$var] = '';
1718
 
                                }
1719
 
                        }
1720
 
 
1721
 
                        $files = $data = array();
1722
 
 
1723
 
                        if ($mode == 'style')
1724
 
                        {
1725
 
                                $style_cfg = str_replace(array('{MODE}', '{NAME}', '{COPYRIGHT}', '{VERSION}'), array($mode, $style_row['style_name'], $style_row['style_copyright'], $config['version']), $this->style_cfg);
1726
 
 
1727
 
                                $style_cfg .= (!$inc_template) ? "\nrequired_template = {$style_row['template_name']}" : '';
1728
 
                                $style_cfg .= (!$inc_theme) ? "\nrequired_theme = {$style_row['theme_name']}" : '';
1729
 
                                $style_cfg .= (!$inc_imageset) ? "\nrequired_imageset = {$style_row['imageset_name']}" : '';
1730
 
 
1731
 
                                $data[] = array(
1732
 
                                        'src'           => $style_cfg,
1733
 
                                        'prefix'        => 'style.cfg'
1734
 
                                );
1735
 
 
1736
 
                                unset($style_cfg);
1737
 
                        }
1738
 
 
1739
 
                        // Export template core code
1740
 
                        if ($mode == 'template' || $inc_template)
1741
 
                        {
1742
 
                                $template_cfg = str_replace(array('{MODE}', '{NAME}', '{COPYRIGHT}', '{VERSION}'), array($mode, $style_row['template_name'], $style_row['template_copyright'], $config['version']), $this->template_cfg);
1743
 
                                $template_cfg .= "\nbbcode_bitfield = {$style_row['bbcode_bitfield']}";
1744
 
 
1745
 
                                $data[] = array(
1746
 
                                        'src'           => $template_cfg,
1747
 
                                        'prefix'        => 'template/template.cfg'
1748
 
                                );
1749
 
 
1750
 
                                // This is potentially nasty memory-wise ...
1751
 
                                if (!$style_row['template_storedb'])
1752
 
                                {
1753
 
                                        $files[] = array(
1754
 
                                                'src'           => "styles/{$style_row['template_path']}/template/",
1755
 
                                                'prefix-'       => "styles/{$style_row['template_path']}/",
1756
 
                                                'prefix+'       => false,
1757
 
                                                'exclude'       => 'template.cfg'
1758
 
                                        );
1759
 
                                }
1760
 
                                else
1761
 
                                {
1762
 
                                        $sql = 'SELECT template_filename, template_data
1763
 
                                                FROM ' . STYLES_TEMPLATE_DATA_TABLE . "
1764
 
                                                WHERE template_id = {$style_row['template_id']}";
1765
 
                                        $result = $db->sql_query($sql);
1766
 
 
1767
 
                                        while ($row = $db->sql_fetchrow($result))
1768
 
                                        {
1769
 
                                                $data[] = array(
1770
 
                                                        'src' => $row['template_data'],
1771
 
                                                        'prefix' => 'template/' . $row['template_filename']
1772
 
                                                );
1773
 
                                        }
1774
 
                                        $db->sql_freeresult($result);
1775
 
                                }
1776
 
                                unset($template_cfg);
1777
 
                        }
1778
 
 
1779
 
                        // Export theme core code
1780
 
                        if ($mode == 'theme' || $inc_theme)
1781
 
                        {
1782
 
                                $theme_cfg = str_replace(array('{MODE}', '{NAME}', '{COPYRIGHT}', '{VERSION}'), array($mode, $style_row['theme_name'], $style_row['theme_copyright'], $config['version']), $this->theme_cfg);
1783
 
 
1784
 
                                // Read old cfg file
1785
 
                                $items = $cache->obtain_cfg_items($style_row);
1786
 
                                $items = $items['theme'];
1787
 
 
1788
 
                                if (!isset($items['parse_css_file']))
1789
 
                                {
1790
 
                                        $items['parse_css_file'] = 'off';
1791
 
                                }
1792
 
 
1793
 
                                $theme_cfg = str_replace(array('{PARSE_CSS_FILE}'), array($items['parse_css_file']), $theme_cfg);
1794
 
 
1795
 
                                $files[] = array(
1796
 
                                        'src'           => "styles/{$style_row['theme_path']}/theme/",
1797
 
                                        'prefix-'       => "styles/{$style_row['theme_path']}/",
1798
 
                                        'prefix+'       => false,
1799
 
                                        'exclude'       => ($style_row['theme_storedb']) ? 'stylesheet.css,theme.cfg' : 'theme.cfg'
1800
 
                                );
1801
 
 
1802
 
                                $data[] = array(
1803
 
                                        'src'           => $theme_cfg,
1804
 
                                        'prefix'        => 'theme/theme.cfg'
1805
 
                                );
1806
 
 
1807
 
                                if ($style_row['theme_storedb'])
1808
 
                                {
1809
 
                                        $data[] = array(
1810
 
                                                'src'           => $style_row['theme_data'],
1811
 
                                                'prefix'        => 'theme/stylesheet.css'
1812
 
                                        );
1813
 
                                }
1814
 
 
1815
 
                                unset($items, $theme_cfg);
1816
 
                        }
1817
 
 
1818
 
                        // Export imageset core code
1819
 
                        if ($mode == 'imageset' || $inc_imageset)
1820
 
                        {
1821
 
                                $imageset_cfg = str_replace(array('{MODE}', '{NAME}', '{COPYRIGHT}', '{VERSION}'), array($mode, $style_row['imageset_name'], $style_row['imageset_copyright'], $config['version']), $this->imageset_cfg);
1822
 
 
1823
 
                                $imageset_main = array();
1824
 
 
1825
 
                                $sql = 'SELECT image_filename, image_name, image_height, image_width
1826
 
                                        FROM ' . STYLES_IMAGESET_DATA_TABLE . "
1827
 
                                        WHERE imageset_id = $style_id
1828
 
                                                AND image_lang = ''";
1829
 
                                $result = $db->sql_query($sql);
1830
 
                                while ($row = $db->sql_fetchrow($result))
1831
 
                                {
1832
 
                                        $imageset_main[$row['image_name']] = $row['image_filename'] . ($row['image_height'] ? '*' . $row['image_height']: '') . ($row['image_width'] ? '*' . $row['image_width']: '');
1833
 
                                }
1834
 
                                $db->sql_freeresult($result);
1835
 
 
1836
 
                                foreach ($this->imageset_keys as $topic => $key_array)
1837
 
                                {
1838
 
                                        foreach ($key_array as $key)
1839
 
                                        {
1840
 
                                                if (isset($imageset_main[$key]))
1841
 
                                                {
1842
 
                                                        $imageset_cfg .= "\nimg_" . $key . ' = ' . str_replace("styles/{$style_row['imageset_path']}/imageset/", '{PATH}', $imageset_main[$key]);
1843
 
                                                }
1844
 
                                        }
1845
 
                                }
1846
 
 
1847
 
                                $files[] = array(
1848
 
                                        'src'           => "styles/{$style_row['imageset_path']}/imageset/",
1849
 
                                        'prefix-'       => "styles/{$style_row['imageset_path']}/",
1850
 
                                        'prefix+'       => false,
1851
 
                                        'exclude'       => 'imageset.cfg'
1852
 
                                );
1853
 
 
1854
 
                                $data[] = array(
1855
 
                                        'src'           => trim($imageset_cfg),
1856
 
                                        'prefix'        => 'imageset/imageset.cfg'
1857
 
                                );
1858
 
 
1859
 
                                end($data);
1860
 
 
1861
 
                                $imageset_root = "{$phpbb_root_path}styles/{$style_row['imageset_path']}/imageset/";
1862
 
 
1863
 
                                if ($dh = @opendir($imageset_root))
1864
 
                                {
1865
 
                                        while (($fname = readdir($dh)) !== false)
1866
 
                                        {
1867
 
                                                if ($fname[0] != '.' && $fname != 'CVS' && is_dir("$imageset_root$fname"))
1868
 
                                                {
1869
 
                                                        $files[key($files)]['exclude'] .= ',' . $fname . '/imageset.cfg';
1870
 
                                                }
1871
 
                                        }
1872
 
                                        closedir($dh);
1873
 
                                }
1874
 
 
1875
 
                                $imageset_lang = array();
1876
 
 
1877
 
                                $sql = 'SELECT image_filename, image_name, image_height, image_width, image_lang
1878
 
                                        FROM ' . STYLES_IMAGESET_DATA_TABLE . "
1879
 
                                        WHERE imageset_id = $style_id
1880
 
                                                AND image_lang <> ''";
1881
 
                                $result = $db->sql_query($sql);
1882
 
                                while ($row = $db->sql_fetchrow($result))
1883
 
                                {
1884
 
                                        $imageset_lang[$row['image_lang']][$row['image_name']] = $row['image_filename'] . ($row['image_height'] ? '*' . $row['image_height']: '') . ($row['image_width'] ? '*' . $row['image_width']: '');
1885
 
                                }
1886
 
                                $db->sql_freeresult($result);
1887
 
 
1888
 
                                foreach ($imageset_lang as $lang => $imageset_localized)
1889
 
                                {
1890
 
                                        $imageset_cfg = str_replace(array('{MODE}', '{NAME}', '{COPYRIGHT}', '{VERSION}'), array($mode, $style_row['imageset_name'], $style_row['imageset_copyright'], $config['version']), $this->imageset_cfg);
1891
 
 
1892
 
                                        foreach ($this->imageset_keys as $topic => $key_array)
1893
 
                                        {
1894
 
                                                foreach ($key_array as $key)
1895
 
                                                {
1896
 
                                                        if (isset($imageset_localized[$key]))
1897
 
                                                        {
1898
 
                                                                $imageset_cfg .= "\nimg_" . $key . ' = ' . str_replace("styles/{$style_row['imageset_path']}/imageset/", '{PATH}', $imageset_localized[$key]);
1899
 
                                                        }
1900
 
                                                }
1901
 
                                        }
1902
 
 
1903
 
                                        $data[] = array(
1904
 
                                                'src'           => trim($imageset_cfg),
1905
 
                                                'prefix'        => 'imageset/' . $lang . '/imageset.cfg'
1906
 
                                        );
1907
 
                                }
1908
 
 
1909
 
                                unset($imageset_cfg);
1910
 
                        }
1911
 
 
1912
 
                        switch ($format)
1913
 
                        {
1914
 
                                case 'tar':
1915
 
                                        $ext = '.tar';
1916
 
                                        $mimetype = 'x-tar';
1917
 
                                        $compress = 'compress_tar';
1918
 
                                break;
1919
 
 
1920
 
                                case 'zip':
1921
 
                                        $ext = '.zip';
1922
 
                                        $mimetype = 'zip';
1923
 
                                break;
1924
 
 
1925
 
                                case 'tar.gz':
1926
 
                                        $ext = '.tar.gz';
1927
 
                                        $mimetype = 'x-gzip';
1928
 
                                break;
1929
 
 
1930
 
                                case 'tar.bz2':
1931
 
                                        $ext = '.tar.bz2';
1932
 
                                        $mimetype = 'x-bzip2';
1933
 
                                break;
1934
 
 
1935
 
                                default:
1936
 
                                        $error[] = $user->lang[$l_prefix . '_ERR_ARCHIVE'];
1937
 
                        }
1938
 
 
1939
 
                        if (!sizeof($error))
1940
 
                        {
1941
 
                                include($phpbb_root_path . 'includes/functions_compress.' . $phpEx);
1942
 
 
1943
 
                                if ($mode == 'style')
1944
 
                                {
1945
 
                                        $path = preg_replace('#[^\w-]+#', '_', $style_row['style_name']);
1946
 
                                }
1947
 
                                else
1948
 
                                {
1949
 
                                        $path = $style_row[$mode . '_path'];
1950
 
                                }
1951
 
 
1952
 
                                if ($format == 'zip')
1953
 
                                {
1954
 
                                        $compress = new compress_zip('w', $phpbb_root_path . "store/$path$ext");
1955
 
                                }
1956
 
                                else
1957
 
                                {
1958
 
                                        $compress = new compress_tar('w', $phpbb_root_path . "store/$path$ext", $ext);
1959
 
                                }
1960
 
 
1961
 
                                if (sizeof($files))
1962
 
                                {
1963
 
                                        foreach ($files as $file_ary)
1964
 
                                        {
1965
 
                                                $compress->add_file($file_ary['src'], $file_ary['prefix-'], $file_ary['prefix+'], $file_ary['exclude']);
1966
 
                                        }
1967
 
                                }
1968
 
 
1969
 
                                if (sizeof($data))
1970
 
                                {
1971
 
                                        foreach ($data as $data_ary)
1972
 
                                        {
1973
 
                                                $compress->add_data($data_ary['src'], $data_ary['prefix']);
1974
 
                                        }
1975
 
                                }
1976
 
 
1977
 
                                $compress->close();
1978
 
 
1979
 
                                add_log('admin', 'LOG_' . $l_prefix . '_EXPORT', $style_row[$mode . '_name']);
1980
 
 
1981
 
                                if (!$store)
1982
 
                                {
1983
 
                                        $compress->download($path);
1984
 
                                        @unlink("{$phpbb_root_path}store/$path$ext");
1985
 
                                        exit;
1986
 
                                }
1987
 
 
1988
 
                                trigger_error(sprintf($user->lang[$l_prefix . '_EXPORTED'], "store/$path$ext") . adm_back_link($this->u_action));
1989
 
                        }
1990
 
                }
1991
 
 
1992
 
                $sql = "SELECT {$mode}_id, {$mode}_name
1993
 
                        FROM " . (($mode == 'style') ? STYLES_TABLE : $sql_from) . "
1994
 
                        WHERE {$mode}_id = $style_id";
1995
 
                $result = $db->sql_query($sql);
1996
 
                $style_row = $db->sql_fetchrow($result);
1997
 
                $db->sql_freeresult($result);
1998
 
 
1999
 
                if (!$style_row)
2000
 
                {
2001
 
                        trigger_error($user->lang['NO_' . $l_prefix] . adm_back_link($this->u_action), E_USER_WARNING);
2002
 
                }
2003
 
 
2004
 
                $this->page_title = $l_prefix . '_EXPORT';
2005
 
 
2006
 
                $format_buttons = '';
2007
 
                foreach ($methods as $method)
2008
 
                {
2009
 
                        $format_buttons .= '<label><input type="radio"' . ((!$format_buttons) ? ' id="format"' : '') . ' class="radio" value="' . $method . '" name="format"' . (($method == $format) ? ' checked="checked"' : '') . ' /> ' . $method . '</label>';
2010
 
                }
2011
 
 
2012
 
                $template->assign_vars(array(
2013
 
                        'S_EXPORT'              => true,
2014
 
                        'S_ERROR_MSG'   => (sizeof($error)) ? true : false,
2015
 
                        'S_STYLE'               => ($mode == 'style') ? true : false,
2016
 
 
2017
 
                        'L_TITLE'               => $user->lang[$this->page_title],
2018
 
                        'L_EXPLAIN'             => $user->lang[$this->page_title . '_EXPLAIN'],
2019
 
                        'L_NAME'                => $user->lang[$l_prefix . '_NAME'],
2020
 
 
2021
 
                        'U_ACTION'              => $this->u_action . '&amp;action=export&amp;id=' . $style_id,
2022
 
                        'U_BACK'                => $this->u_action,
2023
 
 
2024
 
                        'ERROR_MSG'                     => (sizeof($error)) ? implode('<br />', $error) : '',
2025
 
                        'NAME'                          => $style_row[$mode . '_name'],
2026
 
                        'FORMAT_BUTTONS'        => $format_buttons)
2027
 
                );
2028
 
        }
2029
 
 
2030
 
        /**
2031
 
        * Display details
2032
 
        */
2033
 
        function details($mode, $style_id)
2034
 
        {
2035
 
                global $template, $db, $config, $user, $safe_mode, $cache, $phpbb_root_path;
2036
 
 
2037
 
                $update = (isset($_POST['update'])) ? true : false;
2038
 
                $l_type = strtoupper($mode);
2039
 
 
2040
 
                $error = array();
2041
 
                $element_ary = array('template' => STYLES_TEMPLATE_TABLE, 'theme' => STYLES_THEME_TABLE, 'imageset' => STYLES_IMAGESET_TABLE);
2042
 
 
2043
 
                switch ($mode)
2044
 
                {
2045
 
                        case 'style':
2046
 
                                $sql_from = STYLES_TABLE;
2047
 
                        break;
2048
 
 
2049
 
                        case 'template':
2050
 
                                $sql_from = STYLES_TEMPLATE_TABLE;
2051
 
                        break;
2052
 
 
2053
 
                        case 'theme':
2054
 
                                $sql_from = STYLES_THEME_TABLE;
2055
 
                        break;
2056
 
 
2057
 
                        case 'imageset':
2058
 
                                $sql_from = STYLES_IMAGESET_TABLE;
2059
 
                        break;
2060
 
                }
2061
 
 
2062
 
                $sql = "SELECT *
2063
 
                        FROM $sql_from
2064
 
                        WHERE {$mode}_id = $style_id";
2065
 
                $result = $db->sql_query($sql);
2066
 
                $style_row = $db->sql_fetchrow($result);
2067
 
                $db->sql_freeresult($result);
2068
 
 
2069
 
                if (!$style_row)
2070
 
                {
2071
 
                        trigger_error($user->lang['NO_' . $l_type] . adm_back_link($this->u_action), E_USER_WARNING);
2072
 
                }
2073
 
 
2074
 
                $style_row['style_default'] = ($mode == 'style' && $config['default_style'] == $style_id) ? 1 : 0;
2075
 
 
2076
 
                if ($update)
2077
 
                {
2078
 
                        $name = utf8_normalize_nfc(request_var('name', '', true));
2079
 
                        $copyright = utf8_normalize_nfc(request_var('copyright', '', true));
2080
 
 
2081
 
                        $template_id = request_var('template_id', 0);
2082
 
                        $theme_id = request_var('theme_id', 0);
2083
 
                        $imageset_id = request_var('imageset_id', 0);
2084
 
 
2085
 
                        $style_active = request_var('style_active', 0);
2086
 
                        $style_default = request_var('style_default', 0);
2087
 
                        $store_db = request_var('store_db', 0);
2088
 
 
2089
 
                        if ($mode == 'style' && (!$template_id || !$theme_id || !$imageset_id))
2090
 
                        {
2091
 
                                $error[] = $user->lang['STYLE_ERR_NO_IDS'];
2092
 
                        }
2093
 
 
2094
 
                        if ($mode == 'style' && $style_row['style_active'] && !$style_active && $config['default_style'] == $style_id)
2095
 
                        {
2096
 
                                $error[] = $user->lang['DEACTIVATE_DEFAULT'];
2097
 
                        }
2098
 
 
2099
 
                        if (!$name)
2100
 
                        {
2101
 
                                $error[] = $user->lang[$l_type . '_ERR_STYLE_NAME'];
2102
 
                        }
2103
 
 
2104
 
                        if ($mode === 'theme' || $mode === 'template')
2105
 
                        {
2106
 
                                // a rather elaborate check we have to do here once to avoid trouble later
2107
 
                                $check = "{$phpbb_root_path}styles/" . $style_row["{$mode}_path"] . (($mode === 'theme') ? '/theme/stylesheet.css' : '/template');
2108
 
                                if (($style_row["{$mode}_storedb"] != $store_db) && !$store_db && ($safe_mode || !@is_writable($check)))
2109
 
                                {
2110
 
                                        $error[] = $user->lang['EDIT_' . strtoupper($mode) . '_STORED_DB'];
2111
 
                                        $store_db = 1;
2112
 
                                }
2113
 
 
2114
 
                                // themes which have to be parsed have to go into db
2115
 
                                if ($mode == 'theme')
2116
 
                                {
2117
 
                                        $cfg = parse_cfg_file("{$phpbb_root_path}styles/" . $style_row["{$mode}_path"] . "/theme/theme.cfg");
2118
 
 
2119
 
                                        if (isset($cfg['parse_css_file']) && $cfg['parse_css_file'] && !$store_db)
2120
 
                                        {
2121
 
                                                $error[] = $user->lang['EDIT_THEME_STORE_PARSED'];
2122
 
                                                $store_db = 1;
2123
 
                                        }
2124
 
                                }
2125
 
                        }
2126
 
                        
2127
 
                        if (!sizeof($error))
2128
 
                        {
2129
 
                                // Check length settings
2130
 
                                if (utf8_strlen($name) > 30)
2131
 
                                {
2132
 
                                        $error[] = $user->lang[$l_type . '_ERR_NAME_LONG'];
2133
 
                                }
2134
 
 
2135
 
                                if (utf8_strlen($copyright) > 60)
2136
 
                                {
2137
 
                                        $error[] = $user->lang[$l_type . '_ERR_COPY_LONG'];
2138
 
                                }
2139
 
                        }
2140
 
                }
2141
 
 
2142
 
                if ($update && sizeof($error))
2143
 
                {
2144
 
                        $style_row = array_merge($style_row, array(
2145
 
                                'template_id'                   => $template_id,
2146
 
                                'theme_id'                              => $theme_id,
2147
 
                                'imageset_id'                   => $imageset_id,
2148
 
                                'style_active'                  => $style_active,
2149
 
                                $mode . '_storedb'              => $store_db,
2150
 
                                $mode . '_name'                 => $name,
2151
 
                                $mode . '_copyright'    => $copyright)
2152
 
                        );
2153
 
                }
2154
 
 
2155
 
                // User has submitted form and no errors have occurred
2156
 
                if ($update && !sizeof($error))
2157
 
                {
2158
 
                        $sql_ary = array(
2159
 
                                $mode . '_name'                 => $name,
2160
 
                                $mode . '_copyright'    => $copyright
2161
 
                        );
2162
 
 
2163
 
                        switch ($mode)
2164
 
                        {
2165
 
                                case 'style':
2166
 
 
2167
 
                                        $sql_ary += array(
2168
 
                                                'template_id'           => (int) $template_id,
2169
 
                                                'theme_id'                      => (int) $theme_id,
2170
 
                                                'imageset_id'           => (int) $imageset_id,
2171
 
                                                'style_active'          => (int) $style_active,
2172
 
                                        );
2173
 
                                break;
2174
 
 
2175
 
                                case 'imageset':
2176
 
                                break;
2177
 
 
2178
 
                                case 'theme':
2179
 
 
2180
 
                                        if ($style_row['theme_storedb'] != $store_db)
2181
 
                                        {
2182
 
                                                $theme_data = '';
2183
 
 
2184
 
                                                if (!$style_row['theme_storedb'])
2185
 
                                                {
2186
 
                                                        $theme_data = $this->db_theme_data($style_row);
2187
 
                                                }
2188
 
                                                else if (!$store_db && !$safe_mode && @is_writable("{$phpbb_root_path}styles/{$style_row['theme_path']}/theme/stylesheet.css"))
2189
 
                                                {
2190
 
                                                        $store_db = 1;
2191
 
                                                        $theme_data = $style_row['theme_data'];
2192
 
 
2193
 
                                                        if ($fp = @fopen("{$phpbb_root_path}styles/{$style_row['theme_path']}/theme/stylesheet.css", 'wb'))
2194
 
                                                        {
2195
 
                                                                $store_db = (@fwrite($fp, str_replace("styles/{$style_row['theme_path']}/theme/", './', $theme_data))) ? 0 : 1;
2196
 
                                                        }
2197
 
                                                        fclose($fp);
2198
 
                                                }
2199
 
 
2200
 
                                                $sql_ary += array(
2201
 
                                                        'theme_mtime'   => ($store_db) ? filemtime("{$phpbb_root_path}styles/{$style_row['theme_path']}/theme/stylesheet.css") : 0,
2202
 
                                                        'theme_storedb' => $store_db,
2203
 
                                                        'theme_data'    => ($store_db) ? $theme_data : '',
2204
 
                                                );
2205
 
                                        }
2206
 
                                break;
2207
 
 
2208
 
                                case 'template':
2209
 
 
2210
 
                                        if ($style_row['template_storedb'] != $store_db)
2211
 
                                        {
2212
 
                                                if (!$store_db && !$safe_mode && @is_writable("{$phpbb_root_path}styles/{$style_row['template_path']}/template"))
2213
 
                                                {
2214
 
                                                        $sql = 'SELECT *
2215
 
                                                                FROM ' . STYLES_TEMPLATE_DATA_TABLE . "
2216
 
                                                                WHERE template_id = $style_id";
2217
 
                                                        $result = $db->sql_query($sql);
2218
 
 
2219
 
                                                        while ($row = $db->sql_fetchrow($result))
2220
 
                                                        {
2221
 
                                                                if (!($fp = @fopen("{$phpbb_root_path}styles/{$style_row['template_path']}/template/" . $row['template_filename'], 'wb')))
2222
 
                                                                {
2223
 
                                                                        $store_db = 1;
2224
 
                                                                        $error[] = $user->lang['EDIT_TEMPLATE_STORED_DB'];
2225
 
                                                                        break;
2226
 
                                                                }
2227
 
 
2228
 
                                                                fwrite($fp, $row['template_data']);
2229
 
                                                                fclose($fp);
2230
 
                                                        }
2231
 
                                                        $db->sql_freeresult($result);
2232
 
 
2233
 
                                                        if (!$store_db)
2234
 
                                                        {
2235
 
                                                                $sql = 'DELETE FROM ' . STYLES_TEMPLATE_DATA_TABLE . "
2236
 
                                                                        WHERE template_id = $style_id";
2237
 
                                                                $db->sql_query($sql);
2238
 
                                                        }
2239
 
                                                }
2240
 
                                                else if ($store_db)
2241
 
                                                {
2242
 
                                                        $filelist = filelist("{$phpbb_root_path}styles/{$style_row['template_path']}/template", '', 'html');
2243
 
                                                        $this->store_templates('insert', $style_id, $style_row['template_path'], $filelist);
2244
 
                                                }
2245
 
                                                else
2246
 
                                                {
2247
 
                                                        // We no longer store within the db, but are also not able to update the file structure
2248
 
                                                        // Since the admin want to switch this, we adhere to his decision. But we also need to remove the cache
2249
 
                                                        $sql = 'DELETE FROM ' . STYLES_TEMPLATE_DATA_TABLE . "
2250
 
                                                                WHERE template_id = $style_id";
2251
 
                                                        $db->sql_query($sql);
2252
 
                                                }
2253
 
 
2254
 
                                                $sql_ary += array(
2255
 
                                                        'template_storedb'      => $store_db,
2256
 
                                                );
2257
 
                                        }
2258
 
                                break;
2259
 
                        }
2260
 
 
2261
 
                        if (sizeof($sql_ary))
2262
 
                        {
2263
 
                                $sql = "UPDATE $sql_from
2264
 
                                        SET " . $db->sql_build_array('UPDATE', $sql_ary) . "
2265
 
                                        WHERE {$mode}_id = $style_id";
2266
 
                                $db->sql_query($sql);
2267
 
 
2268
 
                                // Making this the default style?
2269
 
                                if ($mode == 'style' && $style_default)
2270
 
                                {
2271
 
                                        set_config('default_style', $style_id);
2272
 
                                }
2273
 
                        }
2274
 
 
2275
 
                        $cache->destroy('sql', STYLES_TABLE);
2276
 
 
2277
 
                        add_log('admin', 'LOG_' . $l_type . '_EDIT_DETAILS', $name);
2278
 
                        if (sizeof($error))
2279
 
                        {
2280
 
                                trigger_error(implode('<br />', $error) . adm_back_link($this->u_action), E_USER_WARNING);
2281
 
                        }
2282
 
                        else
2283
 
                        {
2284
 
                                trigger_error($user->lang[$l_type . '_DETAILS_UPDATED'] . adm_back_link($this->u_action));
2285
 
                        }
2286
 
                }
2287
 
 
2288
 
                if ($mode == 'style')
2289
 
                {
2290
 
                        foreach ($element_ary as $element => $table)
2291
 
                        {
2292
 
                                $sql = "SELECT {$element}_id, {$element}_name
2293
 
                                        FROM $table
2294
 
                                        ORDER BY {$element}_id ASC";
2295
 
                                $result = $db->sql_query($sql);
2296
 
 
2297
 
                                ${$element . '_options'} = '';
2298
 
                                while ($row = $db->sql_fetchrow($result))
2299
 
                                {
2300
 
                                        $selected = ($row[$element . '_id'] == $style_row[$element . '_id']) ? ' selected="selected"' : '';
2301
 
                                        ${$element . '_options'} .= '<option value="' . $row[$element . '_id'] . '"' . $selected . '>' . $row[$element . '_name'] . '</option>';
2302
 
                                }
2303
 
                                $db->sql_freeresult($result);
2304
 
                        }
2305
 
                }
2306
 
 
2307
 
                $this->page_title = 'EDIT_DETAILS_' . $l_type;
2308
 
 
2309
 
                $template->assign_vars(array(
2310
 
                        'S_DETAILS'                             => true,
2311
 
                        'S_ERROR_MSG'                   => (sizeof($error)) ? true : false,
2312
 
                        'S_STYLE'                               => ($mode == 'style') ? true : false,
2313
 
                        'S_TEMPLATE'                    => ($mode == 'template') ? true : false,
2314
 
                        'S_THEME'                               => ($mode == 'theme') ? true : false,
2315
 
                        'S_IMAGESET'                    => ($mode == 'imageset') ? true : false,
2316
 
                        'S_STORE_DB'                    => (isset($style_row[$mode . '_storedb'])) ? $style_row[$mode . '_storedb'] : 0,
2317
 
                        'S_STYLE_ACTIVE'                => (isset($style_row['style_active'])) ? $style_row['style_active'] : 0,
2318
 
                        'S_STYLE_DEFAULT'               => (isset($style_row['style_default'])) ? $style_row['style_default'] : 0,
2319
 
 
2320
 
                        'S_TEMPLATE_OPTIONS'    => ($mode == 'style') ? $template_options : '',
2321
 
                        'S_THEME_OPTIONS'               => ($mode == 'style') ? $theme_options : '',
2322
 
                        'S_IMAGESET_OPTIONS'    => ($mode == 'style') ? $imageset_options : '',
2323
 
 
2324
 
                        'U_ACTION'              => $this->u_action . '&amp;action=details&amp;id=' . $style_id,
2325
 
                        'U_BACK'                => $this->u_action,
2326
 
 
2327
 
                        'L_TITLE'                               => $user->lang[$this->page_title],
2328
 
                        'L_EXPLAIN'                             => $user->lang[$this->page_title . '_EXPLAIN'],
2329
 
                        'L_NAME'                                => $user->lang[$l_type . '_NAME'],
2330
 
                        'L_LOCATION'                    => ($mode == 'template' || $mode == 'theme') ? $user->lang[$l_type . '_LOCATION'] : '',
2331
 
                        'L_LOCATION_EXPLAIN'    => ($mode == 'template' || $mode == 'theme') ? $user->lang[$l_type . '_LOCATION_EXPLAIN'] : '',
2332
 
 
2333
 
                        'ERROR_MSG'             => (sizeof($error)) ? implode('<br />', $error) : '',
2334
 
                        'NAME'                  => $style_row[$mode . '_name'],
2335
 
                        'COPYRIGHT'             => $style_row[$mode . '_copyright'],
2336
 
                        )
2337
 
                );
2338
 
        }
2339
 
 
2340
 
        /**
2341
 
        * Load css file contents
2342
 
        */
2343
 
        function load_css_file($path, $filename)
2344
 
        {
2345
 
                global $phpbb_root_path;
2346
 
 
2347
 
                $file = "{$phpbb_root_path}styles/$path/theme/$filename";
2348
 
 
2349
 
                if (file_exists($file) && ($content = file_get_contents($file)))
2350
 
                {
2351
 
                        $content = trim($content);
2352
 
                }
2353
 
                else
2354
 
                {
2355
 
                        $content = '';
2356
 
                }
2357
 
 
2358
 
                return $content;
2359
 
        }
2360
 
 
2361
 
        /**
2362
 
        * Returns a string containing the value that should be used for the theme_data column in the theme database table.
2363
 
        * Includes contents of files loaded via @import
2364
 
        *
2365
 
        * @param array $theme_row is an associative array containing the theme's current database entry
2366
 
        * @param mixed $stylesheet can either be the new content for the stylesheet or false to load from the standard file
2367
 
        * @param string $root_path should only be used in case you want to use a different root path than "{$phpbb_root_path}styles/{$theme_row['theme_path']}"
2368
 
        *
2369
 
        * @return string Stylesheet data for theme_data column in the theme table
2370
 
        */
2371
 
        function db_theme_data($theme_row, $stylesheet = false, $root_path = '')
2372
 
        {
2373
 
                global $phpbb_root_path;
2374
 
 
2375
 
                if (!$root_path)
2376
 
                {
2377
 
                        $root_path = $phpbb_root_path . 'styles/' . $theme_row['theme_path'];
2378
 
                }
2379
 
 
2380
 
                if (!$stylesheet)
2381
 
                {
2382
 
                        $stylesheet = '';
2383
 
                        if (file_exists($root_path . '/theme/stylesheet.css'))
2384
 
                        {
2385
 
                                $stylesheet = file_get_contents($root_path . '/theme/stylesheet.css');
2386
 
                        }
2387
 
                }
2388
 
 
2389
 
                // Match CSS imports
2390
 
                $matches = array();
2391
 
                preg_match_all('/@import url\(["\'](.*)["\']\);/i', $stylesheet, $matches);
2392
 
 
2393
 
                if (sizeof($matches))
2394
 
                {
2395
 
                        foreach ($matches[0] as $idx => $match)
2396
 
                        {
2397
 
                                $stylesheet = str_replace($match, acp_styles::load_css_file($theme_row['theme_path'], $matches[1][$idx]), $stylesheet);
2398
 
                        }
2399
 
                }
2400
 
 
2401
 
                // adjust paths
2402
 
                return str_replace('./', 'styles/' . $theme_row['theme_path'] . '/theme/', $stylesheet);
2403
 
        }
2404
 
 
2405
 
        /**
2406
 
        * Store template files into db
2407
 
        */
2408
 
        function store_templates($mode, $style_id, $template_path, $filelist)
2409
 
        {
2410
 
                global $phpbb_root_path, $phpEx, $db;
2411
 
 
2412
 
                $template_path = $template_path . '/template/';
2413
 
                $includes = array();
2414
 
                foreach ($filelist as $pathfile => $file_ary)
2415
 
                {
2416
 
                        foreach ($file_ary as $file)
2417
 
                        {
2418
 
                                if (!($fp = @fopen("{$phpbb_root_path}styles/$template_path$pathfile$file", 'r')))
2419
 
                                {
2420
 
                                        trigger_error("Could not open {$phpbb_root_path}styles/$template_path$pathfile$file", E_USER_ERROR);
2421
 
                                }
2422
 
                                $template_data = fread($fp, filesize("{$phpbb_root_path}styles/$template_path$pathfile$file"));
2423
 
                                fclose($fp);
2424
 
 
2425
 
                                if (preg_match_all('#<!-- INCLUDE (.*?\.html) -->#is', $template_data, $matches))
2426
 
                                {
2427
 
                                        foreach ($matches[1] as $match)
2428
 
                                        {
2429
 
                                                $includes[trim($match)][] = $file;
2430
 
                                        }
2431
 
                                }
2432
 
                        }
2433
 
                }
2434
 
 
2435
 
                foreach ($filelist as $pathfile => $file_ary)
2436
 
                {
2437
 
                        foreach ($file_ary as $file)
2438
 
                        {
2439
 
                                // Skip index.
2440
 
                                if (strpos($file, 'index.') === 0)
2441
 
                                {
2442
 
                                        continue;
2443
 
                                }
2444
 
 
2445
 
                                // We could do this using extended inserts ... but that could be one
2446
 
                                // heck of a lot of data ...
2447
 
                                $sql_ary = array(
2448
 
                                        'template_id'                   => (int) $style_id,
2449
 
                                        'template_filename'             => "$pathfile$file",
2450
 
                                        'template_included'             => (isset($includes[$file])) ? implode(':', $includes[$file]) . ':' : '',
2451
 
                                        'template_mtime'                => (int) filemtime("{$phpbb_root_path}styles/$template_path$pathfile$file"),
2452
 
                                        'template_data'                 => (string) file_get_contents("{$phpbb_root_path}styles/$template_path$pathfile$file"),
2453
 
                                );
2454
 
 
2455
 
                                if ($mode == 'insert')
2456
 
                                {
2457
 
                                        $sql = 'INSERT INTO ' . STYLES_TEMPLATE_DATA_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
2458
 
                                }
2459
 
                                else
2460
 
                                {
2461
 
                                        $sql = 'UPDATE ' . STYLES_TEMPLATE_DATA_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
2462
 
                                                WHERE template_id = $style_id
2463
 
                                                        AND template_filename = '" . $db->sql_escape("$pathfile$file") . "'";
2464
 
                                }
2465
 
                                $db->sql_query($sql);
2466
 
                        }
2467
 
                }
2468
 
        }
2469
 
 
2470
 
        /**
2471
 
        * Returns an array containing all template filenames for one template that are currently cached.
2472
 
        *
2473
 
        * @param string $template_path contains the name of the template's folder in /styles/
2474
 
        *
2475
 
        * @return array of filenames that exist in /styles/$template_path/template/ (without extension!)
2476
 
        */
2477
 
        function template_cache_filelist($template_path)
2478
 
        {
2479
 
                global $phpbb_root_path, $phpEx, $user;
2480
 
 
2481
 
                $cache_prefix = 'tpl_' . $template_path;
2482
 
 
2483
 
                if (!($dp = @opendir("{$phpbb_root_path}cache")))
2484
 
                {
2485
 
                        trigger_error($user->lang['TEMPLATE_ERR_CACHE_READ'] . adm_back_link($this->u_action), E_USER_WARNING);
2486
 
                }
2487
 
 
2488
 
                $file_ary = array();
2489
 
                while ($file = readdir($dp))
2490
 
                {
2491
 
                        if ($file[0] == '.')
2492
 
                        {
2493
 
                                continue;
2494
 
                        }
2495
 
 
2496
 
                        if (is_file($phpbb_root_path . 'cache/' . $file) && (strpos($file, $cache_prefix) === 0))
2497
 
                        {
2498
 
                                $file_ary[] = str_replace('.', '/', preg_replace('#^' . preg_quote($cache_prefix, '#') . '_(.*?)\.html\.' . $phpEx . '$#i', '\1', $file));
2499
 
                        }
2500
 
                }
2501
 
                closedir($dp);
2502
 
 
2503
 
                return $file_ary;
2504
 
        }
2505
 
 
2506
 
        /**
2507
 
        * Destroys cached versions of template files
2508
 
        *
2509
 
        * @param array $template_row contains the template's row in the STYLES_TEMPLATE_TABLE database table
2510
 
        * @param mixed $file_ary is optional and may contain an array of template file names which should be refreshed in the cache.
2511
 
        *       The file names should be the original template file names and not the cache file names.
2512
 
        */
2513
 
        function clear_template_cache($template_row, $file_ary = false)
2514
 
        {
2515
 
                global $phpbb_root_path, $phpEx, $user;
2516
 
 
2517
 
                $cache_prefix = 'tpl_' . $template_row['template_path'];
2518
 
 
2519
 
                if (!$file_ary || !is_array($file_ary))
2520
 
                {
2521
 
                        $file_ary = $this->template_cache_filelist($template_row['template_path']);
2522
 
                        $log_file_list = $user->lang['ALL_FILES'];
2523
 
                }
2524
 
                else
2525
 
                {
2526
 
                        $log_file_list = implode(', ', $file_ary);
2527
 
                }
2528
 
 
2529
 
                foreach ($file_ary as $file)
2530
 
                {
2531
 
                        $file = str_replace('/', '.', $file);
2532
 
 
2533
 
                        $file = "{$phpbb_root_path}cache/{$cache_prefix}_$file.html.$phpEx";
2534
 
                        if (file_exists($file) && is_file($file))
2535
 
                        {
2536
 
                                @unlink($file);
2537
 
                        }
2538
 
                }
2539
 
                unset($file_ary);
2540
 
 
2541
 
                add_log('admin', 'LOG_TEMPLATE_CACHE_CLEARED', $template_row['template_name'], $log_file_list);
2542
 
        }
2543
 
 
2544
 
        /**
2545
 
        * Install Style/Template/Theme/Imageset
2546
 
        */
2547
 
        function install($mode)
2548
 
        {
2549
 
                global $phpbb_root_path, $phpEx, $config, $db, $cache, $user, $template;
2550
 
 
2551
 
                $l_type = strtoupper($mode);
2552
 
 
2553
 
                $error = $installcfg = $style_row = array();
2554
 
                $root_path = $cfg_file = '';
2555
 
                $element_ary = array('template' => STYLES_TEMPLATE_TABLE, 'theme' => STYLES_THEME_TABLE, 'imageset' => STYLES_IMAGESET_TABLE);
2556
 
 
2557
 
                $install_path = request_var('path', '');
2558
 
                $update = (isset($_POST['update'])) ? true : false;
2559
 
 
2560
 
                // Installing, obtain cfg file contents
2561
 
                if ($install_path)
2562
 
                {
2563
 
                        $root_path = $phpbb_root_path . 'styles/' . $install_path . '/';
2564
 
                        $cfg_file = ($mode == 'style') ? "$root_path$mode.cfg" : "$root_path$mode/$mode.cfg";
2565
 
 
2566
 
                        if (!file_exists($cfg_file))
2567
 
                        {
2568
 
                                $error[] = $user->lang[$l_type . '_ERR_NOT_' . $l_type];
2569
 
                        }
2570
 
                        else
2571
 
                        {
2572
 
                                $installcfg = parse_cfg_file($cfg_file);
2573
 
                        }
2574
 
                }
2575
 
 
2576
 
                // Installing
2577
 
                if (sizeof($installcfg))
2578
 
                {
2579
 
                        $name           = $installcfg['name'];
2580
 
                        $copyright      = $installcfg['copyright'];
2581
 
                        $version        = $installcfg['version'];
2582
 
 
2583
 
                        $style_row = array(
2584
 
                                $mode . '_id'                   => 0,
2585
 
                                $mode . '_name'                 => '',
2586
 
                                $mode . '_copyright'    => ''
2587
 
                        );
2588
 
 
2589
 
                        switch ($mode)
2590
 
                        {
2591
 
                                case 'style':
2592
 
 
2593
 
                                        $style_row = array(
2594
 
                                                'style_id'                      => 0,
2595
 
                                                'style_name'            => $installcfg['name'],
2596
 
                                                'style_copyright'       => $installcfg['copyright']
2597
 
                                        );
2598
 
 
2599
 
                                        $reqd_template = (isset($installcfg['required_template'])) ? $installcfg['required_template'] : false;
2600
 
                                        $reqd_theme = (isset($installcfg['required_theme'])) ? $installcfg['required_theme'] : false;
2601
 
                                        $reqd_imageset = (isset($installcfg['required_imageset'])) ? $installcfg['required_imageset'] : false;
2602
 
 
2603
 
                                        // Check to see if each element is already installed, if it is grab the id
2604
 
                                        foreach ($element_ary as $element => $table)
2605
 
                                        {
2606
 
                                                $style_row = array_merge($style_row, array(
2607
 
                                                        $element . '_id'                        => 0,
2608
 
                                                        $element . '_name'                      => '',
2609
 
                                                        $element . '_copyright'         => '')
2610
 
                                                );
2611
 
 
2612
 
                                                $this->test_installed($element, $error, (${'reqd_' . $element}) ? $phpbb_root_path . 'styles/' . $reqd_template . '/' : $root_path, ${'reqd_' . $element}, $style_row[$element . '_id'], $style_row[$element . '_name'], $style_row[$element . '_copyright']);
2613
 
 
2614
 
                                                if (!$style_row[$element . '_name'])
2615
 
                                                {
2616
 
                                                        $style_row[$element . '_name'] = $reqd_template;
2617
 
                                                }
2618
 
                                        }
2619
 
 
2620
 
                                break;
2621
 
 
2622
 
                                case 'template':
2623
 
                                        $this->test_installed('template', $error, $root_path, false, $style_row['template_id'], $style_row['template_name'], $style_row['template_copyright']);
2624
 
                                break;
2625
 
 
2626
 
                                case 'theme':
2627
 
                                        $this->test_installed('theme', $error, $root_path, false, $style_row['theme_id'], $style_row['theme_name'], $style_row['theme_copyright']);
2628
 
                                break;
2629
 
 
2630
 
                                case 'imageset':
2631
 
                                        $this->test_installed('imageset', $error, $root_path, false, $style_row['imageset_id'], $style_row['imageset_name'], $style_row['imageset_copyright']);
2632
 
                                break;
2633
 
                        }
2634
 
                }
2635
 
                else
2636
 
                {
2637
 
                        trigger_error($user->lang['NO_' . $l_type] . adm_back_link($this->u_action), E_USER_WARNING);
2638
 
                }
2639
 
 
2640
 
                $style_row['store_db'] = request_var('store_db', 0);
2641
 
                $style_row['style_active'] = request_var('style_active', 1);
2642
 
                $style_row['style_default'] = request_var('style_default', 0);
2643
 
 
2644
 
                // User has submitted form and no errors have occurred
2645
 
                if ($update && !sizeof($error))
2646
 
                {
2647
 
                        if ($mode == 'style')
2648
 
                        {
2649
 
                                foreach ($element_ary as $element => $table)
2650
 
                                {
2651
 
                                        ${$element . '_root_path'} = (${'reqd_' . $element}) ? $phpbb_root_path . 'styles/' . ${'reqd_' . $element} . '/' : false;
2652
 
                                        ${$element . '_path'} = (${'reqd_' . $element}) ? ${'reqd_' . $element} : false;
2653
 
                                }
2654
 
                                $this->install_style($error, 'install', $root_path, $style_row['style_id'], $style_row['style_name'], $install_path, $style_row['style_copyright'], $style_row['style_active'], $style_row['style_default'], $style_row, $template_root_path, $template_path, $theme_root_path, $theme_path, $imageset_root_path, $imageset_path);
2655
 
                        }
2656
 
                        else
2657
 
                        {
2658
 
                                $style_row['store_db'] = $this->install_element($mode, $error, 'install', $root_path, $style_row[$mode . '_id'], $style_row[$mode . '_name'], $install_path, $style_row[$mode . '_copyright'], $style_row['store_db']);
2659
 
                        }
2660
 
 
2661
 
                        if (!sizeof($error))
2662
 
                        {
2663
 
                                $cache->destroy('sql', STYLES_TABLE);
2664
 
 
2665
 
                                $message = ($style_row['store_db']) ? '_ADDED_DB' : '_ADDED';
2666
 
                                trigger_error($user->lang[$l_type . $message] . adm_back_link($this->u_action));
2667
 
                        }
2668
 
                }
2669
 
 
2670
 
                $this->page_title = 'INSTALL_' . $l_type;
2671
 
 
2672
 
                $template->assign_vars(array(
2673
 
                        'S_DETAILS'                     => true,
2674
 
                        'S_INSTALL'                     => true,
2675
 
                        'S_ERROR_MSG'           => (sizeof($error)) ? true : false,
2676
 
                        'S_STYLE'                       => ($mode == 'style') ? true : false,
2677
 
                        'S_TEMPLATE'            => ($mode == 'template') ? true : false,
2678
 
                        'S_THEME'                       => ($mode == 'theme') ? true : false,
2679
 
 
2680
 
                        'S_STORE_DB'                    => (isset($style_row[$mode . '_storedb'])) ? $style_row[$mode . '_storedb'] : 0,
2681
 
                        'S_STYLE_ACTIVE'                => (isset($style_row['style_active'])) ? $style_row['style_active'] : 0,
2682
 
                        'S_STYLE_DEFAULT'               => (isset($style_row['style_default'])) ? $style_row['style_default'] : 0,
2683
 
 
2684
 
                        'U_ACTION'                      => $this->u_action . "&amp;action=install&amp;path=" . urlencode($install_path),
2685
 
                        'U_BACK'                        => $this->u_action,
2686
 
 
2687
 
                        'L_TITLE'                               => $user->lang[$this->page_title],
2688
 
                        'L_EXPLAIN'                             => $user->lang[$this->page_title . '_EXPLAIN'],
2689
 
                        'L_NAME'                                => $user->lang[$l_type . '_NAME'],
2690
 
                        'L_LOCATION'                    => ($mode == 'template' || $mode == 'theme') ? $user->lang[$l_type . '_LOCATION'] : '',
2691
 
                        'L_LOCATION_EXPLAIN'    => ($mode == 'template' || $mode == 'theme') ? $user->lang[$l_type . '_LOCATION_EXPLAIN'] : '',
2692
 
 
2693
 
                        'ERROR_MSG'                     => (sizeof($error)) ? implode('<br />', $error) : '',
2694
 
                        'NAME'                          => $style_row[$mode . '_name'],
2695
 
                        'COPYRIGHT'                     => $style_row[$mode . '_copyright'],
2696
 
                        'TEMPLATE_NAME'         => ($mode == 'style') ? $style_row['template_name'] : '',
2697
 
                        'THEME_NAME'            => ($mode == 'style') ? $style_row['theme_name'] : '',
2698
 
                        'IMAGESET_NAME'         => ($mode == 'style') ? $style_row['imageset_name'] : '')
2699
 
                );
2700
 
        }
2701
 
 
2702
 
        /**
2703
 
        * Add new style
2704
 
        */
2705
 
        function add($mode)
2706
 
        {
2707
 
                global $phpbb_root_path, $phpEx, $config, $db, $cache, $user, $template;
2708
 
 
2709
 
                $l_type = strtoupper($mode);
2710
 
                $element_ary = array('template' => STYLES_TEMPLATE_TABLE, 'theme' => STYLES_THEME_TABLE, 'imageset' => STYLES_IMAGESET_TABLE);
2711
 
                $error = array();
2712
 
 
2713
 
                $style_row = array(
2714
 
                        $mode . '_name'                 => utf8_normalize_nfc(request_var('name', '', true)),
2715
 
                        $mode . '_copyright'    => utf8_normalize_nfc(request_var('copyright', '', true)),
2716
 
                        'template_id'                   => 0,
2717
 
                        'theme_id'                              => 0,
2718
 
                        'imageset_id'                   => 0,
2719
 
                        'store_db'                              => request_var('store_db', 0),
2720
 
                        'style_active'                  => request_var('style_active', 1),
2721
 
                        'style_default'                 => request_var('style_default', 0),
2722
 
                );
2723
 
 
2724
 
                $basis = request_var('basis', 0);
2725
 
                $update = (isset($_POST['update'])) ? true : false;
2726
 
 
2727
 
                if ($basis)
2728
 
                {
2729
 
                        switch ($mode)
2730
 
                        {
2731
 
                                case 'style':
2732
 
                                        $sql_select = 'template_id, theme_id, imageset_id';
2733
 
                                        $sql_from = STYLES_TABLE;
2734
 
                                break;
2735
 
 
2736
 
                                case 'template':
2737
 
                                        $sql_select = 'template_id';
2738
 
                                        $sql_from = STYLES_TEMPLATE_TABLE;
2739
 
                                break;
2740
 
 
2741
 
                                case 'theme':
2742
 
                                        $sql_select = 'theme_id';
2743
 
                                        $sql_from = STYLES_THEME_TABLE;
2744
 
                                break;
2745
 
 
2746
 
                                case 'imageset':
2747
 
                                        $sql_select = 'imageset_id';
2748
 
                                        $sql_from = STYLES_IMAGESET_TABLE;
2749
 
                                break;
2750
 
                        }
2751
 
 
2752
 
                        $sql = "SELECT $sql_select
2753
 
                                FROM $sql_from
2754
 
                                WHERE {$mode}_id = $basis";
2755
 
                        $result = $db->sql_query($sql);
2756
 
                        $row = $db->sql_fetchrow($result);
2757
 
                        $db->sql_freeresult($result);
2758
 
 
2759
 
                        if (!$row)
2760
 
                        {
2761
 
                                $error[] = $user->lang['NO_' . $l_type];
2762
 
                        }
2763
 
 
2764
 
                        if (!sizeof($error))
2765
 
                        {
2766
 
                                $style_row['template_id']       = (isset($row['template_id'])) ? $row['template_id'] : $style_row['template_id'];
2767
 
                                $style_row['theme_id']          = (isset($row['theme_id'])) ? $row['theme_id'] : $style_row['theme_id'];
2768
 
                                $style_row['imageset_id']       = (isset($row['imageset_id'])) ? $row['imageset_id'] : $style_row['imageset_id'];
2769
 
                        }
2770
 
                }
2771
 
 
2772
 
                if ($update)
2773
 
                {
2774
 
                        $style_row['template_id'] = request_var('template_id', $style_row['template_id']);
2775
 
                        $style_row['theme_id'] = request_var('theme_id', $style_row['theme_id']);
2776
 
                        $style_row['imageset_id'] = request_var('imageset_id', $style_row['imageset_id']);
2777
 
 
2778
 
                        if ($mode == 'style' && (!$style_row['template_id'] || !$style_row['theme_id'] || !$style_row['imageset_id']))
2779
 
                        {
2780
 
                                $error[] = $user->lang['STYLE_ERR_NO_IDS'];
2781
 
                        }
2782
 
                }
2783
 
 
2784
 
                // User has submitted form and no errors have occurred
2785
 
                if ($update && !sizeof($error))
2786
 
                {
2787
 
                        if ($mode == 'style')
2788
 
                        {
2789
 
                                $style_row['style_id'] = 0;
2790
 
 
2791
 
                                $this->install_style($error, 'add', '', $style_row['style_id'], $style_row['style_name'], '', $style_row['style_copyright'], $style_row['style_active'], $style_row['style_default'], $style_row);
2792
 
                        }
2793
 
 
2794
 
                        if (!sizeof($error))
2795
 
                        {
2796
 
                                $cache->destroy('sql', STYLES_TABLE);
2797
 
 
2798
 
                                $message = ($style_row['store_db']) ? '_ADDED_DB' : '_ADDED';
2799
 
                                trigger_error($user->lang[$l_type . $message] . adm_back_link($this->u_action));
2800
 
                        }
2801
 
                }
2802
 
 
2803
 
                if ($mode == 'style')
2804
 
                {
2805
 
                        foreach ($element_ary as $element => $table)
2806
 
                        {
2807
 
                                $sql = "SELECT {$element}_id, {$element}_name
2808
 
                                        FROM $table
2809
 
                                        ORDER BY {$element}_id ASC";
2810
 
                                $result = $db->sql_query($sql);
2811
 
 
2812
 
                                ${$element . '_options'} = '';
2813
 
                                while ($row = $db->sql_fetchrow($result))
2814
 
                                {
2815
 
                                        $selected = ($row[$element . '_id'] == $style_row[$element . '_id']) ? ' selected="selected"' : '';
2816
 
                                        ${$element . '_options'} .= '<option value="' . $row[$element . '_id'] . '"' . $selected . '>' . $row[$element . '_name'] . '</option>';
2817
 
                                }
2818
 
                                $db->sql_freeresult($result);
2819
 
                        }
2820
 
                }
2821
 
 
2822
 
                $this->page_title = 'ADD_' . $l_type;
2823
 
 
2824
 
                $template->assign_vars(array(
2825
 
                        'S_DETAILS'                     => true,
2826
 
                        'S_ADD'                         => true,
2827
 
                        'S_ERROR_MSG'           => (sizeof($error)) ? true : false,
2828
 
                        'S_STYLE'                       => ($mode == 'style') ? true : false,
2829
 
                        'S_TEMPLATE'            => ($mode == 'template') ? true : false,
2830
 
                        'S_THEME'                       => ($mode == 'theme') ? true : false,
2831
 
                        'S_BASIS'                       => ($basis) ? true : false,
2832
 
 
2833
 
                        'S_STORE_DB'                    => (isset($style_row['storedb'])) ? $style_row['storedb'] : 0,
2834
 
                        'S_STYLE_ACTIVE'                => (isset($style_row['style_active'])) ? $style_row['style_active'] : 0,
2835
 
                        'S_STYLE_DEFAULT'               => (isset($style_row['style_default'])) ? $style_row['style_default'] : 0,
2836
 
                        'S_TEMPLATE_OPTIONS'    => ($mode == 'style') ? $template_options : '',
2837
 
                        'S_THEME_OPTIONS'               => ($mode == 'style') ? $theme_options : '',
2838
 
                        'S_IMAGESET_OPTIONS'    => ($mode == 'style') ? $imageset_options : '',
2839
 
 
2840
 
                        'U_ACTION'                      => $this->u_action . '&amp;action=add&amp;basis=' . $basis,
2841
 
                        'U_BACK'                        => $this->u_action,
2842
 
 
2843
 
                        'L_TITLE'                               => $user->lang[$this->page_title],
2844
 
                        'L_EXPLAIN'                             => $user->lang[$this->page_title . '_EXPLAIN'],
2845
 
                        'L_NAME'                                => $user->lang[$l_type . '_NAME'],
2846
 
                        'L_LOCATION'                    => ($mode == 'template' || $mode == 'theme') ? $user->lang[$l_type . '_LOCATION'] : '',
2847
 
                        'L_LOCATION_EXPLAIN'    => ($mode == 'template' || $mode == 'theme') ? $user->lang[$l_type . '_LOCATION_EXPLAIN'] : '',
2848
 
 
2849
 
                        'ERROR_MSG'                     => (sizeof($error)) ? implode('<br />', $error) : '',
2850
 
                        'NAME'                          => $style_row[$mode . '_name'],
2851
 
                        'COPYRIGHT'                     => $style_row[$mode . '_copyright'])
2852
 
                );
2853
 
 
2854
 
        }
2855
 
 
2856
 
        /**
2857
 
 
2858
 
                                        $reqd_template = (isset($installcfg['required_template'])) ? $installcfg['required_template'] : false;
2859
 
                                        $reqd_theme = (isset($installcfg['required_theme'])) ? $installcfg['required_theme'] : false;
2860
 
                                        $reqd_imageset = (isset($installcfg['required_imageset'])) ? $installcfg['required_imageset'] : false;
2861
 
 
2862
 
                                        // Check to see if each element is already installed, if it is grab the id
2863
 
                                        foreach ($element_ary as $element => $table)
2864
 
                                        {
2865
 
                                                $style_row = array_merge($style_row, array(
2866
 
                                                        $element . '_id'                        => 0,
2867
 
                                                        $element . '_name'                      => '',
2868
 
                                                        $element . '_copyright'         => '')
2869
 
                                                );
2870
 
 
2871
 
                                                $this->test_installed($element, $error, $root_path, ${'reqd_' . $element}, $style_row[$element . '_id'], $style_row[$element . '_name'], $style_row[$element . '_copyright']);
2872
 
        * Is this element installed? If not, grab its cfg details
2873
 
        */
2874
 
        function test_installed($element, &$error, $root_path, $reqd_name, &$id, &$name, &$copyright)
2875
 
        {
2876
 
                global $db, $user;
2877
 
 
2878
 
                switch ($element)
2879
 
                {
2880
 
                        case 'template':
2881
 
                                $sql_from = STYLES_TEMPLATE_TABLE;
2882
 
                        break;
2883
 
 
2884
 
                        case 'theme':
2885
 
                                $sql_from = STYLES_THEME_TABLE;
2886
 
                        break;
2887
 
 
2888
 
                        case 'imageset':
2889
 
                                $sql_from = STYLES_IMAGESET_TABLE;
2890
 
                        break;
2891
 
                }
2892
 
 
2893
 
                $l_element = strtoupper($element);
2894
 
 
2895
 
                $chk_name = ($reqd_name !== false) ? $reqd_name : $name;
2896
 
 
2897
 
                $sql = "SELECT {$element}_id, {$element}_name
2898
 
                        FROM $sql_from
2899
 
                        WHERE {$element}_name = '" . $db->sql_escape($chk_name) . "'";
2900
 
                $result = $db->sql_query($sql);
2901
 
 
2902
 
                if ($row = $db->sql_fetchrow($result))
2903
 
                {
2904
 
                        $name = $row[$element . '_name'];
2905
 
                        $id = $row[$element . '_id'];
2906
 
                }
2907
 
                else
2908
 
                {
2909
 
                        if (!($cfg = @file("$root_path$element/$element.cfg")))
2910
 
                        {
2911
 
                                $error[] = sprintf($user->lang['REQUIRES_' . $l_element], $reqd_name);
2912
 
                                return false;
2913
 
                        }
2914
 
 
2915
 
                        $cfg = parse_cfg_file("$root_path$element/$element.cfg", $cfg);
2916
 
 
2917
 
                        $name = $cfg['name'];
2918
 
                        $copyright = $cfg['copyright'];
2919
 
                        $id = 0;
2920
 
 
2921
 
                        unset($cfg);
2922
 
                }
2923
 
                $db->sql_freeresult($result);
2924
 
        }
2925
 
 
2926
 
        /**
2927
 
        * Install/Add style
2928
 
        */
2929
 
        function install_style(&$error, $action, $root_path, &$id, $name, $path, $copyright, $active, $default, &$style_row, $template_root_path = false, $template_path = false, $theme_root_path = false, $theme_path = false, $imageset_root_path = false, $imageset_path = false)
2930
 
        {
2931
 
                global $config, $db, $user;
2932
 
 
2933
 
                $element_ary = array('template', 'theme', 'imageset');
2934
 
 
2935
 
                if (!$name)
2936
 
                {
2937
 
                        $error[] = $user->lang['STYLE_ERR_STYLE_NAME'];
2938
 
                }
2939
 
 
2940
 
                // Check length settings
2941
 
                if (utf8_strlen($name) > 30)
2942
 
                {
2943
 
                        $error[] = $user->lang['STYLE_ERR_NAME_LONG'];
2944
 
                }
2945
 
 
2946
 
                if (utf8_strlen($copyright) > 60)
2947
 
                {
2948
 
                        $error[] = $user->lang['STYLE_ERR_COPY_LONG'];
2949
 
                }
2950
 
 
2951
 
                // Check if the name already exist
2952
 
                $sql = 'SELECT style_id
2953
 
                        FROM ' . STYLES_TABLE . "
2954
 
                        WHERE style_name = '" . $db->sql_escape($name) . "'";
2955
 
                $result = $db->sql_query($sql);
2956
 
                $row = $db->sql_fetchrow($result);
2957
 
                $db->sql_freeresult($result);
2958
 
 
2959
 
                if ($row)
2960
 
                {
2961
 
                        $error[] = $user->lang['STYLE_ERR_NAME_EXIST'];
2962
 
                }
2963
 
 
2964
 
                if (sizeof($error))
2965
 
                {
2966
 
                        return false;
2967
 
                }
2968
 
 
2969
 
                foreach ($element_ary as $element)
2970
 
                {
2971
 
                        // Zero id value ... need to install element ... run usual checks
2972
 
                        // and do the install if necessary
2973
 
                        if (!$style_row[$element . '_id'])
2974
 
                        {
2975
 
                                $this->install_element($element, $error, $action, (${$element . '_root_path'}) ? ${$element . '_root_path'} : $root_path, $style_row[$element . '_id'], $style_row[$element . '_name'], (${$element . '_path'}) ? ${$element . '_path'} : $path, $style_row[$element . '_copyright']);
2976
 
                        }
2977
 
                }
2978
 
 
2979
 
                if (!$style_row['template_id'] || !$style_row['theme_id'] || !$style_row['imageset_id'])
2980
 
                {
2981
 
                        $error[] = $user->lang['STYLE_ERR_NO_IDS'];
2982
 
                }
2983
 
 
2984
 
                if (sizeof($error))
2985
 
                {
2986
 
                        return false;
2987
 
                }
2988
 
 
2989
 
                $db->sql_transaction('begin');
2990
 
 
2991
 
                $sql_ary = array(
2992
 
                        'style_name'            => $name,
2993
 
                        'style_copyright'       => $copyright,
2994
 
                        'style_active'          => (int) $active,
2995
 
                        'template_id'           => (int) $style_row['template_id'],
2996
 
                        'theme_id'                      => (int) $style_row['theme_id'],
2997
 
                        'imageset_id'           => (int) $style_row['imageset_id'],
2998
 
                );
2999
 
 
3000
 
                $sql = 'INSERT INTO ' . STYLES_TABLE . '
3001
 
                        ' . $db->sql_build_array('INSERT', $sql_ary);
3002
 
                $db->sql_query($sql);
3003
 
 
3004
 
                $id = $db->sql_nextid();
3005
 
 
3006
 
                if ($default)
3007
 
                {
3008
 
                        $sql = 'UPDATE ' . USERS_TABLE . "
3009
 
                                SET user_style = $id
3010
 
                                WHERE user_style = " . $config['default_style'];
3011
 
                        $db->sql_query($sql);
3012
 
 
3013
 
                        set_config('default_style', $id);
3014
 
                }
3015
 
 
3016
 
                $db->sql_transaction('commit');
3017
 
 
3018
 
                add_log('admin', 'LOG_STYLE_ADD', $name);
3019
 
        }
3020
 
 
3021
 
        /**
3022
 
        * Install/add an element, doing various checks as we go
3023
 
        */
3024
 
        function install_element($mode, &$error, $action, $root_path, &$id, $name, $path, $copyright, $store_db = 0)
3025
 
        {
3026
 
                global $phpbb_root_path, $db, $user;
3027
 
 
3028
 
                switch ($mode)
3029
 
                {
3030
 
                        case 'template':
3031
 
                                $sql_from = STYLES_TEMPLATE_TABLE;
3032
 
                        break;
3033
 
 
3034
 
                        case 'theme':
3035
 
                                $sql_from = STYLES_THEME_TABLE;
3036
 
                        break;
3037
 
 
3038
 
                        case 'imageset':
3039
 
                                $sql_from = STYLES_IMAGESET_TABLE;
3040
 
                        break;
3041
 
                }
3042
 
 
3043
 
                $l_type = strtoupper($mode);
3044
 
 
3045
 
                if (!$name)
3046
 
                {
3047
 
                        $error[] = $user->lang[$l_type . '_ERR_STYLE_NAME'];
3048
 
                }
3049
 
 
3050
 
                // Check length settings
3051
 
                if (utf8_strlen($name) > 30)
3052
 
                {
3053
 
                        $error[] = $user->lang[$l_type . '_ERR_NAME_LONG'];
3054
 
                }
3055
 
 
3056
 
                if (utf8_strlen($copyright) > 60)
3057
 
                {
3058
 
                        $error[] = $user->lang[$l_type . '_ERR_COPY_LONG'];
3059
 
                }
3060
 
 
3061
 
                // Check if the name already exist
3062
 
                $sql = "SELECT {$mode}_id
3063
 
                        FROM $sql_from
3064
 
                        WHERE {$mode}_name = '" . $db->sql_escape($name) . "'";
3065
 
                $result = $db->sql_query($sql);
3066
 
                $row = $db->sql_fetchrow($result);
3067
 
                $db->sql_freeresult($result);
3068
 
 
3069
 
                if ($row)
3070
 
                {
3071
 
                        // If it exist, we just use the style on installation
3072
 
                        if ($action == 'install')
3073
 
                        {
3074
 
                                $id = $row[$mode . '_id'];
3075
 
                                return false;
3076
 
                        }
3077
 
 
3078
 
                        $error[] = $user->lang[$l_type . '_ERR_NAME_EXIST'];
3079
 
                }
3080
 
 
3081
 
                if (sizeof($error))
3082
 
                {
3083
 
                        return false;
3084
 
                }
3085
 
 
3086
 
                $sql_ary = array(
3087
 
                        $mode . '_name'                 => $name,
3088
 
                        $mode . '_copyright'    => $copyright,
3089
 
                        $mode . '_path'                 => $path,
3090
 
                );
3091
 
 
3092
 
                switch ($mode)
3093
 
                {
3094
 
                        case 'template':
3095
 
                                // We check if the template author defined a different bitfield
3096
 
                                $cfg_data = parse_cfg_file("$root_path$mode/template.cfg");
3097
 
 
3098
 
                                if (!empty($cfg_data['template_bitfield']))
3099
 
                                {
3100
 
                                        $sql_ary['bbcode_bitfield'] = $cfg_data['template_bitfield'];
3101
 
                                }
3102
 
                                else
3103
 
                                {
3104
 
                                        $sql_ary['bbcode_bitfield'] = TEMPLATE_BITFIELD;
3105
 
                                }
3106
 
 
3107
 
                                // We set a pre-defined bitfield here which we may use further in 3.2
3108
 
                                $sql_ary += array(
3109
 
                                        'template_storedb'      => $store_db
3110
 
                                );
3111
 
                        break;
3112
 
 
3113
 
                        case 'theme':
3114
 
                                // We are only interested in the theme configuration for now
3115
 
                                $theme_cfg = parse_cfg_file("{$phpbb_root_path}styles/$path/theme/theme.cfg");
3116
 
 
3117
 
                                if (isset($theme_cfg['parse_css_file']) && $theme_cfg['parse_css_file'])
3118
 
                                {
3119
 
                                        $store_db = 1;
3120
 
                                }
3121
 
 
3122
 
                                $sql_ary += array(
3123
 
                                        'theme_storedb' => $store_db,
3124
 
                                        'theme_data'    => ($store_db) ? $this->db_theme_data($sql_ary, false, $root_path) : '',
3125
 
                                        'theme_mtime'   => (int) filemtime("{$phpbb_root_path}styles/$path/theme/stylesheet.css")
3126
 
                                );
3127
 
                        break;
3128
 
 
3129
 
                        // all the heavy lifting is done later
3130
 
                        case 'imageset':
3131
 
                        break;
3132
 
                }
3133
 
 
3134
 
                $db->sql_transaction('begin');
3135
 
 
3136
 
                $sql = "INSERT INTO $sql_from
3137
 
                        " . $db->sql_build_array('INSERT', $sql_ary);
3138
 
                $db->sql_query($sql);
3139
 
 
3140
 
                $id = $db->sql_nextid();
3141
 
 
3142
 
                if ($mode == 'template' && $store_db)
3143
 
                {
3144
 
                        $filelist = filelist("{$root_path}template", '', 'html');
3145
 
                        $this->store_templates('insert', $id, $path, $filelist);
3146
 
                }
3147
 
                else if ($mode == 'imageset')
3148
 
                {
3149
 
                        $cfg_data = parse_cfg_file("$root_path$mode/imageset.cfg");
3150
 
 
3151
 
                        $imageset_definitions = array();
3152
 
                        foreach ($this->imageset_keys as $topic => $key_array)
3153
 
                        {
3154
 
                                $imageset_definitions = array_merge($imageset_definitions, $key_array);
3155
 
                        }
3156
 
 
3157
 
                        foreach ($cfg_data as $key => $value)
3158
 
                        {
3159
 
                                if (strpos($value, '*') !== false)
3160
 
                                {
3161
 
                                        if (substr($value, -1, 1) === '*')
3162
 
                                        {
3163
 
                                                list($image_filename, $image_height) = explode('*', $value);
3164
 
                                                $image_width = 0;
3165
 
                                        }
3166
 
                                        else
3167
 
                                        {
3168
 
                                                list($image_filename, $image_height, $image_width) = explode('*', $value);
3169
 
                                        }
3170
 
                                }
3171
 
                                else
3172
 
                                {
3173
 
                                        $image_filename = $value;
3174
 
                                        $image_height = $image_width = 0;
3175
 
                                }
3176
 
 
3177
 
                                if (strpos($key, 'img_') === 0 && $image_filename)
3178
 
                                {
3179
 
                                        $key = substr($key, 4);
3180
 
                                        if (in_array($key, $imageset_definitions))
3181
 
                                        {
3182
 
                                                $sql_ary = array(
3183
 
                                                        'image_name'            => $key,
3184
 
                                                        'image_filename'        => str_replace('{PATH}', "styles/$path/imageset/", trim($image_filename)),
3185
 
                                                        'image_height'          => (int) $image_height,
3186
 
                                                        'image_width'           => (int) $image_width,
3187
 
                                                        'imageset_id'           => (int) $id,
3188
 
                                                        'image_lang'            => '',
3189
 
                                                );
3190
 
                                                $db->sql_query('INSERT INTO ' . STYLES_IMAGESET_DATA_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
3191
 
                                        }
3192
 
                                }
3193
 
                        }
3194
 
                        unset($cfg_data);
3195
 
 
3196
 
                        $sql = 'SELECT lang_dir
3197
 
                                FROM ' . LANG_TABLE;
3198
 
                        $result = $db->sql_query($sql);
3199
 
 
3200
 
                        while ($row = $db->sql_fetchrow($result))
3201
 
                        {
3202
 
                                if (@file_exists("$root_path$mode/{$row['lang_dir']}/imageset.cfg"))
3203
 
                                {
3204
 
                                        $cfg_data_imageset_data = parse_cfg_file("$root_path$mode/{$row['lang_dir']}/imageset.cfg");
3205
 
                                        foreach ($cfg_data_imageset_data as $image_name => $value)
3206
 
                                        {
3207
 
                                                if (strpos($value, '*') !== false)
3208
 
                                                {
3209
 
                                                        if (substr($value, -1, 1) === '*')
3210
 
                                                        {
3211
 
                                                                list($image_filename, $image_height) = explode('*', $value);
3212
 
                                                                $image_width = 0;
3213
 
                                                        }
3214
 
                                                        else
3215
 
                                                        {
3216
 
                                                                list($image_filename, $image_height, $image_width) = explode('*', $value);
3217
 
                                                        }
3218
 
                                                }
3219
 
                                                else
3220
 
                                                {
3221
 
                                                        $image_filename = $value;
3222
 
                                                        $image_height = $image_width = 0;
3223
 
                                                }
3224
 
 
3225
 
                                                if (strpos($image_name, 'img_') === 0 && $image_filename)
3226
 
                                                {
3227
 
                                                        $image_name = substr($image_name, 4);
3228
 
                                                        if (in_array($image_name, $imageset_definitions))
3229
 
                                                        {
3230
 
                                                                $sql_ary = array(
3231
 
                                                                        'image_name'            => $image_name,
3232
 
                                                                        'image_filename'        => $image_filename,
3233
 
                                                                        'image_height'          => (int) $image_height,
3234
 
                                                                        'image_width'           => (int) $image_width,
3235
 
                                                                        'imageset_id'           => (int) $id,
3236
 
                                                                        'image_lang'            => $row['lang_dir'],
3237
 
                                                                );
3238
 
                                                                $db->sql_query('INSERT INTO ' . STYLES_IMAGESET_DATA_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
3239
 
                                                        }
3240
 
                                                }
3241
 
                                        }
3242
 
                                        unset($cfg_data_imageset_data);
3243
 
                                }
3244
 
                        }
3245
 
                        $db->sql_freeresult($result);
3246
 
                }
3247
 
 
3248
 
                $db->sql_transaction('commit');
3249
 
 
3250
 
                $log = ($store_db) ? 'LOG_' . $l_type . '_ADD_DB' : 'LOG_' . $l_type . '_ADD_FS';
3251
 
                add_log('admin', $log, $name);
3252
 
 
3253
 
                // Return store_db in case it had to be altered
3254
 
                return $store_db;
3255
 
        }
3256
 
 
3257
 
}
3258
 
 
3259
 
?>
 
 
b'\\ No newline at end of file'