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

« back to all changes in this revision

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

  • Committer: William Grant
  • Date: 2009-02-23 23:47:02 UTC
  • mfrom: (1099.1.211 new-dispatch)
  • Revision ID: grantw@unimelb.edu.au-20090223234702-db4b1llly46ignwo
Merge from lp:~ivle-dev/ivle/new-dispatch.

Pretty much everything changes. Reread the setup docs. Backup your databases.
Every file is now in a different installed location, the configuration system
is rewritten, the dispatch system is rewritten, URLs are different, the
database is different, worksheets and exercises are no longer on the
filesystem, we use a templating engine, jail service protocols are rewritten,
we don't repeat ourselves, we have authorization rewritten, phpBB is gone,
and probably lots of other things that I cannot remember.

This is certainly the biggest commit I have ever made, and hopefully
the largest I ever will.

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'