function pretty_run_maintenance($installing = false) { global $boarddir, $context, $modSettings, $smcFunc; $context['pretty']['maintenance_tasks'] = array(); // Get the array of actions $indexphp = file_get_contents($boarddir . '/index.php'); preg_match('~actionArray\\s*=\\s*array[^;]+~', $indexphp, $actionArrayText); preg_match_all('~\'([^\']+)\'\\s*=>~', $actionArrayText[0], $actionArray, PREG_PATTERN_ORDER); $context['pretty']['action_array'] = $actionArray[1]; if (function_exists('call_integration_hook')) { $dummy = array(); call_integration_hook('integrate_actions', array(&$dummy)); $context['pretty']['action_array'] += array_keys($dummy); } $context['pretty']['maintenance_tasks'][] = 'Updating the array of actions'; // Update the list of boards // Get the current pretty board urls, or make new arrays if there are none $pretty_board_urls = isset($modSettings['pretty_board_urls']) ? unserialize($modSettings['pretty_board_urls']) : array(); $pretty_board_lookup_old = isset($modSettings['pretty_board_lookup']) ? unserialize($modSettings['pretty_board_lookup']) : array(); // Fix old boards by replacing ' with \x12 $pretty_board_urls = str_replace("'", "", $pretty_board_urls); $pretty_board_lookup = array(); foreach ($pretty_board_lookup_old as $board => $id) { $pretty_board_lookup[str_replace("'", "", $board)] = $id; } // Fix old topics too $smcFunc['db_query']('', ' UPDATE {db_prefix}pretty_topic_urls SET pretty_url = REPLACE(pretty_url, {string:old_quote}, {string:new_quote})', array('old_quote' => "'", 'new_quote' => "", 'db_error_skip' => true)); $context['pretty']['maintenance_tasks'][] = 'Fixing any old boards and topics with broken quotes'; // Get the board names $query = $smcFunc['db_query']('', "\n\t\tSELECT id_board, name\n\t\tFROM {db_prefix}boards"); // Process each board while ($row = $smcFunc['db_fetch_assoc']($query)) { // Don't replace the board urls if they already exist if (!isset($pretty_board_urls[$row['id_board']]) || $pretty_board_urls[$row['id_board']] == '' || in_array($row['id_board'], $pretty_board_lookup) === false) { $pretty_text = pretty_generate_url($row['name']); // We need to have something to refer to this board by... if ($pretty_text == '') { // ... so use 'bID_BOARD' $pretty_text = 'b' . $row['id_board']; } // Numerical or duplicate URLs aren't allowed! if (is_numeric($pretty_text) || isset($pretty_board_lookup[$pretty_text]) || in_array($pretty_text, $context['pretty']['action_array'])) { // Add suffix '-ID_BOARD' to the pretty url $pretty_text .= ($pretty_text != '' ? '-' : 'b') . $row['id_board']; } // Update the arrays $pretty_board_urls[$row['id_board']] = $pretty_text; $pretty_board_lookup[$pretty_text] = $row['id_board']; } elseif (in_array($pretty_board_urls[$row['id_board']], $context['pretty']['action_array'])) { $pretty_text = $pretty_board_urls[$row['id_board']] . '-' . $row['id_board']; $pretty_board_urls[$row['id_board']] = $pretty_text; $pretty_board_lookup[$pretty_text] = $row['id_board']; } } $smcFunc['db_free_result']($query); $context['pretty']['maintenance_tasks'][] = 'Updating board URLs'; // Update the database updateSettings(array('pretty_action_array' => serialize($context['pretty']['action_array']), 'pretty_board_lookup' => serialize($pretty_board_lookup), 'pretty_board_urls' => serialize($pretty_board_urls))); // Update the filter callbacks pretty_update_filters($installing); $context['pretty']['maintenance_tasks'][] = 'Update the filters'; }
function pretty_urls_topic_filter($urls) { global $context, $db_prefix, $modSettings, $scripturl, $sourcedir; $pattern = '`' . $scripturl . '(.*[?;&])topic=([.a-zA-Z0-9]+)(.*)`S'; $query_data = array(); foreach ($urls as $url_id => $url) { // Get the topic data ready to query the database with if (!isset($url['replacement'])) { if (preg_match($pattern, $url['url'], $matches)) { if (strpos($matches[2], '.') !== false) { list($urls[$url_id]['topic_id'], $urls[$url_id]['start']) = explode('.', $matches[2]); } else { $urls[$url_id]['topic_id'] = $matches[2]; $urls[$url_id]['start'] = '0'; } $urls[$url_id]['topic_id'] = (int) $urls[$url_id]['topic_id']; $urls[$url_id]['match1'] = $matches[1]; $urls[$url_id]['match3'] = $matches[3]; $query_data[] = $urls[$url_id]['topic_id']; } } } // Query the database with these topic IDs if (count($query_data) != 0) { // Look for existing topic URLs $query_data = array_keys(array_flip($query_data)); $topicData = array(); $unpretty_topics = array(); $query = db_query("\n\t\t\tSELECT t.ID_TOPIC, t.ID_BOARD, p.pretty_url\n\t\t\tFROM {$db_prefix}topics AS t\n\t\t\t\tLEFT JOIN {$db_prefix}pretty_topic_urls AS p ON (t.ID_TOPIC = p.ID_TOPIC)\n\t\t\tWHERE t.ID_TOPIC IN (" . implode(', ', $query_data) . ")", __FILE__, __LINE__); while ($row = mysql_fetch_assoc($query)) { if (isset($row['pretty_url'])) { $topicData[$row['ID_TOPIC']] = array('pretty_board' => isset($context['pretty']['board_urls'][$row['ID_BOARD']]) ? $context['pretty']['board_urls'][$row['ID_BOARD']] : $row['ID_BOARD'], 'pretty_url' => $row['pretty_url']); } else { $unpretty_topics[] = $row['ID_TOPIC']; } } mysql_free_result($query); // Generate new topic URLs if required if (count($unpretty_topics) != 0) { require_once $sourcedir . '/Subs-PrettyUrls.php'; // Get the topic subjects $new_topics = array(); $new_urls = array(); $query_check = array(); $existing_urls = array(); $add_new = array(); $query = db_query("\n\t\t\t\tSELECT t.ID_TOPIC, t.ID_BOARD, m.subject\n\t\t\t\tFROM {$db_prefix}topics AS t\n\t\t\t\t\tINNER JOIN {$db_prefix}messages AS m ON (m.ID_MSG = t.ID_FIRST_MSG)\n\t\t\t\tWHERE t.ID_TOPIC IN (" . implode(', ', $unpretty_topics) . ')', __FILE__, __LINE__); while ($row = mysql_fetch_assoc($query)) { $new_topics[] = array('ID_TOPIC' => $row['ID_TOPIC'], 'ID_BOARD' => $row['ID_BOARD'], 'subject' => $row['subject']); } mysql_free_result($query); // Generate URLs for each new topic foreach ($new_topics as $row) { $pretty_text = substr(pretty_generate_url($row['subject']), 0, 80); // A topic in the recycle board doesn't deserve a proper URL if ($modSettings['recycle_enable'] && $row['ID_BOARD'] == $modSettings['recycle_board'] || $pretty_text == '') { // Use 'tID_TOPIC' as a pretty url $pretty_text = 't' . $row['ID_TOPIC']; } // No duplicates and no numerical URLs - that would just confuse everyone! if (in_array($pretty_text, $new_urls) || is_numeric($pretty_text)) { // Add suffix '-ID_TOPIC' to the pretty url $pretty_text = substr($pretty_text, 0, 70) . '-' . $row['ID_TOPIC']; } $query_check[] = '\'' . addslashes($pretty_text) . '\''; $new_urls[$row['ID_TOPIC']] = $pretty_text; } // Find any duplicates of existing URLs if (!empty($query_check)) { $query = db_query("\n \t\t\t\tSELECT pretty_url\n \t\t\t\tFROM {$db_prefix}pretty_topic_urls\n \t\t\t\tWHERE pretty_url IN (" . implode(', ', $query_check) . ')', __FILE__, __LINE__); while ($row = mysql_fetch_assoc($query)) { $existing_urls[] = $row['pretty_url']; } mysql_free_result($query); } // Finalise the new URLs ... foreach ($new_topics as $row) { $pretty_text = $new_urls[$row['ID_TOPIC']]; // Check if the new URL is already in use if (in_array($pretty_text, $existing_urls)) { $pretty_text = substr($pretty_text, 0, 70) . '-' . $row['ID_TOPIC']; } $add_new[] = '(' . $row['ID_TOPIC'] . ', \'' . addslashes($pretty_text) . '\')'; // Add to the original array of topic URLs $topicData[$row['ID_TOPIC']] = array('pretty_board' => isset($context['pretty']['board_urls'][$row['ID_BOARD']]) ? $context['pretty']['board_urls'][$row['ID_BOARD']] : $row['ID_BOARD'], 'pretty_url' => $pretty_text); } // ... and add them to the database! db_query("\n\t\t\t\tINSERT IGNORE INTO {$db_prefix}pretty_topic_urls\n\t\t\t\t\t(ID_TOPIC, pretty_url)\n\t\t\t\tVALUES " . implode(', ', $add_new), __FILE__, __LINE__); } // Build the replacement URLs foreach ($urls as $url_id => $url) { if (isset($url['topic_id']) && isset($topicData[$url['topic_id']])) { $start = $url['start'] != '0' || is_numeric($topicData[$url['topic_id']]['pretty_url']) ? $url['start'] . '/' : ''; $urls[$url_id]['replacement'] = $modSettings['pretty_root_url'] . '/' . $topicData[$url['topic_id']]['pretty_board'] . '/' . $topicData[$url['topic_id']]['pretty_url'] . '/' . $start . $url['match1'] . $url['match3']; } } } return $urls; }
function pretty_urls_topic_filter($urls) { global $context, $modSettings, $scripturl, $smcFunc, $sourcedir; $pattern = '`' . $scripturl . '(.*[?;&])topic=([.a-zA-Z0-9]+)(.*)`S'; $query_data = array(); foreach ($urls as $url_id => $url) { // Get the topic data ready to query the database with if (!isset($url['replacement'])) { if (preg_match($pattern, $url['url'], $matches)) { if (strpos($matches[2], '.') !== false) { list($urls[$url_id]['topic_id'], $urls[$url_id]['start']) = explode('.', $matches[2]); } else { $urls[$url_id]['topic_id'] = $matches[2]; $urls[$url_id]['start'] = '0'; } $urls[$url_id]['topic_id'] = (int) $urls[$url_id]['topic_id']; $urls[$url_id]['match1'] = $matches[1]; $urls[$url_id]['match3'] = $matches[3]; $query_data[] = $urls[$url_id]['topic_id']; } } } // Query the database with these topic IDs if (count($query_data) != 0) { // Look for existing topic URLs $query_data = array_keys(array_flip($query_data)); $topicData = array(); $unpretty_topics = array(); $query = $smcFunc['db_query']('', ' SELECT t.id_topic, t.id_board, p.pretty_url FROM {db_prefix}topics AS t LEFT JOIN {db_prefix}pretty_topic_urls AS p ON (t.id_topic = p.id_topic) WHERE t.id_topic IN ({array_int:topic_ids})', array('topic_ids' => $query_data)); while ($row = $smcFunc['db_fetch_assoc']($query)) { if (isset($row['pretty_url'])) { $topicData[$row['id_topic']] = array('pretty_board' => isset($context['pretty']['board_urls'][$row['id_board']]) ? $context['pretty']['board_urls'][$row['id_board']] : $row['id_board'], 'pretty_url' => $row['pretty_url']); } else { $unpretty_topics[] = $row['id_topic']; } } $smcFunc['db_free_result']($query); // Generate new topic URLs if required if (count($unpretty_topics) != 0) { require_once $sourcedir . '/Subs-PrettyUrls.php'; // Get the topic subjects $new_topics = array(); $new_urls = array(); $query_check = array(); $existing_urls = array(); $add_new = array(); $query = $smcFunc['db_query']('', ' SELECT t.id_topic, t.id_board, m.subject FROM {db_prefix}topics AS t INNER JOIN {db_prefix}messages AS m ON (m.id_msg = t.id_first_msg) WHERE t.id_topic IN ({array_int:topic_ids})', array('topic_ids' => $unpretty_topics)); while ($row = $smcFunc['db_fetch_assoc']($query)) { $new_topics[] = array('id_topic' => $row['id_topic'], 'id_board' => $row['id_board'], 'subject' => $row['subject']); } $smcFunc['db_free_result']($query); // Generate URLs for each new topic foreach ($new_topics as $row) { $pretty_text = substr(pretty_generate_url($row['subject']), 0, 80); // A topic in the recycle board doesn't deserve a proper URL if ($modSettings['recycle_enable'] && $row['id_board'] == $modSettings['recycle_board'] || $pretty_text == '') { // Use 'tID_TOPIC' as a pretty url $pretty_text = 't' . $row['id_topic']; } // No duplicates and no numerical URLs - that would just confuse everyone! if (in_array($pretty_text, $new_urls) || is_numeric($pretty_text)) { // Add suffix '-ID_TOPIC' to the pretty url $pretty_text = substr($pretty_text, 0, 70) . '-' . $row['id_topic']; } $query_check[] = $pretty_text; $new_urls[$row['id_topic']] = $pretty_text; } // Find any duplicates of existing URLs if (!empty($query_check)) { $query = $smcFunc['db_query']('', ' SELECT pretty_url FROM {db_prefix}pretty_topic_urls WHERE pretty_url IN ({array_string:new_urls})', array('new_urls' => $query_check)); while ($row = $smcFunc['db_fetch_assoc']($query)) { $existing_urls[] = $row['pretty_url']; } $smcFunc['db_free_result']($query); } // Finalise the new URLs ... foreach ($new_topics as $row) { $pretty_text = $new_urls[$row['id_topic']]; // Check if the new URL is already in use if (in_array($pretty_text, $existing_urls)) { $pretty_text = substr($pretty_text, 0, 70) . '-' . $row['id_topic']; } $add_new[] = array($row['id_topic'], $pretty_text); // Add to the original array of topic URLs $topicData[$row['id_topic']] = array('pretty_board' => isset($context['pretty']['board_urls'][$row['id_board']]) ? $context['pretty']['board_urls'][$row['id_board']] : $row['id_board'], 'pretty_url' => $pretty_text); } // ... and add them to the database! $smcFunc['db_insert']('', '{db_prefix}pretty_topic_urls', array('id_topic' => 'int', 'pretty_url' => 'string'), $add_new, array()); } // Build the replacement URLs foreach ($urls as $url_id => $url) { if (isset($url['topic_id']) && isset($topicData[$url['topic_id']])) { $start = $url['start'] != '0' || is_numeric($topicData[$url['topic_id']]['pretty_url']) ? $url['start'] . '/' : ''; $urls[$url_id]['replacement'] = $modSettings['pretty_root_url'] . '/' . $topicData[$url['topic_id']]['pretty_board'] . '/' . $topicData[$url['topic_id']]['pretty_url'] . '/' . $start . $url['match1'] . $url['match3']; } } } return $urls; }
function pretty_run_maintenance($installing = false) { global $boarddir, $context, $db_prefix, $modSettings; $context['pretty']['maintenance_tasks'] = array(); // Get the array of actions $indexphp = file_get_contents($boarddir . '/index.php'); preg_match('~actionArray\\s*=\\s*array[^;]+~', $indexphp, $actionArrayText); preg_match_all('~\'([^\']+)\'\\s*=>~', $actionArrayText[0], $actionArray, PREG_PATTERN_ORDER); $context['pretty']['action_array'] = $actionArray[1]; $context['pretty']['maintenance_tasks'][] = 'Updating the array of actions'; // Update the list of boards // Get the current pretty board urls, or make new arrays if there are none $pretty_board_urls = isset($modSettings['pretty_board_urls']) ? unserialize($modSettings['pretty_board_urls']) : array(); $pretty_board_lookup_old = isset($modSettings['pretty_board_lookup']) ? unserialize($modSettings['pretty_board_lookup']) : array(); // Fix old boards by replacing ' with \x12 $pretty_board_urls = str_replace("'", "", $pretty_board_urls); $pretty_board_lookup = array(); foreach ($pretty_board_lookup_old as $board => $id) { $pretty_board_lookup[str_replace("'", "", $board)] = $id; } // Fix old topics too db_query("\n\t\tUPDATE {$db_prefix}pretty_topic_urls\n\t\tSET pretty_url = REPLACE(pretty_url, '\\'', '" . chr(18) . "')", __FILE__, __LINE__); $context['pretty']['maintenance_tasks'][] = 'Fixing any old boards and topics with broken quotes'; // Get the board names $query = db_query("\n\t\tSELECT ID_BOARD, name\n\t\tFROM {$db_prefix}boards", __FILE__, __LINE__); // Process each board while ($row = mysql_fetch_assoc($query)) { // Don't replace the board urls if they already exist if (!isset($pretty_board_urls[$row['ID_BOARD']]) || $pretty_board_urls[$row['ID_BOARD']] == '' || in_array($row['ID_BOARD'], $pretty_board_lookup) === false) { $pretty_text = pretty_generate_url($row['name']); // We need to have something to refer to this board by... if ($pretty_text == '') { // ... so use 'bID_BOARD' $pretty_text = 'b' . $row['ID_BOARD']; } // Numerical or duplicate URLs aren't allowed! if (is_numeric($pretty_text) || isset($pretty_board_lookup[$pretty_text]) || in_array($pretty_text, $context['pretty']['action_array'])) { // Add suffix '-ID_BOARD' to the pretty url $pretty_text .= ($pretty_text != '' ? '-' : 'b') . $row['ID_BOARD']; } // Update the arrays $pretty_board_urls[$row['ID_BOARD']] = $pretty_text; $pretty_board_lookup[$pretty_text] = $row['ID_BOARD']; } elseif (in_array($pretty_board_urls[$row['ID_BOARD']], $context['pretty']['action_array'])) { $pretty_text = $pretty_board_urls[$row['ID_BOARD']] . '-' . $row['ID_BOARD']; $pretty_board_urls[$row['ID_BOARD']] = $pretty_text; $pretty_board_lookup[$pretty_text] = $row['ID_BOARD']; } } mysql_free_result($query); $context['pretty']['maintenance_tasks'][] = 'Updating board URLs'; // Update the database updateSettings(array('pretty_action_array' => addslashes(serialize($context['pretty']['action_array'])), 'pretty_board_lookup' => addslashes(serialize($pretty_board_lookup)), 'pretty_board_urls' => addslashes(serialize($pretty_board_urls)))); // Update the filter callbacks pretty_update_filters($installing); $context['pretty']['maintenance_tasks'][] = 'Update the filters'; }