Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
0.00% |
0 / 553 |
|
0.00% |
0 / 2 |
CRAP | |
0.00% |
0 / 1 |
| acp_icons | |
0.00% |
0 / 551 |
|
0.00% |
0 / 2 |
38612 | |
0.00% |
0 / 1 |
| main | |
0.00% |
0 / 544 |
|
0.00% |
0 / 1 |
38220 | |||
| item_count | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
2 | |||
| 1 | <?php |
| 2 | /** |
| 3 | * |
| 4 | * This file is part of the phpBB Forum Software package. |
| 5 | * |
| 6 | * @copyright (c) phpBB Limited <https://www.phpbb.com> |
| 7 | * @license GNU General Public License, version 2 (GPL-2.0) |
| 8 | * |
| 9 | * For full copyright and license information, please see |
| 10 | * the docs/CREDITS.txt file. |
| 11 | * |
| 12 | */ |
| 13 | |
| 14 | /** |
| 15 | * @ignore |
| 16 | */ |
| 17 | if (!defined('IN_PHPBB')) |
| 18 | { |
| 19 | exit; |
| 20 | } |
| 21 | |
| 22 | /** |
| 23 | * @todo {smilies} check regular expressions for special char replacements (stored specialchared in db) |
| 24 | */ |
| 25 | class acp_icons |
| 26 | { |
| 27 | var $u_action; |
| 28 | |
| 29 | function main($id, $mode) |
| 30 | { |
| 31 | global $db, $user, $template, $cache; |
| 32 | global $config, $phpbb_root_path; |
| 33 | global $request, $phpbb_container; |
| 34 | |
| 35 | $user->add_lang('acp/posting'); |
| 36 | |
| 37 | // Set up general vars |
| 38 | $action = $request->variable('action', ''); |
| 39 | $action = (isset($_POST['add'])) ? 'add' : $action; |
| 40 | $action = (isset($_POST['edit'])) ? 'edit' : $action; |
| 41 | $action = (isset($_POST['import'])) ? 'import' : $action; |
| 42 | $icon_id = $request->variable('id', 0); |
| 43 | |
| 44 | $form_key = 'acp_icons'; |
| 45 | add_form_key($form_key); |
| 46 | |
| 47 | $mode = ($mode == 'smilies') ? 'smilies' : 'icons'; |
| 48 | |
| 49 | $this->tpl_name = 'acp_icons'; |
| 50 | |
| 51 | // What are we working on? |
| 52 | switch ($mode) |
| 53 | { |
| 54 | case 'smilies': |
| 55 | $table = SMILIES_TABLE; |
| 56 | $lang = 'SMILIES'; |
| 57 | $fields = 'smiley'; |
| 58 | $img_path = $config['smilies_path']; |
| 59 | break; |
| 60 | |
| 61 | case 'icons': |
| 62 | $table = ICONS_TABLE; |
| 63 | $lang = 'ICONS'; |
| 64 | $fields = 'icons'; |
| 65 | $img_path = $config['icons_path']; |
| 66 | break; |
| 67 | } |
| 68 | |
| 69 | $this->page_title = 'ACP_' . $lang; |
| 70 | |
| 71 | // Clear some arrays |
| 72 | $_images = $_paks = array(); |
| 73 | $notice = ''; |
| 74 | |
| 75 | // Grab file list of paks and images |
| 76 | if ($action == 'edit' || $action == 'add' || $action == 'import') |
| 77 | { |
| 78 | $imglist = filelist($phpbb_root_path . $img_path, ''); |
| 79 | |
| 80 | foreach ($imglist as $path => $img_ary) |
| 81 | { |
| 82 | if (empty($img_ary)) |
| 83 | { |
| 84 | continue; |
| 85 | } |
| 86 | |
| 87 | asort($img_ary, SORT_STRING); |
| 88 | |
| 89 | foreach ($img_ary as $img) |
| 90 | { |
| 91 | $img_size = getimagesize($phpbb_root_path . $img_path . '/' . $path . $img); |
| 92 | |
| 93 | if ($img_size) |
| 94 | { |
| 95 | if (!$img_size[0] || !$img_size[1] || strlen($img) > 255) |
| 96 | { |
| 97 | continue; |
| 98 | } |
| 99 | |
| 100 | // adjust the width and height to be lower than 128px while perserving the aspect ratio (for icons) |
| 101 | if ($mode == 'icons') |
| 102 | { |
| 103 | if ($img_size[0] > 127 && $img_size[0] > $img_size[1]) |
| 104 | { |
| 105 | $img_size[1] = (int) ($img_size[1] * (127 / $img_size[0])); |
| 106 | $img_size[0] = 127; |
| 107 | } |
| 108 | else if ($img_size[1] > 127) |
| 109 | { |
| 110 | $img_size[0] = (int) ($img_size[0] * (127 / $img_size[1])); |
| 111 | $img_size[1] = 127; |
| 112 | } |
| 113 | } |
| 114 | } |
| 115 | else |
| 116 | { |
| 117 | // getimagesize can't read the dimensions of the SVG files |
| 118 | // https://bugs.php.net/bug.php?id=71517 |
| 119 | $xml_get = simplexml_load_file($phpbb_root_path . $img_path . '/' . $path . $img); |
| 120 | |
| 121 | $svg_width = intval($xml_get['width']); |
| 122 | $svg_height = intval($xml_get['height']); |
| 123 | } |
| 124 | |
| 125 | $_images[$path . $img]['file'] = $path . $img; |
| 126 | |
| 127 | // Give SVG a fallback on failure |
| 128 | $_images[$path . $img]['width'] = $img_size ? $img_size[0] : ($svg_width ?: 32); |
| 129 | $_images[$path . $img]['height'] = $img_size ? $img_size[1] : ($svg_height ?: 32); |
| 130 | } |
| 131 | } |
| 132 | unset($imglist); |
| 133 | |
| 134 | if ($dir = @opendir($phpbb_root_path . $img_path)) |
| 135 | { |
| 136 | while (($file = readdir($dir)) !== false) |
| 137 | { |
| 138 | if (is_file($phpbb_root_path . $img_path . '/' . $file) && preg_match('#\.pak$#i', $file)) |
| 139 | { |
| 140 | $_paks[] = $file; |
| 141 | } |
| 142 | } |
| 143 | closedir($dir); |
| 144 | |
| 145 | if (!empty($_paks)) |
| 146 | { |
| 147 | asort($_paks, SORT_STRING); |
| 148 | } |
| 149 | } |
| 150 | } |
| 151 | |
| 152 | // What shall we do today? Oops, I believe that's trademarked ... |
| 153 | switch ($action) |
| 154 | { |
| 155 | case 'edit': |
| 156 | unset($_images); |
| 157 | $_images = array(); |
| 158 | |
| 159 | // no break; |
| 160 | |
| 161 | case 'add': |
| 162 | |
| 163 | $smilies = $default_row = array(); |
| 164 | $smiley_options = ''; |
| 165 | |
| 166 | if ($action == 'add' && $mode == 'smilies') |
| 167 | { |
| 168 | $sql = 'SELECT * |
| 169 | FROM ' . SMILIES_TABLE . ' |
| 170 | ORDER BY smiley_order'; |
| 171 | $result = $db->sql_query($sql); |
| 172 | |
| 173 | while ($row = $db->sql_fetchrow($result)) |
| 174 | { |
| 175 | if (empty($smilies[$row['smiley_url']])) |
| 176 | { |
| 177 | $smilies[$row['smiley_url']] = $row; |
| 178 | } |
| 179 | } |
| 180 | $db->sql_freeresult($result); |
| 181 | |
| 182 | if (count($smilies)) |
| 183 | { |
| 184 | foreach ($smilies as $row) |
| 185 | { |
| 186 | $selected = false; |
| 187 | |
| 188 | if (!$smiley_options) |
| 189 | { |
| 190 | $selected = true; |
| 191 | $default_row = $row; |
| 192 | } |
| 193 | $smiley_options .= '<option value="' . $row['smiley_url'] . '"' . (($selected) ? ' selected="selected"' : '') . '>' . $row['smiley_url'] . '</option>'; |
| 194 | |
| 195 | $template->assign_block_vars('smile', array( |
| 196 | 'SMILEY_URL' => addslashes($row['smiley_url']), |
| 197 | 'CODE' => addslashes($row['code']), |
| 198 | 'EMOTION' => addslashes($row['emotion']), |
| 199 | 'WIDTH' => $row['smiley_width'], |
| 200 | 'HEIGHT' => $row['smiley_height'], |
| 201 | 'ORDER' => $row['smiley_order'] + 1, |
| 202 | )); |
| 203 | } |
| 204 | } |
| 205 | } |
| 206 | |
| 207 | $sql = "SELECT * |
| 208 | FROM $table |
| 209 | ORDER BY {$fields}_order " . (($icon_id || $action == 'add') ? 'DESC' : 'ASC'); |
| 210 | $result = $db->sql_query($sql); |
| 211 | |
| 212 | $data = array(); |
| 213 | $after = false; |
| 214 | $order_lists = array('', ''); |
| 215 | $add_order_lists = array('', ''); |
| 216 | $display_count = 0; |
| 217 | |
| 218 | while ($row = $db->sql_fetchrow($result)) |
| 219 | { |
| 220 | if ($action == 'add') |
| 221 | { |
| 222 | unset($_images[$row[$fields . '_url']]); |
| 223 | } |
| 224 | |
| 225 | if ($row[$fields . '_id'] == $icon_id) |
| 226 | { |
| 227 | $after = true; |
| 228 | $data[$row[$fields . '_url']] = $row; |
| 229 | } |
| 230 | else |
| 231 | { |
| 232 | if ($action == 'edit' && !$icon_id) |
| 233 | { |
| 234 | $data[$row[$fields . '_url']] = $row; |
| 235 | } |
| 236 | |
| 237 | $selected = ''; |
| 238 | if (!empty($after)) |
| 239 | { |
| 240 | $selected = ' selected="selected"'; |
| 241 | $after = false; |
| 242 | } |
| 243 | if ($row['display_on_posting']) |
| 244 | { |
| 245 | $display_count++; |
| 246 | } |
| 247 | $after_txt = ($mode == 'smilies') ? $row['code'] : $row['icons_url']; |
| 248 | $order_lists[$row['display_on_posting']] = '<option value="' . ($row[$fields . '_order'] + 1) . '"' . $selected . '>' . sprintf($user->lang['AFTER_' . $lang], ' -> ' . $after_txt) . '</option>' . $order_lists[$row['display_on_posting']]; |
| 249 | |
| 250 | if (!empty($default_row)) |
| 251 | { |
| 252 | $add_order_lists[$row['display_on_posting']] = '<option value="' . ($row[$fields . '_order'] + 1) . '"' . (($row[$fields . '_id'] == $default_row['smiley_id']) ? ' selected="selected"' : '') . '>' . sprintf($user->lang['AFTER_' . $lang], ' -> ' . $after_txt) . '</option>' . $add_order_lists[$row['display_on_posting']]; |
| 253 | } |
| 254 | } |
| 255 | } |
| 256 | $db->sql_freeresult($result); |
| 257 | |
| 258 | $order_list = '<option value="1"' . ((!isset($after)) ? ' selected="selected"' : '') . '>' . $user->lang['FIRST'] . '</option>'; |
| 259 | $add_order_list = '<option value="1">' . $user->lang['FIRST'] . '</option>'; |
| 260 | |
| 261 | if ($action == 'add') |
| 262 | { |
| 263 | $data = $_images; |
| 264 | } |
| 265 | |
| 266 | $colspan = (($mode == 'smilies') ? 7 : 6); |
| 267 | $colspan += ($icon_id) ? 1 : 0; |
| 268 | $colspan += ($action == 'add') ? 2 : 0; |
| 269 | |
| 270 | $template->assign_vars(array( |
| 271 | 'S_EDIT' => true, |
| 272 | 'S_SMILIES' => ($mode == 'smilies') ? true : false, |
| 273 | 'S_ADD' => ($action == 'add') ? true : false, |
| 274 | |
| 275 | 'S_ORDER_LIST_DISPLAY' => $order_list . $order_lists[1], |
| 276 | 'S_ORDER_LIST_UNDISPLAY' => $order_list . $order_lists[0], |
| 277 | 'S_ORDER_LIST_DISPLAY_COUNT' => $display_count + 1, |
| 278 | |
| 279 | 'L_TITLE' => $user->lang['ACP_' . $lang], |
| 280 | 'L_EXPLAIN' => $user->lang['ACP_' . $lang . '_EXPLAIN'], |
| 281 | 'L_CONFIG' => $user->lang[$lang . '_CONFIG'], |
| 282 | 'L_URL' => $user->lang[$lang . '_URL'], |
| 283 | 'L_LOCATION' => $user->lang[$lang . '_LOCATION'], |
| 284 | 'L_WIDTH' => $user->lang[$lang . '_WIDTH'], |
| 285 | 'L_HEIGHT' => $user->lang[$lang . '_HEIGHT'], |
| 286 | 'L_ORDER' => $user->lang[$lang . '_ORDER'], |
| 287 | 'L_NO_ICONS' => $user->lang['NO_' . $lang . '_' . strtoupper($action)], |
| 288 | |
| 289 | 'COLSPAN' => $colspan, |
| 290 | 'ID' => $icon_id, |
| 291 | |
| 292 | 'U_BACK' => $this->u_action, |
| 293 | 'U_ACTION' => $this->u_action . '&action=' . (($action == 'add') ? 'create' : 'modify'), |
| 294 | )); |
| 295 | |
| 296 | foreach ($data as $img => $img_row) |
| 297 | { |
| 298 | $template->assign_block_vars('items', array( |
| 299 | 'IMG' => $img, |
| 300 | 'A_IMG' => addslashes($img), |
| 301 | 'IMG_SRC' => $phpbb_root_path . $img_path . '/' . $img, |
| 302 | |
| 303 | 'CODE' => ($mode == 'smilies' && isset($img_row['code'])) ? $img_row['code'] : '', |
| 304 | 'EMOTION' => ($mode == 'smilies' && isset($img_row['emotion'])) ? $img_row['emotion'] : '', |
| 305 | |
| 306 | 'S_ID' => (isset($img_row[$fields . '_id'])) ? true : false, |
| 307 | 'ID' => (isset($img_row[$fields . '_id'])) ? $img_row[$fields . '_id'] : 0, |
| 308 | 'WIDTH' => (!empty($img_row[$fields .'_width'])) ? $img_row[$fields .'_width'] : $img_row['width'], |
| 309 | 'HEIGHT' => (!empty($img_row[$fields .'_height'])) ? $img_row[$fields .'_height'] : $img_row['height'], |
| 310 | 'TEXT_ALT' => ($mode == 'icons' && !empty($img_row['icons_alt'])) ? $img_row['icons_alt'] : $img, |
| 311 | 'ALT' => ($mode == 'icons' && !empty($img_row['icons_alt'])) ? $img_row['icons_alt'] : '', |
| 312 | 'POSTING_CHECKED' => (!empty($img_row['display_on_posting']) || $action == 'add') ? ' checked="checked"' : '', |
| 313 | )); |
| 314 | } |
| 315 | |
| 316 | // Ok, another row for adding an addition code for a pre-existing image... |
| 317 | if ($action == 'add' && $mode == 'smilies' && count($smilies)) |
| 318 | { |
| 319 | $template->assign_vars(array( |
| 320 | 'S_ADD_CODE' => true, |
| 321 | |
| 322 | 'S_IMG_OPTIONS' => $smiley_options, |
| 323 | |
| 324 | 'S_ADD_ORDER_LIST_DISPLAY' => $add_order_list . $add_order_lists[1], |
| 325 | 'S_ADD_ORDER_LIST_UNDISPLAY' => $add_order_list . $add_order_lists[0], |
| 326 | |
| 327 | 'IMG_SRC' => $phpbb_root_path . $img_path . '/' . $default_row['smiley_url'], |
| 328 | 'IMG_PATH' => $img_path, |
| 329 | |
| 330 | 'CODE' => $default_row['code'], |
| 331 | 'EMOTION' => $default_row['emotion'], |
| 332 | |
| 333 | 'WIDTH' => $default_row['smiley_width'], |
| 334 | 'HEIGHT' => $default_row['smiley_height'], |
| 335 | )); |
| 336 | } |
| 337 | |
| 338 | return; |
| 339 | |
| 340 | break; |
| 341 | |
| 342 | case 'create': |
| 343 | case 'modify': |
| 344 | |
| 345 | if (!check_form_key($form_key)) |
| 346 | { |
| 347 | trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING); |
| 348 | } |
| 349 | |
| 350 | // Get items to create/modify |
| 351 | $images = (isset($_POST['image'])) ? array_keys($request->variable('image', array('' => 0))) : array(); |
| 352 | |
| 353 | // Now really get the items |
| 354 | $image_id = (isset($_POST['id'])) ? $request->variable('id', array('' => 0)) : array(); |
| 355 | $image_order = (isset($_POST['order'])) ? $request->variable('order', array('' => 0)) : array(); |
| 356 | $image_width = (isset($_POST['width'])) ? $request->variable('width', array('' => 0)) : array(); |
| 357 | $image_height = (isset($_POST['height'])) ? $request->variable('height', array('' => 0)) : array(); |
| 358 | $image_add = (isset($_POST['add_img'])) ? $request->variable('add_img', array('' => 0)) : array(); |
| 359 | $image_emotion = $request->variable('emotion', array('' => ''), true); |
| 360 | $image_code = $request->variable('code', array('' => ''), true); |
| 361 | $image_alt = ($request->is_set_post('alt')) ? $request->variable('alt', array('' => ''), true) : array(); |
| 362 | $image_display_on_posting = (isset($_POST['display_on_posting'])) ? $request->variable('display_on_posting', array('' => 0)) : array(); |
| 363 | |
| 364 | // Ok, add the relevant bits if we are adding new codes to existing emoticons... |
| 365 | if ($request->variable('add_additional_code', false, false, \phpbb\request\request_interface::POST)) |
| 366 | { |
| 367 | $add_image = $request->variable('add_image', ''); |
| 368 | $add_code = $request->variable('add_code', '', true); |
| 369 | $add_emotion = $request->variable('add_emotion', '', true); |
| 370 | |
| 371 | if ($add_image && $add_emotion && $add_code) |
| 372 | { |
| 373 | $images[] = $add_image; |
| 374 | $image_add[$add_image] = true; |
| 375 | |
| 376 | $image_code[$add_image] = $add_code; |
| 377 | $image_emotion[$add_image] = $add_emotion; |
| 378 | $image_width[$add_image] = $request->variable('add_width', 0); |
| 379 | $image_height[$add_image] = $request->variable('add_height', 0); |
| 380 | |
| 381 | if ($request->variable('add_display_on_posting', false, false, \phpbb\request\request_interface::POST)) |
| 382 | { |
| 383 | $image_display_on_posting[$add_image] = 1; |
| 384 | } |
| 385 | |
| 386 | $image_order[$add_image] = $request->variable('add_order', 0); |
| 387 | } |
| 388 | } |
| 389 | |
| 390 | if ($mode == 'smilies' && $action == 'create') |
| 391 | { |
| 392 | $smiley_count = $this->item_count($table); |
| 393 | |
| 394 | $addable_smileys_count = count($images); |
| 395 | foreach ($images as $image) |
| 396 | { |
| 397 | if (!isset($image_add[$image])) |
| 398 | { |
| 399 | --$addable_smileys_count; |
| 400 | } |
| 401 | } |
| 402 | |
| 403 | if ($smiley_count + $addable_smileys_count > SMILEY_LIMIT) |
| 404 | { |
| 405 | trigger_error($user->lang('TOO_MANY_SMILIES', SMILEY_LIMIT) . adm_back_link($this->u_action), E_USER_WARNING); |
| 406 | } |
| 407 | } |
| 408 | |
| 409 | $icons_updated = 0; |
| 410 | $errors = array(); |
| 411 | foreach ($images as $image) |
| 412 | { |
| 413 | if ($mode == 'smilies' && ($image_emotion[$image] == '' || $image_code[$image] == '')) |
| 414 | { |
| 415 | $errors[$image] = 'SMILIE_NO_' . (($image_emotion[$image] == '') ? 'EMOTION' : 'CODE'); |
| 416 | } |
| 417 | else if ($action == 'create' && !isset($image_add[$image])) |
| 418 | { |
| 419 | // skip images where add wasn't checked |
| 420 | } |
| 421 | else if (!file_exists($phpbb_root_path . $img_path . '/' . $image)) |
| 422 | { |
| 423 | $errors[$image] = 'SMILIE_NO_FILE'; |
| 424 | } |
| 425 | else |
| 426 | { |
| 427 | if ($image_width[$image] == 0 || $image_height[$image] == 0) |
| 428 | { |
| 429 | $img_size = getimagesize($phpbb_root_path . $img_path . '/' . $image); |
| 430 | $image_width[$image] = $img_size[0]; |
| 431 | $image_height[$image] = $img_size[1]; |
| 432 | } |
| 433 | |
| 434 | // Adjust image width/height for icons |
| 435 | if ($mode == 'icons') |
| 436 | { |
| 437 | if ($image_width[$image] > 127 && $image_width[$image] > $image_height[$image]) |
| 438 | { |
| 439 | $image_height[$image] = (int) ($image_height[$image] * (127 / $image_width[$image])); |
| 440 | $image_width[$image] = 127; |
| 441 | } |
| 442 | else if ($image_height[$image] > 127) |
| 443 | { |
| 444 | $image_width[$image] = (int) ($image_width[$image] * (127 / $image_height[$image])); |
| 445 | $image_height[$image] = 127; |
| 446 | } |
| 447 | } |
| 448 | |
| 449 | $img_sql = array( |
| 450 | $fields . '_url' => $image, |
| 451 | $fields . '_width' => $image_width[$image], |
| 452 | $fields . '_height' => $image_height[$image], |
| 453 | 'display_on_posting' => (isset($image_display_on_posting[$image])) ? 1 : 0, |
| 454 | ); |
| 455 | |
| 456 | if ($mode == 'smilies') |
| 457 | { |
| 458 | $img_sql = array_merge($img_sql, array( |
| 459 | 'emotion' => $image_emotion[$image], |
| 460 | 'code' => $image_code[$image]) |
| 461 | ); |
| 462 | } |
| 463 | |
| 464 | if ($mode == 'icons') |
| 465 | { |
| 466 | $img_sql = array_merge($img_sql, array( |
| 467 | 'icons_alt' => $image_alt[$image]) |
| 468 | ); |
| 469 | } |
| 470 | |
| 471 | // Image_order holds the 'new' order value |
| 472 | if (!empty($image_order[$image])) |
| 473 | { |
| 474 | $img_sql = array_merge($img_sql, array( |
| 475 | $fields . '_order' => $image_order[$image]) |
| 476 | ); |
| 477 | |
| 478 | // Since we always add 'after' an item, we just need to increase all following + the current by one |
| 479 | $sql = "UPDATE $table |
| 480 | SET {$fields}_order = {$fields}_order + 1 |
| 481 | WHERE {$fields}_order >= {$image_order[$image]}"; |
| 482 | $db->sql_query($sql); |
| 483 | |
| 484 | // If we adjust the order, we need to adjust all other orders too - they became inaccurate... |
| 485 | foreach ($image_order as $_image => $_order) |
| 486 | { |
| 487 | if ($_image == $image) |
| 488 | { |
| 489 | continue; |
| 490 | } |
| 491 | |
| 492 | if ($_order >= $image_order[$image]) |
| 493 | { |
| 494 | $image_order[$_image]++; |
| 495 | } |
| 496 | } |
| 497 | } |
| 498 | |
| 499 | if ($action == 'modify' && !empty($image_id[$image])) |
| 500 | { |
| 501 | $sql = "UPDATE $table |
| 502 | SET " . $db->sql_build_array('UPDATE', $img_sql) . " |
| 503 | WHERE {$fields}_id = " . $image_id[$image]; |
| 504 | $db->sql_query($sql); |
| 505 | $icons_updated++; |
| 506 | } |
| 507 | else if ($action !== 'modify') |
| 508 | { |
| 509 | $sql = "INSERT INTO $table " . $db->sql_build_array('INSERT', $img_sql); |
| 510 | $db->sql_query($sql); |
| 511 | $icons_updated++; |
| 512 | } |
| 513 | |
| 514 | } |
| 515 | } |
| 516 | |
| 517 | $cache->destroy('_icons'); |
| 518 | $cache->destroy('sql', $table); |
| 519 | $phpbb_container->get('text_formatter.cache')->invalidate(); |
| 520 | |
| 521 | $level = ($icons_updated) ? E_USER_NOTICE : E_USER_WARNING; |
| 522 | $errormsgs = ''; |
| 523 | foreach ($errors as $img => $error) |
| 524 | { |
| 525 | $errormsgs .= '<br />' . sprintf($user->lang[$error], $img); |
| 526 | } |
| 527 | if ($action == 'modify') |
| 528 | { |
| 529 | trigger_error($user->lang($lang . '_EDITED', $icons_updated) . $errormsgs . adm_back_link($this->u_action), $level); |
| 530 | } |
| 531 | else |
| 532 | { |
| 533 | trigger_error($user->lang($lang . '_ADDED', $icons_updated) . $errormsgs . adm_back_link($this->u_action), $level); |
| 534 | } |
| 535 | |
| 536 | break; |
| 537 | |
| 538 | case 'import': |
| 539 | |
| 540 | $pak = $request->variable('pak', ''); |
| 541 | $current = $request->variable('current', ''); |
| 542 | |
| 543 | if ($pak != '') |
| 544 | { |
| 545 | $order = 0; |
| 546 | |
| 547 | if (!check_form_key($form_key)) |
| 548 | { |
| 549 | trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING); |
| 550 | } |
| 551 | |
| 552 | if (!($pak_ary = @file($phpbb_root_path . $img_path . '/' . utf8_basename($pak)))) |
| 553 | { |
| 554 | trigger_error($user->lang['PAK_FILE_NOT_READABLE'] . adm_back_link($this->u_action), E_USER_WARNING); |
| 555 | } |
| 556 | |
| 557 | // Make sure the pak_ary is valid |
| 558 | foreach ($pak_ary as $pak_entry) |
| 559 | { |
| 560 | if (preg_match_all("#'(.*?)', ?#", $pak_entry, $data)) |
| 561 | { |
| 562 | if ((count($data[1]) != 4 && $mode == 'icons') || |
| 563 | ((count($data[1]) != 6 || (empty($data[1][4]) || empty($data[1][5]))) && $mode == 'smilies' )) |
| 564 | { |
| 565 | trigger_error($user->lang['WRONG_PAK_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING); |
| 566 | } |
| 567 | } |
| 568 | else |
| 569 | { |
| 570 | trigger_error($user->lang['WRONG_PAK_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING); |
| 571 | } |
| 572 | } |
| 573 | |
| 574 | // The user has already selected a smilies_pak file |
| 575 | if ($current == 'delete') |
| 576 | { |
| 577 | $db_tools = $phpbb_container->get('dbal.tools'); |
| 578 | $db_tools->sql_truncate_table($table); |
| 579 | |
| 580 | switch ($mode) |
| 581 | { |
| 582 | case 'smilies': |
| 583 | break; |
| 584 | |
| 585 | case 'icons': |
| 586 | // Reset all icon_ids |
| 587 | $db->sql_query('UPDATE ' . TOPICS_TABLE . ' SET icon_id = 0'); |
| 588 | $db->sql_query('UPDATE ' . POSTS_TABLE . ' SET icon_id = 0'); |
| 589 | break; |
| 590 | } |
| 591 | } |
| 592 | else |
| 593 | { |
| 594 | $cur_img = array(); |
| 595 | |
| 596 | $field_sql = ($mode == 'smilies') ? 'code' : 'icons_url'; |
| 597 | |
| 598 | $sql = "SELECT $field_sql |
| 599 | FROM $table"; |
| 600 | $result = $db->sql_query($sql); |
| 601 | |
| 602 | while ($row = $db->sql_fetchrow($result)) |
| 603 | { |
| 604 | ++$order; |
| 605 | $cur_img[$row[$field_sql]] = 1; |
| 606 | } |
| 607 | $db->sql_freeresult($result); |
| 608 | } |
| 609 | |
| 610 | if ($mode == 'smilies') |
| 611 | { |
| 612 | $smiley_count = $this->item_count($table); |
| 613 | if ($smiley_count + count($pak_ary) > SMILEY_LIMIT) |
| 614 | { |
| 615 | trigger_error($user->lang('TOO_MANY_SMILIES', SMILEY_LIMIT) . adm_back_link($this->u_action), E_USER_WARNING); |
| 616 | } |
| 617 | } |
| 618 | |
| 619 | foreach ($pak_ary as $pak_entry) |
| 620 | { |
| 621 | $data = array(); |
| 622 | if (preg_match_all("#'(.*?)', ?#", $pak_entry, $data)) |
| 623 | { |
| 624 | if ((count($data[1]) != 4 && $mode == 'icons') || |
| 625 | (count($data[1]) != 6 && $mode == 'smilies')) |
| 626 | { |
| 627 | trigger_error($user->lang['WRONG_PAK_TYPE'] . adm_back_link($this->u_action), E_USER_WARNING); |
| 628 | } |
| 629 | |
| 630 | // Stripslash here because it got addslashed before... (on export) |
| 631 | $img = stripslashes($data[1][0]); |
| 632 | $width = stripslashes($data[1][1]); |
| 633 | $height = stripslashes($data[1][2]); |
| 634 | $display_on_posting = stripslashes($data[1][3]); |
| 635 | |
| 636 | if (isset($data[1][4]) && isset($data[1][5])) |
| 637 | { |
| 638 | $emotion = stripslashes($data[1][4]); |
| 639 | $code = stripslashes($data[1][5]); |
| 640 | } |
| 641 | |
| 642 | if ($current == 'replace' && |
| 643 | (($mode == 'smilies' && !empty($cur_img[$code])) || |
| 644 | ($mode == 'icons' && !empty($cur_img[$img])))) |
| 645 | { |
| 646 | $replace_sql = ($mode == 'smilies') ? $code : $img; |
| 647 | $sql = array( |
| 648 | $fields . '_url' => utf8_substr(rawurlencode($img), 0, 50), |
| 649 | $fields . '_height' => (int) $height, |
| 650 | $fields . '_width' => (int) $width, |
| 651 | 'display_on_posting' => (int) $display_on_posting, |
| 652 | ); |
| 653 | |
| 654 | if ($mode == 'smilies') |
| 655 | { |
| 656 | $sql = array_merge($sql, array( |
| 657 | 'emotion' => $emotion, |
| 658 | )); |
| 659 | } |
| 660 | |
| 661 | $sql = "UPDATE $table SET " . $db->sql_build_array('UPDATE', $sql) . " |
| 662 | WHERE $field_sql = '" . $db->sql_escape($replace_sql) . "'"; |
| 663 | $db->sql_query($sql); |
| 664 | } |
| 665 | else |
| 666 | { |
| 667 | ++$order; |
| 668 | |
| 669 | $sql = array( |
| 670 | $fields . '_url' => utf8_substr(rawurlencode($img), 0, 50), |
| 671 | $fields . '_height' => (int) $height, |
| 672 | $fields . '_width' => (int) $width, |
| 673 | $fields . '_order' => (int) $order, |
| 674 | 'display_on_posting'=> (int) $display_on_posting, |
| 675 | ); |
| 676 | |
| 677 | if ($mode == 'smilies') |
| 678 | { |
| 679 | $sql = array_merge($sql, array( |
| 680 | 'code' => $code, |
| 681 | 'emotion' => $emotion, |
| 682 | )); |
| 683 | } |
| 684 | $db->sql_query("INSERT INTO $table " . $db->sql_build_array('INSERT', $sql)); |
| 685 | } |
| 686 | } |
| 687 | } |
| 688 | |
| 689 | $cache->destroy('_icons'); |
| 690 | $cache->destroy('sql', $table); |
| 691 | $phpbb_container->get('text_formatter.cache')->invalidate(); |
| 692 | |
| 693 | trigger_error($user->lang[$lang . '_IMPORT_SUCCESS'] . adm_back_link($this->u_action)); |
| 694 | } |
| 695 | else |
| 696 | { |
| 697 | $pak_options = ''; |
| 698 | |
| 699 | foreach ($_paks as $pak) |
| 700 | { |
| 701 | $pak_options .= '<option value="' . $pak . '">' . htmlspecialchars($pak, ENT_COMPAT) . '</option>'; |
| 702 | } |
| 703 | |
| 704 | $template->assign_vars(array( |
| 705 | 'S_CHOOSE_PAK' => true, |
| 706 | 'S_PAK_OPTIONS' => $pak_options, |
| 707 | |
| 708 | 'L_TITLE' => $user->lang['ACP_' . $lang], |
| 709 | 'L_EXPLAIN' => $user->lang['ACP_' . $lang . '_EXPLAIN'], |
| 710 | 'L_NO_PAK_OPTIONS' => $user->lang['NO_' . $lang . '_PAK'], |
| 711 | 'L_CURRENT' => $user->lang['CURRENT_' . $lang], |
| 712 | 'L_CURRENT_EXPLAIN' => $user->lang['CURRENT_' . $lang . '_EXPLAIN'], |
| 713 | 'L_IMPORT_SUBMIT' => $user->lang['IMPORT_' . $lang], |
| 714 | |
| 715 | 'U_BACK' => $this->u_action, |
| 716 | 'U_ACTION' => $this->u_action . '&action=import', |
| 717 | ) |
| 718 | ); |
| 719 | } |
| 720 | break; |
| 721 | |
| 722 | case 'export': |
| 723 | |
| 724 | $this->page_title = 'EXPORT_' . $lang; |
| 725 | $this->tpl_name = 'message_body'; |
| 726 | |
| 727 | $template->assign_vars(array( |
| 728 | 'MESSAGE_TITLE' => $user->lang['EXPORT_' . $lang], |
| 729 | 'MESSAGE_TEXT' => sprintf($user->lang['EXPORT_' . $lang . '_EXPLAIN'], '<a href="' . $this->u_action . '&action=send&hash=' . generate_link_hash('acp_icons') . '">', '</a>'), |
| 730 | |
| 731 | 'S_USER_NOTICE' => true, |
| 732 | ) |
| 733 | ); |
| 734 | |
| 735 | return; |
| 736 | |
| 737 | break; |
| 738 | |
| 739 | case 'send': |
| 740 | |
| 741 | if (!check_link_hash($request->variable('hash', ''), 'acp_icons')) |
| 742 | { |
| 743 | trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING); |
| 744 | } |
| 745 | |
| 746 | $sql = "SELECT * |
| 747 | FROM $table |
| 748 | ORDER BY {$fields}_order"; |
| 749 | $result = $db->sql_query($sql); |
| 750 | |
| 751 | $pak = ''; |
| 752 | while ($row = $db->sql_fetchrow($result)) |
| 753 | { |
| 754 | $pak .= "'" . addslashes($row[$fields . '_url']) . "', "; |
| 755 | $pak .= "'" . addslashes($row[$fields . '_width']) . "', "; |
| 756 | $pak .= "'" . addslashes($row[$fields . '_height']) . "', "; |
| 757 | $pak .= "'" . addslashes($row['display_on_posting']) . "', "; |
| 758 | |
| 759 | if ($mode == 'smilies') |
| 760 | { |
| 761 | $pak .= "'" . addslashes($row['emotion']) . "', "; |
| 762 | $pak .= "'" . addslashes($row['code']) . "', "; |
| 763 | } |
| 764 | |
| 765 | $pak .= "\n"; |
| 766 | } |
| 767 | $db->sql_freeresult($result); |
| 768 | |
| 769 | if ($pak != '') |
| 770 | { |
| 771 | garbage_collection(); |
| 772 | |
| 773 | header('Cache-Control: public'); |
| 774 | |
| 775 | // Send out the Headers |
| 776 | header('Content-Type: text/x-delimtext; name="' . $mode . '.pak"'); |
| 777 | header('Content-Disposition: inline; filename="' . $mode . '.pak"'); |
| 778 | echo $pak; |
| 779 | |
| 780 | flush(); |
| 781 | exit; |
| 782 | } |
| 783 | else |
| 784 | { |
| 785 | trigger_error($user->lang['NO_' . strtoupper($fields) . '_EXPORT'] . adm_back_link($this->u_action), E_USER_WARNING); |
| 786 | } |
| 787 | |
| 788 | break; |
| 789 | |
| 790 | case 'delete': |
| 791 | |
| 792 | if (confirm_box(true)) |
| 793 | { |
| 794 | $sql = "DELETE FROM $table |
| 795 | WHERE {$fields}_id = $icon_id"; |
| 796 | $db->sql_query($sql); |
| 797 | |
| 798 | switch ($mode) |
| 799 | { |
| 800 | case 'smilies': |
| 801 | break; |
| 802 | |
| 803 | case 'icons': |
| 804 | // Reset appropriate icon_ids |
| 805 | $db->sql_query('UPDATE ' . TOPICS_TABLE . " |
| 806 | SET icon_id = 0 |
| 807 | WHERE icon_id = $icon_id"); |
| 808 | |
| 809 | $db->sql_query('UPDATE ' . POSTS_TABLE . " |
| 810 | SET icon_id = 0 |
| 811 | WHERE icon_id = $icon_id"); |
| 812 | break; |
| 813 | } |
| 814 | |
| 815 | $notice = $user->lang[$lang . '_DELETED']; |
| 816 | |
| 817 | $cache->destroy('_icons'); |
| 818 | $cache->destroy('sql', $table); |
| 819 | $phpbb_container->get('text_formatter.cache')->invalidate(); |
| 820 | |
| 821 | if ($request->is_ajax()) |
| 822 | { |
| 823 | $json_response = new \phpbb\json_response; |
| 824 | $json_response->send(array( |
| 825 | 'MESSAGE_TITLE' => $user->lang['INFORMATION'], |
| 826 | 'MESSAGE_TEXT' => $notice, |
| 827 | 'REFRESH_DATA' => array( |
| 828 | 'time' => 3 |
| 829 | ) |
| 830 | )); |
| 831 | } |
| 832 | } |
| 833 | else |
| 834 | { |
| 835 | confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array( |
| 836 | 'i' => $id, |
| 837 | 'mode' => $mode, |
| 838 | 'id' => $icon_id, |
| 839 | 'action' => 'delete', |
| 840 | ))); |
| 841 | } |
| 842 | |
| 843 | break; |
| 844 | |
| 845 | case 'move_up': |
| 846 | case 'move_down': |
| 847 | |
| 848 | if (!check_link_hash($request->variable('hash', ''), 'acp_icons')) |
| 849 | { |
| 850 | trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING); |
| 851 | } |
| 852 | |
| 853 | // Get current order id... |
| 854 | $sql = "SELECT {$fields}_order as current_order |
| 855 | FROM $table |
| 856 | WHERE {$fields}_id = $icon_id"; |
| 857 | $result = $db->sql_query($sql); |
| 858 | $current_order = (int) $db->sql_fetchfield('current_order'); |
| 859 | $db->sql_freeresult($result); |
| 860 | |
| 861 | if ($current_order == 0 && $action == 'move_up') |
| 862 | { |
| 863 | break; |
| 864 | } |
| 865 | |
| 866 | // on move_down, switch position with next order_id... |
| 867 | // on move_up, switch position with previous order_id... |
| 868 | $switch_order_id = ($action == 'move_down') ? $current_order + 1 : $current_order - 1; |
| 869 | |
| 870 | // |
| 871 | $sql = "UPDATE $table |
| 872 | SET {$fields}_order = $current_order |
| 873 | WHERE {$fields}_order = $switch_order_id |
| 874 | AND {$fields}_id <> $icon_id"; |
| 875 | $db->sql_query($sql); |
| 876 | $move_executed = (bool) $db->sql_affectedrows(); |
| 877 | |
| 878 | // Only update the other entry too if the previous entry got updated |
| 879 | if ($move_executed) |
| 880 | { |
| 881 | $sql = "UPDATE $table |
| 882 | SET {$fields}_order = $switch_order_id |
| 883 | WHERE {$fields}_order = $current_order |
| 884 | AND {$fields}_id = $icon_id"; |
| 885 | $db->sql_query($sql); |
| 886 | } |
| 887 | |
| 888 | $cache->destroy('_icons'); |
| 889 | $cache->destroy('sql', $table); |
| 890 | $phpbb_container->get('text_formatter.cache')->invalidate(); |
| 891 | |
| 892 | if ($request->is_ajax()) |
| 893 | { |
| 894 | $json_response = new \phpbb\json_response; |
| 895 | $json_response->send(array( |
| 896 | 'success' => $move_executed, |
| 897 | )); |
| 898 | } |
| 899 | |
| 900 | break; |
| 901 | } |
| 902 | |
| 903 | // By default, check that image_order is valid and fix it if necessary |
| 904 | $sql = "SELECT {$fields}_id AS order_id, {$fields}_order AS fields_order |
| 905 | FROM $table |
| 906 | ORDER BY display_on_posting DESC, {$fields}_order"; |
| 907 | $result = $db->sql_query($sql); |
| 908 | |
| 909 | if ($row = $db->sql_fetchrow($result)) |
| 910 | { |
| 911 | $order = 0; |
| 912 | do |
| 913 | { |
| 914 | ++$order; |
| 915 | if ($row['fields_order'] != $order) |
| 916 | { |
| 917 | $db->sql_query("UPDATE $table |
| 918 | SET {$fields}_order = $order |
| 919 | WHERE {$fields}_id = " . $row['order_id']); |
| 920 | } |
| 921 | } |
| 922 | while ($row = $db->sql_fetchrow($result)); |
| 923 | } |
| 924 | $db->sql_freeresult($result); |
| 925 | |
| 926 | $template->assign_vars(array( |
| 927 | 'L_TITLE' => $user->lang['ACP_' . $lang], |
| 928 | 'L_EXPLAIN' => $user->lang['ACP_' . $lang . '_EXPLAIN'], |
| 929 | 'L_IMPORT' => $user->lang['IMPORT_' . $lang], |
| 930 | 'L_EXPORT' => $user->lang['EXPORT_' . $lang], |
| 931 | 'L_NOT_DISPLAYED' => $user->lang[$lang . '_NOT_DISPLAYED'], |
| 932 | 'L_ICON_ADD' => $user->lang['ADD_' . $lang], |
| 933 | 'L_ICON_EDIT' => $user->lang['EDIT_' . $lang], |
| 934 | |
| 935 | 'NOTICE' => $notice, |
| 936 | 'COLSPAN' => ($mode == 'smilies') ? 5 : 3, |
| 937 | |
| 938 | 'S_SMILIES' => ($mode == 'smilies') ? true : false, |
| 939 | |
| 940 | 'U_ACTION' => $this->u_action, |
| 941 | 'U_IMPORT' => $this->u_action . '&action=import', |
| 942 | 'U_EXPORT' => $this->u_action . '&action=export', |
| 943 | ) |
| 944 | ); |
| 945 | |
| 946 | /* @var $pagination \phpbb\pagination */ |
| 947 | $pagination = $phpbb_container->get('pagination'); |
| 948 | $pagination_start = $request->variable('start', 0); |
| 949 | $spacer = false; |
| 950 | |
| 951 | $item_count = $this->item_count($table); |
| 952 | |
| 953 | $sql = "SELECT * |
| 954 | FROM $table |
| 955 | ORDER BY {$fields}_order ASC"; |
| 956 | $result = $db->sql_query_limit($sql, $config['smilies_per_page'], $pagination_start); |
| 957 | |
| 958 | while ($row = $db->sql_fetchrow($result)) |
| 959 | { |
| 960 | $alt_text = ($mode == 'smilies') ? $row['code'] : (($mode == 'icons' && !empty($row['icons_alt'])) ? $row['icons_alt'] : $row['icons_url']); |
| 961 | |
| 962 | $template->assign_block_vars('items', array( |
| 963 | 'S_SPACER' => (!$spacer && !$row['display_on_posting']) ? true : false, |
| 964 | 'ALT_TEXT' => $alt_text, |
| 965 | 'IMG_SRC' => $phpbb_root_path . $img_path . '/' . $row[$fields . '_url'], |
| 966 | 'WIDTH' => $row[$fields . '_width'], |
| 967 | 'HEIGHT' => $row[$fields . '_height'], |
| 968 | 'CODE' => (isset($row['code'])) ? $row['code'] : '', |
| 969 | 'EMOTION' => (isset($row['emotion'])) ? $row['emotion'] : '', |
| 970 | 'U_EDIT' => $this->u_action . '&action=edit&id=' . $row[$fields . '_id'], |
| 971 | 'U_DELETE' => $this->u_action . '&action=delete&id=' . $row[$fields . '_id'], |
| 972 | 'U_MOVE_UP' => $this->u_action . '&action=move_up&id=' . $row[$fields . '_id'] . '&start=' . $pagination_start . '&hash=' . generate_link_hash('acp_icons'), |
| 973 | 'U_MOVE_DOWN' => $this->u_action . '&action=move_down&id=' . $row[$fields . '_id'] . '&start=' . $pagination_start . '&hash=' . generate_link_hash('acp_icons'), |
| 974 | )); |
| 975 | |
| 976 | if (!$spacer && !$row['display_on_posting']) |
| 977 | { |
| 978 | $spacer = true; |
| 979 | } |
| 980 | } |
| 981 | $db->sql_freeresult($result); |
| 982 | |
| 983 | $pagination->generate_template_pagination($this->u_action, 'pagination', 'start', $item_count, $config['smilies_per_page'], $pagination_start); |
| 984 | } |
| 985 | |
| 986 | /** |
| 987 | * Returns the count of smilies or icons in the database |
| 988 | * |
| 989 | * @param string $table The table of items to count. |
| 990 | * @return int number of items |
| 991 | */ |
| 992 | /* private */ function item_count($table) |
| 993 | { |
| 994 | global $db; |
| 995 | |
| 996 | $sql = "SELECT COUNT(*) AS item_count |
| 997 | FROM $table"; |
| 998 | $result = $db->sql_query($sql); |
| 999 | $item_count = (int) $db->sql_fetchfield('item_count'); |
| 1000 | $db->sql_freeresult($result); |
| 1001 | |
| 1002 | return $item_count; |
| 1003 | } |
| 1004 | } |