Chris@76: 'AddSmiley', Chris@76: 'editicon' => 'EditMessageIcons', Chris@76: 'editicons' => 'EditMessageIcons', Chris@76: 'editsets' => 'EditSmileySets', Chris@76: 'editsmileys' => 'EditSmileys', Chris@76: 'import' => 'EditSmileySets', Chris@76: 'modifyset' => 'EditSmileySets', Chris@76: 'modifysmiley' => 'EditSmileys', Chris@76: 'setorder' => 'EditSmileyOrder', Chris@76: 'settings' => 'EditSmileySettings', Chris@76: 'install' => 'InstallSmileySet' Chris@76: ); Chris@76: Chris@76: // Default the sub-action to 'edit smiley settings'. Chris@76: $_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'editsets'; Chris@76: Chris@76: $context['page_title'] = $txt['smileys_manage']; Chris@76: $context['sub_action'] = $_REQUEST['sa']; Chris@76: $context['sub_template'] = $context['sub_action']; Chris@76: Chris@76: // Load up all the tabs... Chris@76: $context[$context['admin_menu_name']]['tab_data'] = array( Chris@76: 'title' => $txt['smileys_manage'], Chris@76: 'help' => 'smileys', Chris@76: 'description' => $txt['smiley_settings_explain'], Chris@76: 'tabs' => array( Chris@76: 'editsets' => array( Chris@76: 'description' => $txt['smiley_editsets_explain'], Chris@76: ), Chris@76: 'addsmiley' => array( Chris@76: 'description' => $txt['smiley_addsmiley_explain'], Chris@76: ), Chris@76: 'editsmileys' => array( Chris@76: 'description' => $txt['smiley_editsmileys_explain'], Chris@76: ), Chris@76: 'setorder' => array( Chris@76: 'description' => $txt['smiley_setorder_explain'], Chris@76: ), Chris@76: 'editicons' => array( Chris@76: 'description' => $txt['icons_edit_icons_explain'], Chris@76: ), Chris@76: 'settings' => array( Chris@76: 'description' => $txt['smiley_settings_explain'], Chris@76: ), Chris@76: ), Chris@76: ); Chris@76: Chris@76: // Some settings may not be enabled, disallow these from the tabs as appropriate. Chris@76: if (empty($modSettings['messageIcons_enable'])) Chris@76: $context[$context['admin_menu_name']]['tab_data']['tabs']['editicons']['disabled'] = true; Chris@76: if (empty($modSettings['smiley_enable'])) Chris@76: { Chris@76: $context[$context['admin_menu_name']]['tab_data']['tabs']['addsmiley']['disabled'] = true; Chris@76: $context[$context['admin_menu_name']]['tab_data']['tabs']['editsmileys']['disabled'] = true; Chris@76: $context[$context['admin_menu_name']]['tab_data']['tabs']['setorder']['disabled'] = true; Chris@76: } Chris@76: Chris@76: // Call the right function for this sub-acton. Chris@76: $subActions[$_REQUEST['sa']](); Chris@76: } Chris@76: Chris@76: function EditSmileySettings($return_config = false) Chris@76: { Chris@76: global $modSettings, $context, $settings, $txt, $boarddir, $sourcedir, $scripturl; Chris@76: Chris@76: // The directories... Chris@76: $context['smileys_dir'] = empty($modSettings['smileys_dir']) ? $boarddir . '/Smileys' : $modSettings['smileys_dir']; Chris@76: $context['smileys_dir_found'] = is_dir($context['smileys_dir']); Chris@76: Chris@76: // Get the names of the smiley sets. Chris@76: $smiley_sets = explode(',', $modSettings['smiley_sets_known']); Chris@76: $set_names = explode("\n", $modSettings['smiley_sets_names']); Chris@76: Chris@76: $smiley_context = array(); Chris@76: foreach ($smiley_sets as $i => $set) Chris@76: $smiley_context[$set] = $set_names[$i]; Chris@76: Chris@76: // All the settings for the page... Chris@76: $config_vars = array( Chris@76: array('title', 'settings'), Chris@76: // Inline permissions. Chris@76: array('permissions', 'manage_smileys'), Chris@76: '', Chris@76: array('select', 'smiley_sets_default', $smiley_context), Chris@76: array('check', 'smiley_sets_enable'), Chris@76: array('check', 'smiley_enable', 'subtext' => $txt['smileys_enable_note']), Chris@76: array('text', 'smileys_url'), Chris@76: array('text', 'smileys_dir', 'invalid' => !$context['smileys_dir_found']), Chris@76: '', Chris@76: // Message icons. Chris@76: array('check', 'messageIcons_enable', 'subtext' => $txt['setting_messageIcons_enable_note']), Chris@76: ); Chris@76: Chris@76: if ($return_config) Chris@76: return $config_vars; Chris@76: Chris@76: // Setup the basics of the settings template. Chris@76: require_once($sourcedir . '/ManageServer.php'); Chris@76: $context['sub_template'] = 'show_settings'; Chris@76: Chris@76: // Finish up the form... Chris@76: $context['post_url'] = $scripturl . '?action=admin;area=smileys;save;sa=settings'; Chris@76: $context['permissions_excluded'] = array(-1); Chris@76: Chris@76: // Saving the settings? Chris@76: if (isset($_GET['save'])) Chris@76: { Chris@76: checkSession(); Chris@76: Chris@76: // Validate the smiley set name. Chris@76: $_POST['smiley_sets_default'] = empty($smiley_context[$_POST['smiley_sets_default']]) ? 'default' : $_POST['smiley_sets_default']; Chris@76: Chris@76: // Make sure that the smileys are in the right order after enabling them. Chris@76: if (isset($_POST['smiley_enable'])) Chris@76: sortSmileyTable(); Chris@76: Chris@76: saveDBSettings($config_vars); Chris@76: Chris@76: cache_put_data('parsing_smileys', null, 480); Chris@76: cache_put_data('posting_smileys', null, 480); Chris@76: Chris@76: redirectexit('action=admin;area=smileys;sa=settings'); Chris@76: } Chris@76: Chris@76: prepareDBSettingContext($config_vars); Chris@76: } Chris@76: Chris@76: function EditSmileySets() Chris@76: { Chris@76: global $modSettings, $context, $settings, $txt, $boarddir; Chris@76: global $smcFunc, $scripturl, $sourcedir; Chris@76: Chris@76: // Set the right tab to be selected. Chris@76: $context[$context['admin_menu_name']]['current_subsection'] = 'editsets'; Chris@76: Chris@76: // They must've been submitted a form. Chris@76: if (isset($_POST[$context['session_var']])) Chris@76: { Chris@76: checkSession(); Chris@76: Chris@76: // Delete selected smiley sets. Chris@76: if (!empty($_POST['delete']) && !empty($_POST['smiley_set'])) Chris@76: { Chris@76: $set_paths = explode(',', $modSettings['smiley_sets_known']); Chris@76: $set_names = explode("\n", $modSettings['smiley_sets_names']); Chris@76: foreach ($_POST['smiley_set'] as $id => $val) Chris@76: if (isset($set_paths[$id], $set_names[$id]) && !empty($id)) Chris@76: unset($set_paths[$id], $set_names[$id]); Chris@76: Chris@76: updateSettings(array( Chris@76: 'smiley_sets_known' => implode(',', $set_paths), Chris@76: 'smiley_sets_names' => implode("\n", $set_names), Chris@76: 'smiley_sets_default' => in_array($modSettings['smiley_sets_default'], $set_paths) ? $modSettings['smiley_sets_default'] : $set_paths[0], Chris@76: )); Chris@76: Chris@76: cache_put_data('parsing_smileys', null, 480); Chris@76: cache_put_data('posting_smileys', null, 480); Chris@76: } Chris@76: // Add a new smiley set. Chris@76: elseif (!empty($_POST['add'])) Chris@76: $context['sub_action'] = 'modifyset'; Chris@76: // Create or modify a smiley set. Chris@76: elseif (isset($_POST['set'])) Chris@76: { Chris@76: $set_paths = explode(',', $modSettings['smiley_sets_known']); Chris@76: $set_names = explode("\n", $modSettings['smiley_sets_names']); Chris@76: Chris@76: // Create a new smiley set. Chris@76: if ($_POST['set'] == -1 && isset($_POST['smiley_sets_path'])) Chris@76: { Chris@76: if (in_array($_POST['smiley_sets_path'], $set_paths)) Chris@76: fatal_lang_error('smiley_set_already_exists'); Chris@76: Chris@76: updateSettings(array( Chris@76: 'smiley_sets_known' => $modSettings['smiley_sets_known'] . ',' . $_POST['smiley_sets_path'], Chris@76: 'smiley_sets_names' => $modSettings['smiley_sets_names'] . "\n" . $_POST['smiley_sets_name'], Chris@76: 'smiley_sets_default' => empty($_POST['smiley_sets_default']) ? $modSettings['smiley_sets_default'] : $_POST['smiley_sets_path'], Chris@76: )); Chris@76: } Chris@76: // Modify an existing smiley set. Chris@76: else Chris@76: { Chris@76: // Make sure the smiley set exists. Chris@76: if (!isset($set_paths[$_POST['set']]) || !isset($set_names[$_POST['set']])) Chris@76: fatal_lang_error('smiley_set_not_found'); Chris@76: Chris@76: // Make sure the path is not yet used by another smileyset. Chris@76: if (in_array($_POST['smiley_sets_path'], $set_paths) && $_POST['smiley_sets_path'] != $set_paths[$_POST['set']]) Chris@76: fatal_lang_error('smiley_set_path_already_used'); Chris@76: Chris@76: $set_paths[$_POST['set']] = $_POST['smiley_sets_path']; Chris@76: $set_names[$_POST['set']] = $_POST['smiley_sets_name']; Chris@76: updateSettings(array( Chris@76: 'smiley_sets_known' => implode(',', $set_paths), Chris@76: 'smiley_sets_names' => implode("\n", $set_names), Chris@76: 'smiley_sets_default' => empty($_POST['smiley_sets_default']) ? $modSettings['smiley_sets_default'] : $_POST['smiley_sets_path'] Chris@76: )); Chris@76: } Chris@76: Chris@76: // The user might have checked to also import smileys. Chris@76: if (!empty($_POST['smiley_sets_import'])) Chris@76: ImportSmileys($_POST['smiley_sets_path']); Chris@76: Chris@76: cache_put_data('parsing_smileys', null, 480); Chris@76: cache_put_data('posting_smileys', null, 480); Chris@76: } Chris@76: } Chris@76: Chris@76: // Load all available smileysets... Chris@76: $context['smiley_sets'] = explode(',', $modSettings['smiley_sets_known']); Chris@76: $set_names = explode("\n", $modSettings['smiley_sets_names']); Chris@76: foreach ($context['smiley_sets'] as $i => $set) Chris@76: $context['smiley_sets'][$i] = array( Chris@76: 'id' => $i, Chris@76: 'path' => htmlspecialchars($set), Chris@76: 'name' => htmlspecialchars($set_names[$i]), Chris@76: 'selected' => $set == $modSettings['smiley_sets_default'] Chris@76: ); Chris@76: Chris@76: // Importing any smileys from an existing set? Chris@76: if ($context['sub_action'] == 'import') Chris@76: { Chris@76: checkSession('get'); Chris@76: $_GET['set'] = (int) $_GET['set']; Chris@76: Chris@76: // Sanity check - then import. Chris@76: if (isset($context['smiley_sets'][$_GET['set']])) Chris@76: ImportSmileys(un_htmlspecialchars($context['smiley_sets'][$_GET['set']]['path'])); Chris@76: Chris@76: // Force the process to continue. Chris@76: $context['sub_action'] = 'modifyset'; Chris@76: $context['sub_template'] = 'modifyset'; Chris@76: } Chris@76: // If we're modifying or adding a smileyset, some context info needs to be set. Chris@76: if ($context['sub_action'] == 'modifyset') Chris@76: { Chris@76: $_GET['set'] = !isset($_GET['set']) ? -1 : (int) $_GET['set']; Chris@76: if ($_GET['set'] == -1 || !isset($context['smiley_sets'][$_GET['set']])) Chris@76: $context['current_set'] = array( Chris@76: 'id' => '-1', Chris@76: 'path' => '', Chris@76: 'name' => '', Chris@76: 'selected' => false, Chris@76: 'is_new' => true, Chris@76: ); Chris@76: else Chris@76: { Chris@76: $context['current_set'] = &$context['smiley_sets'][$_GET['set']]; Chris@76: $context['current_set']['is_new'] = false; Chris@76: Chris@76: // Calculate whether there are any smileys in the directory that can be imported. Chris@76: if (!empty($modSettings['smiley_enable']) && !empty($modSettings['smileys_dir']) && is_dir($modSettings['smileys_dir'] . '/' . $context['current_set']['path'])) Chris@76: { Chris@76: $smileys = array(); Chris@76: $dir = dir($modSettings['smileys_dir'] . '/' . $context['current_set']['path']); Chris@76: while ($entry = $dir->read()) Chris@76: { Chris@76: if (in_array(strrchr($entry, '.'), array('.jpg', '.gif', '.jpeg', '.png'))) Chris@76: $smileys[strtolower($entry)] = $entry; Chris@76: } Chris@76: $dir->close(); Chris@76: Chris@76: // Exclude the smileys that are already in the database. Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT filename Chris@76: FROM {db_prefix}smileys Chris@76: WHERE filename IN ({array_string:smiley_list})', Chris@76: array( Chris@76: 'smiley_list' => $smileys, Chris@76: ) Chris@76: ); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: if (isset($smileys[strtolower($row['filename'])])) Chris@76: unset($smileys[strtolower($row['filename'])]); Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: $context['current_set']['can_import'] = count($smileys); Chris@76: // Setup this string to look nice. Chris@76: $txt['smiley_set_import_multiple'] = sprintf($txt['smiley_set_import_multiple'], $context['current_set']['can_import']); Chris@76: } Chris@76: } Chris@76: Chris@76: // Retrieve all potential smiley set directories. Chris@76: $context['smiley_set_dirs'] = array(); Chris@76: if (!empty($modSettings['smileys_dir']) && is_dir($modSettings['smileys_dir'])) Chris@76: { Chris@76: $dir = dir($modSettings['smileys_dir']); Chris@76: while ($entry = $dir->read()) Chris@76: { Chris@76: if (!in_array($entry, array('.', '..')) && is_dir($modSettings['smileys_dir'] . '/' . $entry)) Chris@76: $context['smiley_set_dirs'][] = array( Chris@76: 'id' => $entry, Chris@76: 'path' => $modSettings['smileys_dir'] . '/' . $entry, Chris@76: 'selectable' => $entry == $context['current_set']['path'] || !in_array($entry, explode(',', $modSettings['smiley_sets_known'])), Chris@76: 'current' => $entry == $context['current_set']['path'], Chris@76: ); Chris@76: } Chris@76: $dir->close(); Chris@76: } Chris@76: } Chris@76: Chris@76: $listOptions = array( Chris@76: 'id' => 'smiley_set_list', Chris@76: 'base_href' => $scripturl . '?action=admin;area=smileys;sa=editsets', Chris@76: 'default_sort_col' => 'default', Chris@76: 'get_items' => array( Chris@76: 'function' => 'list_getSmileySets', Chris@76: ), Chris@76: 'get_count' => array( Chris@76: 'function' => 'list_getNumSmileySets', Chris@76: ), Chris@76: 'columns' => array( Chris@76: 'default' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['smiley_sets_default'], Chris@76: ), Chris@76: 'data' => array( Chris@76: 'function' => create_function('$rowData', ' Chris@76: return $rowData[\'selected\'] ? \'*\' : \'\'; Chris@76: '), Chris@76: 'style' => 'text-align: center;', Chris@76: ), Chris@76: 'sort' => array( Chris@76: 'default' => 'selected DESC', Chris@76: ), Chris@76: ), Chris@76: 'name' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['smiley_sets_name'], Chris@76: ), Chris@76: 'data' => array( Chris@76: 'db_htmlsafe' => 'name', Chris@76: 'class' => 'windowbg', Chris@76: ), Chris@76: 'sort' => array( Chris@76: 'default' => 'name', Chris@76: 'reverse' => 'name DESC', Chris@76: ), Chris@76: ), Chris@76: 'url' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['smiley_sets_url'], Chris@76: ), Chris@76: 'data' => array( Chris@76: 'sprintf' => array( Chris@76: 'format' => $modSettings['smileys_url'] . '/%1$s/...', Chris@76: 'params' => array( Chris@76: 'path' => true, Chris@76: ), Chris@76: ), Chris@76: 'class' => 'windowbg', Chris@76: ), Chris@76: 'sort' => array( Chris@76: 'default' => 'path', Chris@76: 'reverse' => 'path DESC', Chris@76: ), Chris@76: ), Chris@76: 'modify' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['smiley_set_modify'], Chris@76: ), Chris@76: 'data' => array( Chris@76: 'sprintf' => array( Chris@76: 'format' => '' . $txt['smiley_set_modify'] . '', Chris@76: 'params' => array( Chris@76: 'id' => true, Chris@76: ), Chris@76: ), Chris@76: 'style' => 'text-align: center;', Chris@76: ), Chris@76: ), Chris@76: 'check' => array( Chris@76: 'header' => array( Chris@76: 'value' => '', Chris@76: ), Chris@76: 'data' => array( Chris@76: 'function' => create_function('$rowData', ' Chris@76: return $rowData[\'id\'] == 0 ? \'\' : sprintf(\'\', $rowData[\'id\']); Chris@76: '), Chris@76: 'style' => 'text-align: center', Chris@76: ), Chris@76: ), Chris@76: ), Chris@76: 'form' => array( Chris@76: 'href' => $scripturl . '?action=admin;area=smileys;sa=editsets', Chris@76: ), Chris@76: 'additional_rows' => array( Chris@76: array( Chris@76: 'position' => 'below_table_data', Chris@76: 'value' => ' [' . $txt['smiley_sets_add'] . ']', Chris@76: ), Chris@76: ), Chris@76: ); Chris@76: Chris@76: require_once($sourcedir . '/Subs-List.php'); Chris@76: createList($listOptions); Chris@76: } Chris@76: Chris@76: // !!! to be moved to Subs-Smileys. Chris@76: function list_getSmileySets($start, $items_per_page, $sort) Chris@76: { Chris@76: global $modSettings; Chris@76: Chris@76: $known_sets = explode(',', $modSettings['smiley_sets_known']); Chris@76: $set_names = explode("\n", $modSettings['smiley_sets_names']); Chris@76: $cols = array( Chris@76: 'id' => array(), Chris@76: 'selected' => array(), Chris@76: 'path' => array(), Chris@76: 'name' => array(), Chris@76: ); Chris@76: foreach ($known_sets as $i => $set) Chris@76: { Chris@76: $cols['id'][] = $i; Chris@76: $cols['selected'][] = $i; Chris@76: $cols['path'][] = $set; Chris@76: $cols['name'][] = $set_names[$i]; Chris@76: } Chris@76: $sort_flag = strpos($sort, 'DESC') === false ? SORT_ASC : SORT_DESC; Chris@76: if (substr($sort, 0, 4) === 'name') Chris@76: array_multisort($cols['name'], $sort_flag, SORT_REGULAR, $cols['path'], $cols['selected'], $cols['id']); Chris@76: elseif (substr($sort, 0, 4) === 'path') Chris@76: array_multisort($cols['path'], $sort_flag, SORT_REGULAR, $cols['name'], $cols['selected'], $cols['id']); Chris@76: else Chris@76: array_multisort($cols['selected'], $sort_flag, SORT_REGULAR, $cols['path'], $cols['name'], $cols['id']); Chris@76: Chris@76: $smiley_sets = array(); Chris@76: foreach ($cols['id'] as $i => $id) Chris@76: $smiley_sets[] = array( Chris@76: 'id' => $id, Chris@76: 'path' => $cols['path'][$i], Chris@76: 'name' => $cols['name'][$i], Chris@76: 'selected' => $cols['path'][$i] == $modSettings['smiley_sets_default'] Chris@76: ); Chris@76: Chris@76: return $smiley_sets; Chris@76: } Chris@76: Chris@76: // !!! to be moved to Subs-Smileys. Chris@76: function list_getNumSmileySets() Chris@76: { Chris@76: global $modSettings; Chris@76: Chris@76: return count(explode(',', $modSettings['smiley_sets_known'])); Chris@76: } Chris@76: Chris@76: function AddSmiley() Chris@76: { Chris@76: global $modSettings, $context, $settings, $txt, $boarddir, $smcFunc; Chris@76: Chris@76: // Get a list of all known smiley sets. Chris@76: $context['smileys_dir'] = empty($modSettings['smileys_dir']) ? $boarddir . '/Smileys' : $modSettings['smileys_dir']; Chris@76: $context['smileys_dir_found'] = is_dir($context['smileys_dir']); Chris@76: $context['smiley_sets'] = explode(',', $modSettings['smiley_sets_known']); Chris@76: $set_names = explode("\n", $modSettings['smiley_sets_names']); Chris@76: foreach ($context['smiley_sets'] as $i => $set) Chris@76: $context['smiley_sets'][$i] = array( Chris@76: 'id' => $i, Chris@76: 'path' => htmlspecialchars($set), Chris@76: 'name' => htmlspecialchars($set_names[$i]), Chris@76: 'selected' => $set == $modSettings['smiley_sets_default'] Chris@76: ); Chris@76: Chris@76: // Submitting a form? Chris@76: if (isset($_POST[$context['session_var']], $_POST['smiley_code'])) Chris@76: { Chris@76: checkSession(); Chris@76: Chris@76: // Some useful arrays... types we allow - and ports we don't! Chris@76: $allowedTypes = array('jpeg', 'jpg', 'gif', 'png', 'bmp'); Chris@76: $disabledFiles = array('con', 'com1', 'com2', 'com3', 'com4', 'prn', 'aux', 'lpt1', '.htaccess', 'index.php'); Chris@76: Chris@76: $_POST['smiley_code'] = htmltrim__recursive($_POST['smiley_code']); Chris@76: $_POST['smiley_location'] = empty($_POST['smiley_location']) || $_POST['smiley_location'] > 2 || $_POST['smiley_location'] < 0 ? 0 : (int) $_POST['smiley_location']; Chris@76: $_POST['smiley_filename'] = htmltrim__recursive($_POST['smiley_filename']); Chris@76: Chris@76: // Make sure some code was entered. Chris@76: if (empty($_POST['smiley_code'])) Chris@76: fatal_lang_error('smiley_has_no_code'); Chris@76: Chris@76: // Check whether the new code has duplicates. It should be unique. Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_smiley Chris@76: FROM {db_prefix}smileys Chris@76: WHERE code = {raw:mysql_binary_statement} {string:smiley_code}', Chris@76: array( Chris@76: 'mysql_binary_statement' => $smcFunc['db_title'] == 'MySQL' ? 'BINARY' : '', Chris@76: 'smiley_code' => $_POST['smiley_code'], Chris@76: ) Chris@76: ); Chris@76: if ($smcFunc['db_num_rows']($request) > 0) Chris@76: fatal_lang_error('smiley_not_unique'); Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: // If we are uploading - check all the smiley sets are writable! Chris@76: if ($_POST['method'] != 'existing') Chris@76: { Chris@76: $writeErrors = array(); Chris@76: foreach ($context['smiley_sets'] as $set) Chris@76: { Chris@76: if (!is_writable($context['smileys_dir'] . '/' . un_htmlspecialchars($set['path']))) Chris@76: $writeErrors[] = $set['path']; Chris@76: } Chris@76: if (!empty($writeErrors)) Chris@76: fatal_lang_error('smileys_upload_error_notwritable', true, array(implode(', ', $writeErrors))); Chris@76: } Chris@76: Chris@76: // Uploading just one smiley for all of them? Chris@76: if (isset($_POST['sameall']) && isset($_FILES['uploadSmiley']['name']) && $_FILES['uploadSmiley']['name'] != '') Chris@76: { Chris@76: if (!is_uploaded_file($_FILES['uploadSmiley']['tmp_name']) || (@ini_get('open_basedir') == '' && !file_exists($_FILES['uploadSmiley']['tmp_name']))) Chris@76: fatal_lang_error('smileys_upload_error'); Chris@76: Chris@76: // Sorry, no spaces, dots, or anything else but letters allowed. Chris@76: $_FILES['uploadSmiley']['name'] = preg_replace(array('/\s/', '/\.[\.]+/', '/[^\w_\.\-]/'), array('_', '.', ''), $_FILES['uploadSmiley']['name']); Chris@76: Chris@76: // We only allow image files - it's THAT simple - no messing around here... Chris@76: if (!in_array(strtolower(substr(strrchr($_FILES['uploadSmiley']['name'], '.'), 1)), $allowedTypes)) Chris@76: fatal_lang_error('smileys_upload_error_types', false, array(implode(', ', $allowedTypes))); Chris@76: Chris@76: // We only need the filename... Chris@76: $destName = basename($_FILES['uploadSmiley']['name']); Chris@76: Chris@76: // Make sure they aren't trying to upload a nasty file - for their own good here! Chris@76: if (in_array(strtolower($destName), $disabledFiles)) Chris@76: fatal_lang_error('smileys_upload_error_illegal'); Chris@76: Chris@76: // Check if the file already exists... and if not move it to EVERY smiley set directory. Chris@76: $i = 0; Chris@76: // Keep going until we find a set the file doesn't exist in. (or maybe it exists in all of them?) Chris@76: while (isset($context['smiley_sets'][$i]) && file_exists($context['smileys_dir'] . '/' . un_htmlspecialchars($context['smiley_sets'][$i]['path']) . '/' . $destName)) Chris@76: $i++; Chris@76: Chris@76: // Okay, we're going to put the smiley right here, since it's not there yet! Chris@76: if (isset($context['smiley_sets'][$i]['path'])) Chris@76: { Chris@76: $smileyLocation = $context['smileys_dir'] . '/' . un_htmlspecialchars($context['smiley_sets'][$i]['path']) . '/' . $destName; Chris@76: move_uploaded_file($_FILES['uploadSmiley']['tmp_name'], $smileyLocation); Chris@76: @chmod($smileyLocation, 0644); Chris@76: Chris@76: // Now, we want to move it from there to all the other sets. Chris@76: for ($n = count($context['smiley_sets']); $i < $n; $i++) Chris@76: { Chris@76: $currentPath = $context['smileys_dir'] . '/' . un_htmlspecialchars($context['smiley_sets'][$i]['path']) . '/' . $destName; Chris@76: Chris@76: // The file is already there! Don't overwrite it! Chris@76: if (file_exists($currentPath)) Chris@76: continue; Chris@76: Chris@76: // Okay, so copy the first one we made to here. Chris@76: copy($smileyLocation, $currentPath); Chris@76: @chmod($currentPath, 0644); Chris@76: } Chris@76: } Chris@76: Chris@76: // Finally make sure it's saved correctly! Chris@76: $_POST['smiley_filename'] = $destName; Chris@76: } Chris@76: // What about uploading several files? Chris@76: elseif ($_POST['method'] != 'existing') Chris@76: { Chris@76: foreach ($_FILES as $name => $data) Chris@76: { Chris@76: if ($_FILES[$name]['name'] == '') Chris@76: fatal_lang_error('smileys_upload_error_blank'); Chris@76: Chris@76: if (empty($newName)) Chris@76: $newName = basename($_FILES[$name]['name']); Chris@76: elseif (basename($_FILES[$name]['name']) != $newName) Chris@76: fatal_lang_error('smileys_upload_error_name'); Chris@76: } Chris@76: Chris@76: foreach ($context['smiley_sets'] as $i => $set) Chris@76: { Chris@76: $set['name'] = un_htmlspecialchars($set['name']); Chris@76: $set['path'] = un_htmlspecialchars($set['path']); Chris@76: Chris@76: if (!isset($_FILES['individual_' . $set['name']]['name']) || $_FILES['individual_' . $set['name']]['name'] == '') Chris@76: continue; Chris@76: Chris@76: // Got one... Chris@76: if (!is_uploaded_file($_FILES['individual_' . $set['name']]['tmp_name']) || (@ini_get('open_basedir') == '' && !file_exists($_FILES['individual_' . $set['name']]['tmp_name']))) Chris@76: fatal_lang_error('smileys_upload_error'); Chris@76: Chris@76: // Sorry, no spaces, dots, or anything else but letters allowed. Chris@76: $_FILES['individual_' . $set['name']]['name'] = preg_replace(array('/\s/', '/\.[\.]+/', '/[^\w_\.\-]/'), array('_', '.', ''), $_FILES['individual_' . $set['name']]['name']); Chris@76: Chris@76: // We only allow image files - it's THAT simple - no messing around here... Chris@76: if (!in_array(strtolower(substr(strrchr($_FILES['individual_' . $set['name']]['name'], '.'), 1)), $allowedTypes)) Chris@76: fatal_lang_error('smileys_upload_error_types', false, array(implode(', ', $allowedTypes))); Chris@76: Chris@76: // We only need the filename... Chris@76: $destName = basename($_FILES['individual_' . $set['name']]['name']); Chris@76: Chris@76: // Make sure they aren't trying to upload a nasty file - for their own good here! Chris@76: if (in_array(strtolower($destName), $disabledFiles)) Chris@76: fatal_lang_error('smileys_upload_error_illegal'); Chris@76: Chris@76: // If the file exists - ignore it. Chris@76: $smileyLocation = $context['smileys_dir'] . '/' . $set['path'] . '/' . $destName; Chris@76: if (file_exists($smileyLocation)) Chris@76: continue; Chris@76: Chris@76: // Finally - move the image! Chris@76: move_uploaded_file($_FILES['individual_' . $set['name']]['tmp_name'], $smileyLocation); Chris@76: @chmod($smileyLocation, 0644); Chris@76: Chris@76: // Should always be saved correctly! Chris@76: $_POST['smiley_filename'] = $destName; Chris@76: } Chris@76: } Chris@76: Chris@76: // Also make sure a filename was given. Chris@76: if (empty($_POST['smiley_filename'])) Chris@76: fatal_lang_error('smiley_has_no_filename'); Chris@76: Chris@76: // Find the position on the right. Chris@76: $smiley_order = '0'; Chris@76: if ($_POST['smiley_location'] != 1) Chris@76: { Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT MAX(smiley_order) + 1 Chris@76: FROM {db_prefix}smileys Chris@76: WHERE hidden = {int:smiley_location} Chris@76: AND smiley_row = {int:first_row}', Chris@76: array( Chris@76: 'smiley_location' => $_POST['smiley_location'], Chris@76: 'first_row' => 0, Chris@76: ) Chris@76: ); Chris@76: list ($smiley_order) = $smcFunc['db_fetch_row']($request); Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: if (empty($smiley_order)) Chris@76: $smiley_order = '0'; Chris@76: } Chris@76: $smcFunc['db_insert']('', Chris@76: '{db_prefix}smileys', Chris@76: array( Chris@76: 'code' => 'string-30', 'filename' => 'string-48', 'description' => 'string-80', 'hidden' => 'int', 'smiley_order' => 'int', Chris@76: ), Chris@76: array( Chris@76: $_POST['smiley_code'], $_POST['smiley_filename'], $_POST['smiley_description'], $_POST['smiley_location'], $smiley_order, Chris@76: ), Chris@76: array('id_smiley') Chris@76: ); Chris@76: Chris@76: cache_put_data('parsing_smileys', null, 480); Chris@76: cache_put_data('posting_smileys', null, 480); Chris@76: Chris@76: // No errors? Out of here! Chris@76: redirectexit('action=admin;area=smileys;sa=editsmileys'); Chris@76: } Chris@76: Chris@76: $context['selected_set'] = $modSettings['smiley_sets_default']; Chris@76: Chris@76: // Get all possible filenames for the smileys. Chris@76: $context['filenames'] = array(); Chris@76: if ($context['smileys_dir_found']) Chris@76: { Chris@76: foreach ($context['smiley_sets'] as $smiley_set) Chris@76: { Chris@76: if (!file_exists($context['smileys_dir'] . '/' . un_htmlspecialchars($smiley_set['path']))) Chris@76: continue; Chris@76: Chris@76: $dir = dir($context['smileys_dir'] . '/' . un_htmlspecialchars($smiley_set['path'])); Chris@76: while ($entry = $dir->read()) Chris@76: { Chris@76: if (!in_array($entry, $context['filenames']) && in_array(strrchr($entry, '.'), array('.jpg', '.gif', '.jpeg', '.png'))) Chris@76: $context['filenames'][strtolower($entry)] = array( Chris@76: 'id' => htmlspecialchars($entry), Chris@76: 'selected' => false, Chris@76: ); Chris@76: } Chris@76: $dir->close(); Chris@76: } Chris@76: ksort($context['filenames']); Chris@76: } Chris@76: Chris@76: // Create a new smiley from scratch. Chris@76: $context['filenames'] = array_values($context['filenames']); Chris@76: $context['current_smiley'] = array( Chris@76: 'id' => 0, Chris@76: 'code' => '', Chris@76: 'filename' => $context['filenames'][0]['id'], Chris@76: 'description' => $txt['smileys_default_description'], Chris@76: 'location' => 0, Chris@76: 'is_new' => true, Chris@76: ); Chris@76: } Chris@76: Chris@76: function EditSmileys() Chris@76: { Chris@76: global $modSettings, $context, $settings, $txt, $boarddir; Chris@76: global $smcFunc, $scripturl, $sourcedir; Chris@76: Chris@76: // Force the correct tab to be displayed. Chris@76: $context[$context['admin_menu_name']]['current_subsection'] = 'editsmileys'; Chris@76: Chris@76: // Submitting a form? Chris@76: if (isset($_POST[$context['session_var']])) Chris@76: { Chris@76: checkSession(); Chris@76: Chris@76: // Changing the selected smileys? Chris@76: if (isset($_POST['smiley_action']) && !empty($_POST['checked_smileys'])) Chris@76: { Chris@76: foreach ($_POST['checked_smileys'] as $id => $smiley_id) Chris@76: $_POST['checked_smileys'][$id] = (int) $smiley_id; Chris@76: Chris@76: if ($_POST['smiley_action'] == 'delete') Chris@76: $smcFunc['db_query']('', ' Chris@76: DELETE FROM {db_prefix}smileys Chris@76: WHERE id_smiley IN ({array_int:checked_smileys})', Chris@76: array( Chris@76: 'checked_smileys' => $_POST['checked_smileys'], Chris@76: ) Chris@76: ); Chris@76: // Changing the status of the smiley? Chris@76: else Chris@76: { Chris@76: // Check it's a valid type. Chris@76: $displayTypes = array( Chris@76: 'post' => 0, Chris@76: 'hidden' => 1, Chris@76: 'popup' => 2 Chris@76: ); Chris@76: if (isset($displayTypes[$_POST['smiley_action']])) Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}smileys Chris@76: SET hidden = {int:display_type} Chris@76: WHERE id_smiley IN ({array_int:checked_smileys})', Chris@76: array( Chris@76: 'checked_smileys' => $_POST['checked_smileys'], Chris@76: 'display_type' => $displayTypes[$_POST['smiley_action']], Chris@76: ) Chris@76: ); Chris@76: } Chris@76: } Chris@76: // Create/modify a smiley. Chris@76: elseif (isset($_POST['smiley'])) Chris@76: { Chris@76: // Is it a delete? Chris@76: if (!empty($_POST['deletesmiley'])) Chris@76: { Chris@76: $smcFunc['db_query']('', ' Chris@76: DELETE FROM {db_prefix}smileys Chris@76: WHERE id_smiley = {int:current_smiley}', Chris@76: array( Chris@76: 'current_smiley' => $_POST['smiley'], Chris@76: ) Chris@76: ); Chris@76: } Chris@76: // Otherwise an edit. Chris@76: else Chris@76: { Chris@76: $_POST['smiley'] = (int) $_POST['smiley']; Chris@76: $_POST['smiley_code'] = htmltrim__recursive($_POST['smiley_code']); Chris@76: $_POST['smiley_filename'] = htmltrim__recursive($_POST['smiley_filename']); Chris@76: $_POST['smiley_location'] = empty($_POST['smiley_location']) || $_POST['smiley_location'] > 2 || $_POST['smiley_location'] < 0 ? 0 : (int) $_POST['smiley_location']; Chris@76: Chris@76: // Make sure some code was entered. Chris@76: if (empty($_POST['smiley_code'])) Chris@76: fatal_lang_error('smiley_has_no_code'); Chris@76: Chris@76: // Also make sure a filename was given. Chris@76: if (empty($_POST['smiley_filename'])) Chris@76: fatal_lang_error('smiley_has_no_filename'); Chris@76: Chris@76: // Check whether the new code has duplicates. It should be unique. Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_smiley Chris@76: FROM {db_prefix}smileys Chris@76: WHERE code = {raw:mysql_binary_type} {string:smiley_code}' . (empty($_POST['smiley']) ? '' : ' Chris@76: AND id_smiley != {int:current_smiley}'), Chris@76: array( Chris@76: 'current_smiley' => $_POST['smiley'], Chris@76: 'mysql_binary_type' => $smcFunc['db_title'] == 'MySQL' ? 'BINARY' : '', Chris@76: 'smiley_code' => $_POST['smiley_code'], Chris@76: ) Chris@76: ); Chris@76: if ($smcFunc['db_num_rows']($request) > 0) Chris@76: fatal_lang_error('smiley_not_unique'); Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}smileys Chris@76: SET Chris@76: code = {string:smiley_code}, Chris@76: filename = {string:smiley_filename}, Chris@76: description = {string:smiley_description}, Chris@76: hidden = {int:smiley_location} Chris@76: WHERE id_smiley = {int:current_smiley}', Chris@76: array( Chris@76: 'smiley_location' => $_POST['smiley_location'], Chris@76: 'current_smiley' => $_POST['smiley'], Chris@76: 'smiley_code' => $_POST['smiley_code'], Chris@76: 'smiley_filename' => $_POST['smiley_filename'], Chris@76: 'smiley_description' => $_POST['smiley_description'], Chris@76: ) Chris@76: ); Chris@76: } Chris@76: Chris@76: // Sort all smiley codes for more accurate parsing (longest code first). Chris@76: sortSmileyTable(); Chris@76: } Chris@76: Chris@76: cache_put_data('parsing_smileys', null, 480); Chris@76: cache_put_data('posting_smileys', null, 480); Chris@76: } Chris@76: Chris@76: // Load all known smiley sets. Chris@76: $context['smiley_sets'] = explode(',', $modSettings['smiley_sets_known']); Chris@76: $set_names = explode("\n", $modSettings['smiley_sets_names']); Chris@76: foreach ($context['smiley_sets'] as $i => $set) Chris@76: $context['smiley_sets'][$i] = array( Chris@76: 'id' => $i, Chris@76: 'path' => htmlspecialchars($set), Chris@76: 'name' => htmlspecialchars($set_names[$i]), Chris@76: 'selected' => $set == $modSettings['smiley_sets_default'] Chris@76: ); Chris@76: Chris@76: // Prepare overview of all (custom) smileys. Chris@76: if ($context['sub_action'] == 'editsmileys') Chris@76: { Chris@76: // Determine the language specific sort order of smiley locations. Chris@76: $smiley_locations = array( Chris@76: $txt['smileys_location_form'], Chris@76: $txt['smileys_location_hidden'], Chris@76: $txt['smileys_location_popup'], Chris@76: ); Chris@76: asort($smiley_locations); Chris@76: Chris@76: // Create a list of options for selecting smiley sets. Chris@76: $smileyset_option_list = ' Chris@76: '; Chris@76: Chris@76: $listOptions = array( Chris@76: 'id' => 'smiley_list', Chris@76: 'items_per_page' => 40, Chris@76: 'base_href' => $scripturl . '?action=admin;area=smileys;sa=editsmileys', Chris@76: 'default_sort_col' => 'filename', Chris@76: 'get_items' => array( Chris@76: 'function' => 'list_getSmileys', Chris@76: ), Chris@76: 'get_count' => array( Chris@76: 'function' => 'list_getNumSmileys', Chris@76: ), Chris@76: 'no_items_label' => $txt['smileys_no_entries'], Chris@76: 'columns' => array( Chris@76: 'picture' => array( Chris@76: 'data' => array( Chris@76: 'sprintf' => array( Chris@76: 'format' => '%3$s', Chris@76: 'params' => array( Chris@76: 'id_smiley' => false, Chris@76: 'filename' => true, Chris@76: 'description' => true, Chris@76: ), Chris@76: ), Chris@76: 'style' => 'text-align: center;', Chris@76: ), Chris@76: ), Chris@76: 'code' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['smileys_code'], Chris@76: ), Chris@76: 'data' => array( Chris@76: 'db_htmlsafe' => 'code', Chris@76: ), Chris@76: 'sort' => array( Chris@76: 'default' => 'code', Chris@76: 'reverse' => 'code DESC', Chris@76: ), Chris@76: ), Chris@76: 'filename' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['smileys_filename'], Chris@76: ), Chris@76: 'data' => array( Chris@76: 'db_htmlsafe' => 'filename', Chris@76: 'class' => 'windowbg', Chris@76: ), Chris@76: 'sort' => array( Chris@76: 'default' => 'filename', Chris@76: 'reverse' => 'filename DESC', Chris@76: ), Chris@76: ), Chris@76: 'location' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['smileys_location'], Chris@76: ), Chris@76: 'data' => array( Chris@76: 'function' => create_function('$rowData', ' Chris@76: global $txt; Chris@76: Chris@76: if (empty($rowData[\'hidden\'])) Chris@76: return $txt[\'smileys_location_form\']; Chris@76: elseif ($rowData[\'hidden\'] == 1) Chris@76: return $txt[\'smileys_location_hidden\']; Chris@76: else Chris@76: return $txt[\'smileys_location_popup\']; Chris@76: '), Chris@76: 'class' => 'windowbg', Chris@76: ), Chris@76: 'sort' => array( Chris@76: 'default' => 'FIND_IN_SET(hidden, \'' . implode(',', array_keys($smiley_locations)) . '\')', Chris@76: 'reverse' => 'FIND_IN_SET(hidden, \'' . implode(',', array_keys($smiley_locations)) . '\') DESC', Chris@76: ), Chris@76: ), Chris@76: 'tooltip' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['smileys_description'], Chris@76: ), Chris@76: 'data' => array( Chris@76: 'function' => create_function('$rowData', empty($modSettings['smileys_dir']) || !is_dir($modSettings['smileys_dir']) ? ' Chris@76: return htmlspecialchars($rowData[\'description\']); Chris@76: ' : ' Chris@76: global $context, $txt, $modSettings; Chris@76: Chris@76: // Check if there are smileys missing in some sets. Chris@76: $missing_sets = array(); Chris@76: foreach ($context[\'smiley_sets\'] as $smiley_set) Chris@76: if (!file_exists(sprintf(\'%1$s/%2$s/%3$s\', $modSettings[\'smileys_dir\'], $smiley_set[\'path\'], $rowData[\'filename\']))) Chris@76: $missing_sets[] = $smiley_set[\'path\']; Chris@76: Chris@76: $description = htmlspecialchars($rowData[\'description\']); Chris@76: Chris@76: if (!empty($missing_sets)) Chris@76: $description .= sprintf(\'
%1$s: %2$s\', $txt[\'smileys_not_found_in_set\'], implode(\', \', $missing_sets)); Chris@76: Chris@76: return $description; Chris@76: '), Chris@76: 'class' => 'windowbg', Chris@76: ), Chris@76: 'sort' => array( Chris@76: 'default' => 'description', Chris@76: 'reverse' => 'description DESC', Chris@76: ), Chris@76: ), Chris@76: 'modify' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['smileys_modify'], Chris@76: ), Chris@76: 'data' => array( Chris@76: 'sprintf' => array( Chris@76: 'format' => '' . $txt['smileys_modify'] . '', Chris@76: 'params' => array( Chris@76: 'id_smiley' => false, Chris@76: ), Chris@76: ), Chris@76: 'style' => 'text-align: center;', Chris@76: ), Chris@76: ), Chris@76: 'check' => array( Chris@76: 'header' => array( Chris@76: 'value' => '', Chris@76: ), Chris@76: 'data' => array( Chris@76: 'sprintf' => array( Chris@76: 'format' => '', Chris@76: 'params' => array( Chris@76: 'id_smiley' => false, Chris@76: ), Chris@76: ), Chris@76: 'style' => 'text-align: center', Chris@76: ), Chris@76: ), Chris@76: ), Chris@76: 'form' => array( Chris@76: 'href' => $scripturl . '?action=admin;area=smileys;sa=editsmileys', Chris@76: 'name' => 'smileyForm', Chris@76: ), Chris@76: 'additional_rows' => array( Chris@76: array( Chris@76: 'position' => 'above_column_headers', Chris@76: 'value' => $smileyset_option_list, Chris@76: 'style' => 'text-align: right;', Chris@76: ), Chris@76: array( Chris@76: 'position' => 'below_table_data', Chris@76: 'value' => ' Chris@76: Chris@76: ', Chris@76: 'style' => 'text-align: right;', Chris@76: ), Chris@76: ), Chris@76: 'javascript' => ' Chris@76: function makeChanges(action) Chris@76: { Chris@76: if (action == \'-1\') Chris@76: return false; Chris@76: else if (action == \'delete\') Chris@76: { Chris@76: if (confirm(\'' . $txt['smileys_confirm'] . '\')) Chris@76: document.forms.smileyForm.submit(); Chris@76: } Chris@76: else Chris@76: document.forms.smileyForm.submit(); Chris@76: return true; Chris@76: } Chris@76: function changeSet(newSet) Chris@76: { Chris@76: var currentImage, i, knownSmileys = []; Chris@76: Chris@76: if (knownSmileys.length == 0) Chris@76: { Chris@76: for (var i = 0, n = document.images.length; i < n; i++) Chris@76: if (document.images[i].id.substr(0, 6) == \'smiley\') Chris@76: knownSmileys[knownSmileys.length] = document.images[i].id.substr(6); Chris@76: } Chris@76: Chris@76: for (i = 0; i < knownSmileys.length; i++) Chris@76: { Chris@76: currentImage = document.getElementById("smiley" + knownSmileys[i]); Chris@76: currentImage.src = "' . $modSettings['smileys_url'] . '/" + newSet + "/" + document.forms.smileyForm["smileys[" + knownSmileys[i] + "][filename]"].value; Chris@76: } Chris@76: }', Chris@76: ); Chris@76: Chris@76: require_once($sourcedir . '/Subs-List.php'); Chris@76: createList($listOptions); Chris@76: Chris@76: // The list is the only thing to show, so make it the main template. Chris@76: $context['default_list'] = 'smiley_list'; Chris@76: $context['sub_template'] = 'show_list'; Chris@76: } Chris@76: // Modifying smileys. Chris@76: elseif ($context['sub_action'] == 'modifysmiley') Chris@76: { Chris@76: // Get a list of all known smiley sets. Chris@76: $context['smileys_dir'] = empty($modSettings['smileys_dir']) ? $boarddir . '/Smileys' : $modSettings['smileys_dir']; Chris@76: $context['smileys_dir_found'] = is_dir($context['smileys_dir']); Chris@76: $context['smiley_sets'] = explode(',', $modSettings['smiley_sets_known']); Chris@76: $set_names = explode("\n", $modSettings['smiley_sets_names']); Chris@76: foreach ($context['smiley_sets'] as $i => $set) Chris@76: $context['smiley_sets'][$i] = array( Chris@76: 'id' => $i, Chris@76: 'path' => htmlspecialchars($set), Chris@76: 'name' => htmlspecialchars($set_names[$i]), Chris@76: 'selected' => $set == $modSettings['smiley_sets_default'] Chris@76: ); Chris@76: Chris@76: $context['selected_set'] = $modSettings['smiley_sets_default']; Chris@76: Chris@76: // Get all possible filenames for the smileys. Chris@76: $context['filenames'] = array(); Chris@76: if ($context['smileys_dir_found']) Chris@76: { Chris@76: foreach ($context['smiley_sets'] as $smiley_set) Chris@76: { Chris@76: if (!file_exists($context['smileys_dir'] . '/' . un_htmlspecialchars($smiley_set['path']))) Chris@76: continue; Chris@76: Chris@76: $dir = dir($context['smileys_dir'] . '/' . un_htmlspecialchars($smiley_set['path'])); Chris@76: while ($entry = $dir->read()) Chris@76: { Chris@76: if (!in_array($entry, $context['filenames']) && in_array(strrchr($entry, '.'), array('.jpg', '.gif', '.jpeg', '.png'))) Chris@76: $context['filenames'][strtolower($entry)] = array( Chris@76: 'id' => htmlspecialchars($entry), Chris@76: 'selected' => false, Chris@76: ); Chris@76: } Chris@76: $dir->close(); Chris@76: } Chris@76: ksort($context['filenames']); Chris@76: } Chris@76: Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_smiley AS id, code, filename, description, hidden AS location, 0 AS is_new Chris@76: FROM {db_prefix}smileys Chris@76: WHERE id_smiley = {int:current_smiley}', Chris@76: array( Chris@76: 'current_smiley' => (int) $_REQUEST['smiley'], Chris@76: ) Chris@76: ); Chris@76: if ($smcFunc['db_num_rows']($request) != 1) Chris@76: fatal_lang_error('smiley_not_found'); Chris@76: $context['current_smiley'] = $smcFunc['db_fetch_assoc']($request); Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: $context['current_smiley']['code'] = htmlspecialchars($context['current_smiley']['code']); Chris@76: $context['current_smiley']['filename'] = htmlspecialchars($context['current_smiley']['filename']); Chris@76: $context['current_smiley']['description'] = htmlspecialchars($context['current_smiley']['description']); Chris@76: Chris@76: if (isset($context['filenames'][strtolower($context['current_smiley']['filename'])])) Chris@76: $context['filenames'][strtolower($context['current_smiley']['filename'])]['selected'] = true; Chris@76: } Chris@76: } Chris@76: Chris@76: function list_getSmileys($start, $items_per_page, $sort) Chris@76: { Chris@76: global $smcFunc; Chris@76: Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_smiley, code, filename, description, smiley_row, smiley_order, hidden Chris@76: FROM {db_prefix}smileys Chris@76: ORDER BY ' . $sort, Chris@76: array( Chris@76: ) Chris@76: ); Chris@76: $smileys = array(); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: $smileys[] = $row; Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: return $smileys; Chris@76: } Chris@76: Chris@76: function list_getNumSmileys() Chris@76: { Chris@76: global $smcFunc; Chris@76: Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT COUNT(*) Chris@76: FROM {db_prefix}smileys', Chris@76: array( Chris@76: ) Chris@76: ); Chris@76: list($numSmileys) = $smcFunc['db_fetch_row']; Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: return $numSmileys; Chris@76: } Chris@76: Chris@76: function EditSmileyOrder() Chris@76: { Chris@76: global $modSettings, $context, $settings, $txt, $boarddir, $smcFunc; Chris@76: Chris@76: // Move smileys to another position. Chris@76: if (isset($_REQUEST['reorder'])) Chris@76: { Chris@76: checkSession('get'); Chris@76: Chris@76: $_GET['location'] = empty($_GET['location']) || $_GET['location'] != 'popup' ? 0 : 2; Chris@76: $_GET['source'] = empty($_GET['source']) ? 0 : (int) $_GET['source']; Chris@76: Chris@76: if (empty($_GET['source'])) Chris@76: fatal_lang_error('smiley_not_found'); Chris@76: Chris@76: if (!empty($_GET['after'])) Chris@76: { Chris@76: $_GET['after'] = (int) $_GET['after']; Chris@76: Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT smiley_row, smiley_order, hidden Chris@76: FROM {db_prefix}smileys Chris@76: WHERE hidden = {int:location} Chris@76: AND id_smiley = {int:after_smiley}', Chris@76: array( Chris@76: 'location' => $_GET['location'], Chris@76: 'after_smiley' => $_GET['after'], Chris@76: ) Chris@76: ); Chris@76: if ($smcFunc['db_num_rows']($request) != 1) Chris@76: fatal_lang_error('smiley_not_found'); Chris@76: list ($smiley_row, $smiley_order, $smileyLocation) = $smcFunc['db_fetch_row']($request); Chris@76: $smcFunc['db_free_result']($request); Chris@76: } Chris@76: else Chris@76: { Chris@76: $smiley_row = (int) $_GET['row']; Chris@76: $smiley_order = -1; Chris@76: $smileyLocation = (int) $_GET['location']; Chris@76: } Chris@76: Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}smileys Chris@76: SET smiley_order = smiley_order + 1 Chris@76: WHERE hidden = {int:new_location} Chris@76: AND smiley_row = {int:smiley_row} Chris@76: AND smiley_order > {int:smiley_order}', Chris@76: array( Chris@76: 'new_location' => $_GET['location'], Chris@76: 'smiley_row' => $smiley_row, Chris@76: 'smiley_order' => $smiley_order, Chris@76: ) Chris@76: ); Chris@76: Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}smileys Chris@76: SET Chris@76: smiley_order = {int:smiley_order} + 1, Chris@76: smiley_row = {int:smiley_row}, Chris@76: hidden = {int:new_location} Chris@76: WHERE id_smiley = {int:current_smiley}', Chris@76: array( Chris@76: 'smiley_order' => $smiley_order, Chris@76: 'smiley_row' => $smiley_row, Chris@76: 'new_location' => $smileyLocation, Chris@76: 'current_smiley' => $_GET['source'], Chris@76: ) Chris@76: ); Chris@76: Chris@76: cache_put_data('parsing_smileys', null, 480); Chris@76: cache_put_data('posting_smileys', null, 480); Chris@76: } Chris@76: Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT id_smiley, code, filename, description, smiley_row, smiley_order, hidden Chris@76: FROM {db_prefix}smileys Chris@76: WHERE hidden != {int:popup} Chris@76: ORDER BY smiley_order, smiley_row', Chris@76: array( Chris@76: 'popup' => 1, Chris@76: ) Chris@76: ); Chris@76: $context['smileys'] = array( Chris@76: 'postform' => array( Chris@76: 'rows' => array(), Chris@76: ), Chris@76: 'popup' => array( Chris@76: 'rows' => array(), Chris@76: ), Chris@76: ); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: { Chris@76: $location = empty($row['hidden']) ? 'postform' : 'popup'; Chris@76: $context['smileys'][$location]['rows'][$row['smiley_row']][] = array( Chris@76: 'id' => $row['id_smiley'], Chris@76: 'code' => htmlspecialchars($row['code']), Chris@76: 'filename' => htmlspecialchars($row['filename']), Chris@76: 'description' => htmlspecialchars($row['description']), Chris@76: 'row' => $row['smiley_row'], Chris@76: 'order' => $row['smiley_order'], Chris@76: 'selected' => !empty($_REQUEST['move']) && $_REQUEST['move'] == $row['id_smiley'], Chris@76: ); Chris@76: } Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: $context['move_smiley'] = empty($_REQUEST['move']) ? 0 : (int) $_REQUEST['move']; Chris@76: Chris@76: // Make sure all rows are sequential. Chris@76: foreach (array_keys($context['smileys']) as $location) Chris@76: $context['smileys'][$location] = array( Chris@76: 'id' => $location, Chris@76: 'title' => $location == 'postform' ? $txt['smileys_location_form'] : $txt['smileys_location_popup'], Chris@76: 'description' => $location == 'postform' ? $txt['smileys_location_form_description'] : $txt['smileys_location_popup_description'], Chris@76: 'last_row' => count($context['smileys'][$location]['rows']), Chris@76: 'rows' => array_values($context['smileys'][$location]['rows']), Chris@76: ); Chris@76: Chris@76: // Check & fix smileys that are not ordered properly in the database. Chris@76: foreach (array_keys($context['smileys']) as $location) Chris@76: { Chris@76: foreach ($context['smileys'][$location]['rows'] as $id => $smiley_row) Chris@76: { Chris@76: // Fix empty rows if any. Chris@76: if ($id != $smiley_row[0]['row']) Chris@76: { Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}smileys Chris@76: SET smiley_row = {int:new_row} Chris@76: WHERE smiley_row = {int:current_row} Chris@76: AND hidden = {int:location}', Chris@76: array( Chris@76: 'new_row' => $id, Chris@76: 'current_row' => $smiley_row[0]['row'], Chris@76: 'location' => $location == 'postform' ? '0' : '2', Chris@76: ) Chris@76: ); Chris@76: // Only change the first row value of the first smiley (we don't need the others :P). Chris@76: $context['smileys'][$location]['rows'][$id][0]['row'] = $id; Chris@76: } Chris@76: // Make sure the smiley order is always sequential. Chris@76: foreach ($smiley_row as $order_id => $smiley) Chris@76: if ($order_id != $smiley['order']) Chris@76: $smcFunc['db_query']('', ' Chris@76: UPDATE {db_prefix}smileys Chris@76: SET smiley_order = {int:new_order} Chris@76: WHERE id_smiley = {int:current_smiley}', Chris@76: array( Chris@76: 'new_order' => $order_id, Chris@76: 'current_smiley' => $smiley['id'], Chris@76: ) Chris@76: ); Chris@76: } Chris@76: } Chris@76: Chris@76: cache_put_data('parsing_smileys', null, 480); Chris@76: cache_put_data('posting_smileys', null, 480); Chris@76: } Chris@76: Chris@76: function InstallSmileySet() Chris@76: { Chris@76: global $sourcedir, $boarddir, $modSettings, $smcFunc; Chris@76: Chris@76: isAllowedTo('manage_smileys'); Chris@76: checkSession('request'); Chris@76: Chris@76: require_once($sourcedir . '/Subs-Package.php'); Chris@76: Chris@76: $name = strtok(basename(isset($_FILES['set_gz']) ? $_FILES['set_gz']['name'] : $_REQUEST['set_gz']), '.'); Chris@76: $name = preg_replace(array('/\s/', '/\.[\.]+/', '/[^\w_\.\-]/'), array('_', '.', ''), $name); Chris@76: Chris@76: // !!! Decide: overwrite or not? Chris@76: if (isset($_FILES['set_gz']) && is_uploaded_file($_FILES['set_gz']['tmp_name']) && (@ini_get('open_basedir') != '' || file_exists($_FILES['set_gz']['tmp_name']))) Chris@76: $extracted = read_tgz_file($_FILES['set_gz']['tmp_name'], $boarddir . '/Smileys/' . $name); Chris@76: elseif (isset($_REQUEST['set_gz'])) Chris@76: { Chris@76: // Check that the smiley is from simplemachines.org, for now... maybe add mirroring later. Chris@76: if (preg_match('~^http://[\w_\-]+\.simplemachines\.org/~', $_REQUEST['set_gz']) == 0 || strpos($_REQUEST['set_gz'], 'dlattach') !== false) Chris@76: fatal_lang_error('not_on_simplemachines'); Chris@76: Chris@76: $extracted = read_tgz_file($_REQUEST['set_gz'], $boarddir . '/Smileys/' . $name); Chris@76: } Chris@76: else Chris@76: redirectexit('action=admin;area=smileys'); Chris@76: Chris@76: updateSettings(array( Chris@76: 'smiley_sets_known' => $modSettings['smiley_sets_known'] . ',' . $name, Chris@76: 'smiley_sets_names' => $modSettings['smiley_sets_names'] . "\n" . strtok(basename(isset($_FILES['set_gz']) ? $_FILES['set_gz']['name'] : $_REQUEST['set_gz']), '.'), Chris@76: )); Chris@76: Chris@76: cache_put_data('parsing_smileys', null, 480); Chris@76: cache_put_data('posting_smileys', null, 480); Chris@76: Chris@76: // !!! Add some confirmation? Chris@76: redirectexit('action=admin;area=smileys'); Chris@76: } Chris@76: Chris@76: // A function to import new smileys from an existing directory into the database. Chris@76: function ImportSmileys($smileyPath) Chris@76: { Chris@76: global $modSettings, $smcFunc; Chris@76: Chris@76: if (empty($modSettings['smileys_dir']) || !is_dir($modSettings['smileys_dir'] . '/' . $smileyPath)) Chris@76: fatal_lang_error('smiley_set_unable_to_import'); Chris@76: Chris@76: $smileys = array(); Chris@76: $dir = dir($modSettings['smileys_dir'] . '/' . $smileyPath); Chris@76: while ($entry = $dir->read()) Chris@76: { Chris@76: if (in_array(strrchr($entry, '.'), array('.jpg', '.gif', '.jpeg', '.png'))) Chris@76: $smileys[strtolower($entry)] = $entry; Chris@76: } Chris@76: $dir->close(); Chris@76: Chris@76: // Exclude the smileys that are already in the database. Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT filename Chris@76: FROM {db_prefix}smileys Chris@76: WHERE filename IN ({array_string:smiley_list})', Chris@76: array( Chris@76: 'smiley_list' => $smileys, Chris@76: ) Chris@76: ); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: if (isset($smileys[strtolower($row['filename'])])) Chris@76: unset($smileys[strtolower($row['filename'])]); Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT MAX(smiley_order) Chris@76: FROM {db_prefix}smileys Chris@76: WHERE hidden = {int:postform} Chris@76: AND smiley_row = {int:first_row}', Chris@76: array( Chris@76: 'postform' => 0, Chris@76: 'first_row' => 0, Chris@76: ) Chris@76: ); Chris@76: list ($smiley_order) = $smcFunc['db_fetch_row']($request); Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: $new_smileys = array(); Chris@76: foreach ($smileys as $smiley) Chris@76: if (strlen($smiley) <= 48) Chris@76: $new_smileys[] = array(':' . strtok($smiley, '.') . ':', $smiley, strtok($smiley, '.'), 0, ++$smiley_order); Chris@76: Chris@76: if (!empty($new_smileys)) Chris@76: { Chris@76: $smcFunc['db_insert']('', Chris@76: '{db_prefix}smileys', Chris@76: array( Chris@76: 'code' => 'string-30', 'filename' => 'string-48', 'description' => 'string-80', 'smiley_row' => 'int', 'smiley_order' => 'int', Chris@76: ), Chris@76: $new_smileys, Chris@76: array('id_smiley') Chris@76: ); Chris@76: Chris@76: // Make sure the smiley codes are still in the right order. Chris@76: sortSmileyTable(); Chris@76: Chris@76: cache_put_data('parsing_smileys', null, 480); Chris@76: cache_put_data('posting_smileys', null, 480); Chris@76: } Chris@76: } Chris@76: Chris@76: function EditMessageIcons() Chris@76: { Chris@76: global $user_info, $modSettings, $context, $settings, $txt; Chris@76: global $boarddir, $smcFunc, $scripturl, $sourcedir; Chris@76: Chris@76: // Get a list of icons. Chris@76: $context['icons'] = array(); Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT m.id_icon, m.title, m.filename, m.icon_order, m.id_board, b.name AS board_name Chris@76: FROM {db_prefix}message_icons AS m Chris@76: LEFT JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board) Chris@76: WHERE ({query_see_board} OR b.id_board IS NULL)', Chris@76: array( Chris@76: ) Chris@76: ); Chris@76: $last_icon = 0; Chris@76: $trueOrder = 0; Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: { Chris@76: $context['icons'][$row['id_icon']] = array( Chris@76: 'id' => $row['id_icon'], Chris@76: 'title' => $row['title'], Chris@76: 'filename' => $row['filename'], Chris@76: 'image_url' => $settings[file_exists($settings['theme_dir'] . '/images/post/' . $row['filename'] . '.gif') ? 'actual_images_url' : 'default_images_url'] . '/post/' . $row['filename'] . '.gif', Chris@76: 'board_id' => $row['id_board'], Chris@76: 'board' => empty($row['board_name']) ? $txt['icons_edit_icons_all_boards'] : $row['board_name'], Chris@76: 'order' => $row['icon_order'], Chris@76: 'true_order' => $trueOrder++, Chris@76: 'after' => $last_icon, Chris@76: ); Chris@76: $last_icon = $row['id_icon']; Chris@76: } Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: // Submitting a form? Chris@76: if (isset($_POST[$context['session_var']])) Chris@76: { Chris@76: checkSession(); Chris@76: Chris@76: // Deleting icons? Chris@76: if (isset($_POST['delete']) && !empty($_POST['checked_icons'])) Chris@76: { Chris@76: $deleteIcons = array(); Chris@76: foreach ($_POST['checked_icons'] as $icon) Chris@76: $deleteIcons[] = (int) $icon; Chris@76: Chris@76: // Do the actual delete! Chris@76: $smcFunc['db_query']('', ' Chris@76: DELETE FROM {db_prefix}message_icons Chris@76: WHERE id_icon IN ({array_int:icon_list})', Chris@76: array( Chris@76: 'icon_list' => $deleteIcons, Chris@76: ) Chris@76: ); Chris@76: } Chris@76: // Editing/Adding an icon? Chris@76: elseif ($context['sub_action'] == 'editicon' && isset($_GET['icon'])) Chris@76: { Chris@76: $_GET['icon'] = (int) $_GET['icon']; Chris@76: Chris@76: // Do some preperation with the data... like check the icon exists *somewhere* Chris@76: if (strpos($_POST['icon_filename'], '.gif') !== false) Chris@76: $_POST['icon_filename'] = substr($_POST['icon_filename'], 0, -4); Chris@76: if (!file_exists($settings['default_theme_dir'] . '/images/post/' . $_POST['icon_filename'] . '.gif')) Chris@76: fatal_lang_error('icon_not_found'); Chris@76: // There is a 16 character limit on message icons... Chris@76: elseif (strlen($_POST['icon_filename']) > 16) Chris@76: fatal_lang_error('icon_name_too_long'); Chris@76: elseif ($_POST['icon_location'] == $_GET['icon'] && !empty($_GET['icon'])) Chris@76: fatal_lang_error('icon_after_itself'); Chris@76: Chris@76: // First do the sorting... if this is an edit reduce the order of everything after it by one ;) Chris@76: if ($_GET['icon'] != 0) Chris@76: { Chris@76: $oldOrder = $context['icons'][$_GET['icon']]['true_order']; Chris@76: foreach ($context['icons'] as $id => $data) Chris@76: if ($data['true_order'] > $oldOrder) Chris@76: $context['icons'][$id]['true_order']--; Chris@76: } Chris@76: Chris@76: // If there are no existing icons and this is a new one, set the id to 1 (mainly for non-mysql) Chris@76: if (empty($_GET['icon']) && empty($context['icons'])) Chris@76: $_GET['icon'] = 1; Chris@76: Chris@76: // Get the new order. Chris@76: $newOrder = $_POST['icon_location'] == 0 ? 0 : $context['icons'][$_POST['icon_location']]['true_order'] + 1; Chris@76: // Do the same, but with the one that used to be after this icon, done to avoid conflict. Chris@76: foreach ($context['icons'] as $id => $data) Chris@76: if ($data['true_order'] >= $newOrder) Chris@76: $context['icons'][$id]['true_order']++; Chris@76: Chris@76: // Finally set the current icon's position! Chris@76: $context['icons'][$_GET['icon']]['true_order'] = $newOrder; Chris@76: Chris@76: // Simply replace the existing data for the other bits. Chris@76: $context['icons'][$_GET['icon']]['title'] = $_POST['icon_description']; Chris@76: $context['icons'][$_GET['icon']]['filename'] = $_POST['icon_filename']; Chris@76: $context['icons'][$_GET['icon']]['board_id'] = (int) $_POST['icon_board']; Chris@76: Chris@76: // Do a huge replace ;) Chris@76: $iconInsert = array(); Chris@76: $iconInsert_new = array(); Chris@76: foreach ($context['icons'] as $id => $icon) Chris@76: { Chris@76: if ($id != 0) Chris@76: { Chris@76: $iconInsert[] = array($id, $icon['board_id'], $icon['title'], $icon['filename'], $icon['true_order']); Chris@76: } Chris@76: else Chris@76: { Chris@76: $iconInsert_new[] = array($icon['board_id'], $icon['title'], $icon['filename'], $icon['true_order']); Chris@76: } Chris@76: } Chris@76: Chris@76: $smcFunc['db_insert']('replace', Chris@76: '{db_prefix}message_icons', Chris@76: array('id_icon' => 'int', 'id_board' => 'int', 'title' => 'string-80', 'filename' => 'string-80', 'icon_order' => 'int'), Chris@76: $iconInsert, Chris@76: array('id_icon') Chris@76: ); Chris@76: Chris@76: if (!empty($iconInsert_new)) Chris@76: { Chris@76: $smcFunc['db_insert']('replace', Chris@76: '{db_prefix}message_icons', Chris@76: array('id_board' => 'int', 'title' => 'string-80', 'filename' => 'string-80', 'icon_order' => 'int'), Chris@76: $iconInsert_new, Chris@76: array('id_icon') Chris@76: ); Chris@76: } Chris@76: } Chris@76: Chris@76: // Sort by order, so it is quicker :) Chris@76: $smcFunc['db_query']('alter_table_icons', ' Chris@76: ALTER TABLE {db_prefix}message_icons Chris@76: ORDER BY icon_order', Chris@76: array( Chris@76: 'db_error_skip' => true, Chris@76: ) Chris@76: ); Chris@76: Chris@76: // Unless we're adding a new thing, we'll escape Chris@76: if (!isset($_POST['add'])) Chris@76: redirectexit('action=admin;area=smileys;sa=editicons'); Chris@76: } Chris@76: Chris@76: $context[$context['admin_menu_name']]['current_subsection'] = 'editicons'; Chris@76: Chris@76: $listOptions = array( Chris@76: 'id' => 'message_icon_list', Chris@76: 'base_href' => $scripturl . '?action=admin;area=smileys;sa=editicons', Chris@76: 'get_items' => array( Chris@76: 'function' => 'list_getMessageIcons', Chris@76: ), Chris@76: 'no_items_label' => $txt['icons_no_entries'], Chris@76: 'columns' => array( Chris@76: 'icon' => array( Chris@76: 'data' => array( Chris@76: 'function' => create_function('$rowData', ' Chris@76: global $settings; Chris@76: Chris@76: $images_url = $settings[file_exists(sprintf(\'%1$s/images/post/%2$s.gif\', $settings[\'theme_dir\'], $rowData[\'filename\'])) ? \'actual_images_url\' : \'default_images_url\']; Chris@76: return sprintf(\'%3$s\', $images_url, $rowData[\'filename\'], htmlspecialchars($rowData[\'title\'])); Chris@76: '), Chris@76: ), Chris@76: 'style' => 'text-align: center;', Chris@76: ), Chris@76: 'filename' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['smileys_filename'], Chris@76: ), Chris@76: 'data' => array( Chris@76: 'sprintf' => array( Chris@76: 'format' => '%1$s.gif', Chris@76: 'params' => array( Chris@76: 'filename' => true, Chris@76: ), Chris@76: ), Chris@76: ), Chris@76: ), Chris@76: 'tooltip' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['smileys_description'], Chris@76: ), Chris@76: 'data' => array( Chris@76: 'db_htmlsafe' => 'title', Chris@76: 'class' => 'windowbg', Chris@76: ), Chris@76: ), Chris@76: 'board' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['icons_board'], Chris@76: ), Chris@76: 'data' => array( Chris@76: 'function' => create_function('$rowData', ' Chris@76: global $txt; Chris@76: Chris@76: return empty($rowData[\'board_name\']) ? $txt[\'icons_edit_icons_all_boards\'] : $rowData[\'board_name\']; Chris@76: '), Chris@76: ), Chris@76: ), Chris@76: 'modify' => array( Chris@76: 'header' => array( Chris@76: 'value' => $txt['smileys_modify'], Chris@76: ), Chris@76: 'data' => array( Chris@76: 'sprintf' => array( Chris@76: 'format' => '' . $txt['smileys_modify'] . '', Chris@76: 'params' => array( Chris@76: 'id_icon' => false, Chris@76: ), Chris@76: ), Chris@76: 'style' => 'text-align: center', Chris@76: ), Chris@76: ), Chris@76: 'check' => array( Chris@76: 'header' => array( Chris@76: 'value' => '', Chris@76: ), Chris@76: 'data' => array( Chris@76: 'sprintf' => array( Chris@76: 'format' => '', Chris@76: 'params' => array( Chris@76: 'id_icon' => false, Chris@76: ), Chris@76: ), Chris@76: 'style' => 'text-align: center', Chris@76: ), Chris@76: ), Chris@76: ), Chris@76: 'form' => array( Chris@76: 'href' => $scripturl . '?action=admin;area=smileys;sa=editicons', Chris@76: ), Chris@76: 'additional_rows' => array( Chris@76: array( Chris@76: 'position' => 'below_table_data', Chris@76: 'value' => '[' . $txt['icons_add_new'] . ']', Chris@76: ), Chris@76: ), Chris@76: ); Chris@76: Chris@76: require_once($sourcedir . '/Subs-List.php'); Chris@76: createList($listOptions); Chris@76: Chris@76: // If we're adding/editing an icon we'll need a list of boards Chris@76: if ($context['sub_action'] == 'editicon' || isset($_POST['add'])) Chris@76: { Chris@76: // Force the sub_template just in case. Chris@76: $context['sub_template'] = 'editicon'; Chris@76: Chris@76: $context['new_icon'] = !isset($_GET['icon']); Chris@76: Chris@76: // Get the properties of the current icon from the icon list. Chris@76: if (!$context['new_icon']) Chris@76: $context['icon'] = $context['icons'][$_GET['icon']]; Chris@76: Chris@76: // Get a list of boards needed for assigning this icon to a specific board. Chris@76: $boardListOptions = array( Chris@76: 'use_permissions' => true, Chris@76: 'selected_board' => isset($context['icon']['board_id']) ? $context['icon']['board_id'] : 0, Chris@76: ); Chris@76: require_once($sourcedir . '/Subs-MessageIndex.php'); Chris@76: $context['categories'] = getBoardList($boardListOptions); Chris@76: } Chris@76: } Chris@76: Chris@76: function list_getMessageIcons($start, $items_per_page, $sort) Chris@76: { Chris@76: global $smcFunc, $user_info; Chris@76: Chris@76: $request = $smcFunc['db_query']('', ' Chris@76: SELECT m.id_icon, m.title, m.filename, m.icon_order, m.id_board, b.name AS board_name Chris@76: FROM {db_prefix}message_icons AS m Chris@76: LEFT JOIN {db_prefix}boards AS b ON (b.id_board = m.id_board) Chris@76: WHERE ({query_see_board} OR b.id_board IS NULL)', Chris@76: array( Chris@76: ) Chris@76: ); Chris@76: Chris@76: $message_icons = array(); Chris@76: while ($row = $smcFunc['db_fetch_assoc']($request)) Chris@76: $message_icons[] = $row; Chris@76: $smcFunc['db_free_result']($request); Chris@76: Chris@76: return $message_icons; Chris@76: } Chris@76: Chris@76: // This function sorts the smiley table by code length, it is needed as MySQL withdrew support for functions in order by. Chris@76: function sortSmileyTable() Chris@76: { Chris@76: global $smcFunc; Chris@76: Chris@76: db_extend('packages'); Chris@76: Chris@76: // Add a sorting column. Chris@76: $smcFunc['db_add_column']('{db_prefix}smileys', array('name' => 'temp_order', 'size' => 8, 'type' => 'mediumint', 'null' => false)); Chris@76: Chris@76: // Set the contents of this column. Chris@76: $smcFunc['db_query']('set_smiley_order', ' Chris@76: UPDATE {db_prefix}smileys Chris@76: SET temp_order = LENGTH(code)', Chris@76: array( Chris@76: ) Chris@76: ); Chris@76: Chris@76: // Order the table by this column. Chris@76: $smcFunc['db_query']('alter_table_smileys', ' Chris@76: ALTER TABLE {db_prefix}smileys Chris@76: ORDER BY temp_order DESC', Chris@76: array( Chris@76: 'db_error_skip' => true, Chris@76: ) Chris@76: ); Chris@76: Chris@76: // Remove the sorting column. Chris@76: $smcFunc['db_remove_column']('{db_prefix}smileys', 'temp_order'); Chris@76: } Chris@76: Chris@76: ?>