public function getDataSet() { $this->db = $this->new_dbal(); $db_tools = new \phpbb\db\tools($this->db); // user_dst doesn't exist anymore, must re-add it to test this $db_tools->sql_column_add('phpbb_users', 'user_dst', array('BOOL', 1)); return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/convert_timezones.xml'); }
public function effectively_installed() { // This handles upgrades from the phpBB Digests mod for phpBB 3.0.x to this extension, allowing configuration and user settings to be preserved // if possible. Versions 2.2.6 through 2.2.27 are supported. global $user, $cache, $phpbb_root_path, $phpEx; $user->add_lang_ext('phpbbservices/digests', array('info_acp_common', 'common')); if (!$this->config['digests_version']) { return false; // Digests not previously installed, so go ahead and do a clean install } // If the version of the digests mod is old (prior to 2.2.6, the first officially approved digests mod for 3.0) or is more than the last version // 2.2.27 then this migrator cannot be used. if (version_compare($this->config['digests_version'], '2.2.6') === -1 && version_compare($this->config['digests_version'], '2.2.27') === 1) { $message_type = E_USER_WARNING; trigger_error($user->lang('DIGESTS_MIGRATE_UNSUPPORTED_VERSION', $this->config['digests_version']), $message_type); return false; } // To upgrade from 2.2.6 or greater, the basic approach is to compare arrays of configuration variables and database column names. // Remove what has gone away, add what is missing. // Load the new configuration values array $new_config = array('digests_block_images' => 0, 'digests_cron_task_last_gc' => 0, 'digests_cron_task_gc' => 60 * 60, 'digests_custom_stylesheet_path' => 'prosilver/theme/digest_stylesheet.css', 'digests_enable_auto_subscriptions' => 0, 'digests_enable_custom_stylesheets' => 0, 'digests_enable_log' => 0, 'digests_enable_subscribe_unsubscribe' => '0', 'digests_exclude_forums' => '0', 'digests_from_email_name' => '', 'digests_from_email_address' => '', 'digests_host' => 'phpbbservices.com', 'digests_include_admins' => '0', 'digests_include_forums' => '0', 'digests_max_items' => 0, 'digests_notify_on_admin_changes', '1', 'digests_page_url' => 'https://phpbbservices.com/digests_wp/', 'digests_registration_field' => 0, 'digests_reply_to_email_address' => '', 'digests_show_email' => 0, 'digests_subscribe_all' => '1', 'digests_test' => 0, 'digests_test_clear_spool' => 1, 'digests_test_day' => 1, 'digests_test_email_address' => '', 'digests_test_hour' => 0, 'digests_test_month' => 1, 'digests_test_send_to_admin' => 0, 'digests_test_spool' => 0, 'digests_test_time_use' => 0, 'digests_test_year' => 2016, 'digests_time_zone' => make_tz_offset($this->config['board_timezone']), 'digests_user_check_all_forums' => 1, 'digests_user_digest_attachments' => 1, 'digests_user_digest_block_images' => 0, 'digests_user_digest_filter_type' => 'ALL', 'digests_user_digest_format' => 'HTML', 'digests_user_digest_max_display_words' => -1, 'digests_user_digest_max_posts' => 0, 'digests_user_digest_min_words' => 0, 'digests_user_digest_new_posts_only' => 0, 'digests_user_digest_no_post_text' => 0, 'digests_user_digest_pm_mark_read' => 0, 'digests_user_digest_registration' => 0, 'digests_user_digest_remove_foes' => 0, 'digests_user_digest_reset_lastvisit' => 0, 'digests_user_digest_send_hour_gmt' => -1, 'digests_user_digest_send_on_no_posts' => 0, 'digests_user_digest_show_mine' => 1, 'digests_user_digest_show_pms' => 1, 'digests_user_digest_sortby' => 'board', 'digests_user_digest_toc' => 0, 'digests_user_digest_type' => 'DAY', 'digests_users_per_page' => 20, 'digests_weekly_digest_day' => 0); $remove_config = array(); // If the old configuration value exists, keep its value but it must change its name to add the vendor name as a prefix foreach ($this->config as $key => $value) { if (substr($key, 0, 8) == 'digests_') { if (array_key_exists($key, $new_config)) { // add the new config value with vendor in the config_name $this->config->set('phpbbservices_' . $key, $value); } // mark the old config value for deletion once outside of the loop $remove_config[] = $key; } } // Remove the old configuration variables, i.e. digests_* rather than phpbbservices_digests_* foreach ($remove_config as $key => $value) { $this->config->delete($value); } // Add in any new configuration variables using the defaults. These were introduced by later versions of digests or are new in the extension // and all must have phpbbservices_ as a prefix. foreach ($new_config as $key => $value) { if (array_key_exists($key, $this->config) === false) { $this->config->set('phpbbservices_' . $key, $value); } } // Modify problematic configuration variables explicitly. The digests page is now in Wordpress. $this->config->set('phpbbservices_digests_page_url', 'https://phpbbservices.com/digests_wp/'); // ----- Fix users table ----- // $new_columns = array('user_digest_attachments' => array('TINT:4', 1), 'user_digest_block_images' => array('TINT:4', 0), 'user_digest_filter_type' => array('VCHAR:3', 'ALL'), 'user_digest_format' => array('VCHAR:4', 'HTML'), 'user_digest_has_unsubscribed' => array('TINT:4', 0), 'user_digest_last_sent' => array('UINT:11', 0), 'user_digest_max_display_words' => array('INT:4', 0), 'user_digest_max_posts' => array('UINT', 0), 'user_digest_min_words' => array('UINT', 0), 'user_digest_new_posts_only' => array('TINT:4', 0), 'user_digest_no_post_text' => array('TINT:4', 0), 'user_digest_pm_mark_read' => array('TINT:4', 0), 'user_digest_remove_foes' => array('TINT:4', 0), 'user_digest_reset_lastvisit' => array('TINT:4', 1), 'user_digest_send_hour_gmt' => array('DECIMAL', '0.00'), 'user_digest_send_on_no_posts' => array('TINT:4', 0), 'user_digest_show_mine' => array('TINT:4', 1), 'user_digest_show_pms' => array('TINT:4', 1), 'user_digest_sortby' => array('VCHAR:13', 'board'), 'user_digest_toc' => array('TINT:4', 0), 'user_digest_type' => array('VCHAR:4', 'NONE')); // Get a succinct array of new column names without metadata to make it easier to find missing columns $new_column_names = array_keys($new_columns); $found_digest_columns = array(); // The tools class has some convenient methods we will use to add and remove columns $tools = new \phpbb\db\tools($this->db); // Get a list of the current columns in the phpbb_users table. $user_table_columns = array_keys($tools->sql_list_columns($this->table_prefix . 'users')); // Note the columns found that start with "user_digest_" foreach ($user_table_columns as $key => $value) { if (substr($value, 0, 12) == 'user_digest_') { $found_digest_columns[] = $value; } } // Delete those columns in the phpbb_users table for digests that are no longer used $columns_to_remove = array_diff($found_digest_columns, $new_column_names); foreach ($columns_to_remove as $key => $value) { $tools->sql_column_remove($this->table_prefix . 'users', $value); } // Add those digest columns to the phpbb_users table were not in the version of the mod previously installed $columns_to_add = array_diff($new_column_names, $found_digest_columns); foreach ($columns_to_add as $key => $value) { $tools->sql_column_add($this->table_prefix . 'users', $value, array($new_columns[$value][0], $new_columns[$value][1])); } // ----- Remove old ACP Modules ----- // // Use the module class to conveniently remove dead modules as well as add new ones $modules_table = $this->table_prefix . 'modules'; $modules_tool = new \phpbb\db\migration\tool\module($this->db, $cache, $user, $phpbb_root_path, $phpEx, $modules_table); // Remove ACP modules if they exist. if ($modules_tool->exists('acp', 'ACP_DIGEST_SETTINGS', 'ACP_DIGEST_GENERAL_SETTINGS')) { $modules_tool->remove('acp', 'ACP_DIGEST_SETTINGS', 'ACP_DIGEST_GENERAL_SETTINGS'); } if ($modules_tool->exists('acp', 'ACP_DIGEST_SETTINGS', 'ACP_DIGEST_USER_DEFAULT_SETTINGS')) { $modules_tool->remove('acp', 'ACP_DIGEST_SETTINGS', 'ACP_DIGEST_USER_DEFAULT_SETTINGS'); } if ($modules_tool->exists('acp', 'ACP_DIGEST_SETTINGS', 'ACP_DIGEST_EDIT_SUBSCRIBERS')) { $modules_tool->remove('acp', 'ACP_DIGEST_SETTINGS', 'ACP_DIGEST_EDIT_SUBSCRIBERS'); } if ($modules_tool->exists('acp', 'ACP_DIGEST_SETTINGS', 'ACP_DIGEST_BALANCE_LOAD')) { $modules_tool->remove('acp', 'ACP_DIGEST_SETTINGS', 'ACP_DIGEST_BALANCE_LOAD'); } if ($modules_tool->exists('acp', 'ACP_DIGEST_SETTINGS', 'ACP_DIGEST_MASS_SUBSCRIBE_UNSUBSCRIBE')) { $modules_tool->remove('acp', 'ACP_DIGEST_SETTINGS', 'ACP_DIGEST_MASS_SUBSCRIBE_UNSUBSCRIBE'); } // Remove the digests ACP module category, originally on the general tab. It will move to the extensions tab. if ($modules_tool->exists('acp', 'ACP_CAT_GENERAL', 'ACP_DIGEST_SETTINGS')) { $modules_tool->remove('acp', 'ACP_CAT_GENERAL', 'ACP_DIGEST_SETTINGS'); } // ----- Remove UCP modules ----- // if ($modules_tool->exists('ucp', 'UCP_DIGESTS', 'UCP_DIGESTS_BASICS')) { $modules_tool->remove('ucp', 'UCP_DIGESTS', 'UCP_DIGESTS_BASICS'); } if ($modules_tool->exists('ucp', 'UCP_DIGESTS', 'UCP_DIGESTS_POSTS_SELECTION')) { $modules_tool->remove('ucp', 'UCP_DIGESTS', 'UCP_DIGESTS_POSTS_SELECTION'); } if ($modules_tool->exists('ucp', 'UCP_DIGESTS', 'UCP_DIGESTS_FORUMS_SELECTION')) { $modules_tool->remove('ucp', 'UCP_DIGESTS', 'UCP_DIGESTS_FORUMS_SELECTION'); } if ($modules_tool->exists('ucp', 'UCP_DIGESTS', 'UCP_DIGESTS_POST_FILTERS')) { $modules_tool->remove('ucp', 'UCP_DIGESTS', 'UCP_DIGESTS_POST_FILTERS'); } if ($modules_tool->exists('ucp', 'UCP_DIGESTS', 'UCP_DIGESTS_ADDITIONAL_CRITERIA')) { $modules_tool->remove('ucp', 'UCP_DIGESTS', 'UCP_DIGESTS_ADDITIONAL_CRITERIA'); } // Remove the digests UCP module category if ($modules_tool->exists('ucp', 0, 'UCP_DIGESTS')) { $modules_tool->remove('ucp', 0, 'UCP_DIGESTS'); } // ----- Add New ACP Modules ----- // // We need the module_id for the extensions tab to add a new category for Digests within the ACP $sql_array = array('SELECT' => 'module_id', 'FROM' => array($this->table_prefix . 'modules' => 'm'), 'WHERE' => "module_langname = 'ACP_CAT_DOT_MODS'"); $sql = $this->db->sql_build_query('SELECT', $sql_array); $result = $this->db->sql_query($sql); $rowset = $this->db->sql_fetchrowset($result); $module_id = $rowset[0]['module_id']; $this->db->sql_freeresult(); // Add Digests category $modules_tool->add('acp', 'ACP_CAT_DOT_MODS', array('module_enabled' => 1, 'module_display' => 1, 'module_basename' => '', 'module_class' => 'acp', 'parent_id' => (int) $module_id, 'module_langname' => 'ACP_CAT_DIGESTS', 'module_mode' => '', 'module_auth' => '')); // We need the module_id for the newly created Digests category //$sql = 'SELECT module_id FROM ' . $this->table_prefix . "modules WHERE module_langname = 'ACP_CAT_DIGESTS'"; $sql_array = array('SELECT' => 'module_id', 'FROM' => array($this->table_prefix . 'modules' => 'm'), 'WHERE' => "module_langname = 'ACP_CAT_DIGESTS'"); $sql = $this->db->sql_build_query('SELECT', $sql_array); $result = $this->db->sql_query($sql); $rowset = $this->db->sql_fetchrowset($result); $module_id = $rowset[0]['module_id']; $this->db->sql_freeresult(); // Add General Settings ACP module $modules_tool->add('acp', 'ACP_CAT_DIGESTS', array('module_enabled' => 1, 'module_display' => 1, 'module_basename' => '\\phpbbservices\\digests\\acp\\main_module', 'module_class' => 'acp', 'parent_id' => (int) $module_id, 'module_langname' => 'ACP_DIGESTS_GENERAL_SETTINGS', 'module_mode' => 'digests_general', 'module_auth' => 'ext_phpbbservices/digests && acl_a_board')); // Add User Default Settings ACP module $modules_tool->add('acp', 'ACP_CAT_DIGESTS', array('module_enabled' => 1, 'module_display' => 1, 'module_basename' => '\\phpbbservices\\digests\\acp\\main_module', 'module_class' => 'acp', 'parent_id' => (int) $module_id, 'module_langname' => 'ACP_DIGESTS_USER_DEFAULT_SETTINGS', 'module_mode' => 'digests_user_defaults', 'module_auth' => 'ext_phpbbservices/digests && acl_a_board')); // Add Edit Subscribers ACP module $modules_tool->add('acp', 'ACP_CAT_DIGESTS', array('module_enabled' => 1, 'module_display' => 1, 'module_basename' => '\\phpbbservices\\digests\\acp\\main_module', 'module_class' => 'acp', 'parent_id' => (int) $module_id, 'module_langname' => 'ACP_DIGESTS_EDIT_SUBSCRIBERS', 'module_mode' => 'digests_edit_subscribers', 'module_auth' => 'ext_phpbbservices/digests && acl_a_board')); // Add Balance Load ACP module $modules_tool->add('acp', 'ACP_CAT_DIGESTS', array('module_enabled' => 1, 'module_display' => 1, 'module_basename' => '\\phpbbservices\\digests\\acp\\main_module', 'module_class' => 'acp', 'parent_id' => (int) $module_id, 'module_langname' => 'ACP_DIGESTS_BALANCE_LOAD', 'module_mode' => 'digests_balance_load', 'module_auth' => 'ext_phpbbservices/digests && acl_a_board')); // Add Mass subscribe/unsubscribe ACP module $modules_tool->add('acp', 'ACP_CAT_DIGESTS', array('module_enabled' => 1, 'module_display' => 1, 'module_basename' => '\\phpbbservices\\digests\\acp\\main_module', 'module_class' => 'acp', 'parent_id' => (int) $module_id, 'module_langname' => 'ACP_DIGESTS_MASS_SUBSCRIBE_UNSUBSCRIBE', 'module_mode' => 'digests_mass_subscribe_unsubscribe', 'module_auth' => 'ext_phpbbservices/digests && acl_a_board')); // Add Digests Tests ACP module $modules_tool->add('acp', 'ACP_CAT_DIGESTS', array('module_enabled' => 1, 'module_display' => 1, 'module_basename' => '\\phpbbservices\\digests\\acp\\main_module', 'module_class' => 'acp', 'parent_id' => (int) $module_id, 'module_langname' => 'ACP_DIGESTS_TEST', 'module_mode' => 'digests_test', 'module_auth' => 'ext_phpbbservices/digests && acl_a_board')); // ----- Add New UCP Modules ----- // // Add Digests category $modules_tool->add('ucp', 0, array('module_enabled' => 1, 'module_display' => 1, 'module_basename' => '', 'module_class' => 'ucp', 'parent_id' => 0, 'module_langname' => 'UCP_DIGESTS', 'module_mode' => '', 'module_auth' => 'ext_phpbbservices/digest')); // We need the module_id for the new Digests category $sql_array = array('SELECT' => 'module_id', 'FROM' => array($this->table_prefix . 'modules' => 'm'), 'WHERE' => "module_langname = 'UCP_DIGESTS'"); $sql = $this->db->sql_build_query('SELECT', $sql_array); $result = $this->db->sql_query($sql); $rowset = $this->db->sql_fetchrowset($result); $module_id = $rowset[0]['module_id']; $this->db->sql_freeresult(); // Add Digests basics UCP module $modules_tool->add('ucp', 'UCP_DIGESTS', array('module_enabled' => 1, 'module_display' => 1, 'module_basename' => '\\phpbbservices\\digests\\ucp\\main_module', 'module_class' => 'ucp', 'parent_id' => (int) $module_id, 'module_langname' => 'UCP_DIGESTS_BASICS', 'module_mode' => 'basics', 'module_auth' => 'ext_phpbbservices/digests')); // Add Digests forums selection UCP module $modules_tool->add('ucp', 'UCP_DIGESTS', array('module_enabled' => 1, 'module_display' => 1, 'module_basename' => '\\phpbbservices\\digests\\ucp\\main_module', 'module_class' => 'ucp', 'parent_id' => (int) $module_id, 'module_langname' => 'UCP_DIGESTS_FORUMS_SELECTION', 'module_mode' => 'forums_selection', 'module_auth' => 'ext_phpbbservices/digests')); // Add Digests post filters UCP module $modules_tool->add('ucp', 'UCP_DIGESTS', array('module_enabled' => 1, 'module_display' => 1, 'module_basename' => '\\phpbbservices\\digests\\ucp\\main_module', 'module_class' => 'ucp', 'parent_id' => (int) $module_id, 'module_langname' => 'UCP_DIGESTS_POST_FILTERS', 'module_mode' => 'post_filters', 'module_auth' => 'ext_phpbbservices/digests')); // Add Digests additional criteria UCP module $modules_tool->add('ucp', 'UCP_DIGESTS', array('module_enabled' => 1, 'module_display' => 1, 'module_basename' => '\\phpbbservices\\digests\\ucp\\main_module', 'module_class' => 'ucp', 'parent_id' => (int) $module_id, 'module_langname' => 'UCP_DIGESTS_ADDITIONAL_CRITERIA', 'module_mode' => 'additional_criteria', 'module_auth' => 'ext_phpbbservices/digests')); // At this point we should be effectively installed. All the configuration variable for digests, columns in the users table for digests, and ACP and UCP // categories and modules exist and behave exactly as if a fresh install of this extension were made. All the phpBB 3.0 mod detritus should be gone. // Any digest cron that was set up will need to be removed manually, however. return true; }
function main($id, $mode) { global $config, $db, $user, $template, $request; global $phpbb_root_path, $phpbb_admin_path, $phpEx; global $phpbb_container; $this->config = $config; $this->core = $phpbb_container->get('phpbbseo.usu.core'); $this->db = $db; $this->request = $request; $this->template = $template; $this->user = $user; $this->phpbb_root_path = $phpbb_root_path; $this->php_ext = $phpEx; $this->user->add_lang_ext('phpbbseo/usu', 'acp_usu'); $action = $this->request->variable('action', ''); $submit = $this->request->is_set_post('submit'); $cancel = $this->request->variable('cancel', ''); $form_key = 'acp_seo_usu'; add_form_key($form_key); $display_vars = array(); // --> Zero Dupe if (@isset($this->core->seo_opt['zero_dupe'])) { $this->multiple_options['zero_dupe']['post_redir_values'] = array('off' => 'off', 'post' => 'post', 'guest' => 'guest', 'all' => 'all'); // do not change $this->multiple_options['zero_dupe']['post_redir_lang'] = array('off' => $this->user->lang['ACP_ZERO_DUPE_OFF'], 'post' => $this->user->lang['ACP_ZERO_DUPE_MSG'], 'guest' => $this->user->lang['ACP_ZERO_DUPE_GUEST'], 'all' => $this->user->lang['ACP_ZERO_DUPE_ALL']); } // <-- Mod rewrite selector if ($this->core->modrtype == 1) { $this->seo_unset_opts = array('cache_layer', 'rem_ids'); } else { if (!$this->core->seo_opt['cache_layer']) { $this->seo_unset_opts = array('rem_ids'); } } $this->modrtype_lang = $this->set_phpbb_seo_links(); $this->multiple_options['modrtype_lang'] = $this->modrtype_lang['titles']; if (@isset($this->core->seo_opt['modrtype'])) { $this->multiple_options['modrtype_values'] = array(1 => 1, 2 => 2, 3 => 3); // do not change; } // <-- Mod rewrite selector foreach ($this->seo_unset_opts as $opt) { if ($optkey = array_search($opt, $this->core->cache_config['dynamic_options'])) { unset($this->core->cache_config['dynamic_options'][$optkey]); } } // We need shorter URLs with Virtual Folder Trick if ($this->core->seo_opt['virtual_folder']) { $this->lengh_limit = 20; $this->word_limit = 3; } else { $this->lengh_limit = 30; $this->word_limit = 5; } $related_installed = false; switch ($mode) { case 'settings': $display_vars['title'] = 'ACP_PHPBB_SEO_CLASS'; $this->user->lang['ACP_PHPBB_SEO_CLASS_EXPLAIN'] = sprintf($this->user->lang['ACP_PHPBB_SEO_CLASS_EXPLAIN'], $this->modrtype_lang['ulink'], $this->modrtype_lang['uforumlink'], '</p><hr/><p><b>' . $this->user->lang['ACP_PHPBB_SEO_MODE'] . ' : ' . $this->modrtype_lang['link'] . ' - ( ' . $this->modrtype_lang['forumlink'] . ' )</b></p><hr/><p>'); $display_vars['vars'] = array(); $i = 2; $display_vars['vars']['legend1'] = 'ACP_PHPBB_SEO_CLASS'; foreach ($this->core->cache_config['dynamic_options'] as $optionname => $optionvalue) { if (@is_bool($this->core->seo_opt[$optionvalue])) { if ($optionvalue == 'virtual_root') { if (!$this->core->seo_path['phpbb_script']) { continue; } if (empty($this->config['force_server_vars'])) { // we assume that the force server var will not break everything // since this is in use in all cases in USU set_config('force_server_vars', 1); } } $display_vars['vars'][$optionvalue] = array('lang' => $optionvalue, 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true, 'lang_explain' => $optionvalue . '_explain'); $this->new_config[$optionvalue] = $this->core->seo_opt[$optionvalue]; } else { if (@isset($this->multiple_options[$optionvalue . '_values'])) { $this->dyn_select[$optionvalue] = $this->multiple_options[$optionvalue . '_values']; $display_vars['vars'][$optionvalue] = array('lang' => $optionvalue, 'validate' => 'string', 'type' => 'select', 'method' => 'select_string', 'explain' => true, 'lang_explain' => $optionvalue . '_explain'); $this->new_config[$optionvalue] = $this->core->seo_opt[$optionvalue]; } else { if (is_array($optionvalue)) { $display_vars['vars']['legend' . $i] = $optionname; $i++; foreach ($optionvalue as $key => $value) { $this->array_type_cfg[$optionname . '_' . $key] = array('main' => $optionname, 'sub' => $key); if (is_bool($value)) { $display_vars['vars'][$optionname . '_' . $key] = array('lang' => $optionname . '_' . $key, 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true, 'lang_explain' => $optionname . '_' . $key . '_explain'); $this->new_config[$optionname . '_' . $key] = $this->core->seo_opt[$optionname][$key]; } else { if (@isset($this->multiple_options[$optionname][$key . '_values'])) { $this->dyn_select[$optionname . '_' . $key] = $this->multiple_options[$optionname][$key . '_values']; $display_vars['vars'][$optionname . '_' . $key] = array('lang' => $optionname . '_' . $key, 'validate' => 'string', 'type' => 'select', 'method' => 'select_string', 'explain' => true, 'lang_explain' => $optionname . '_' . $key . '_explain'); $this->new_config[$optionname . '_' . $key] = $this->core->seo_opt[$optionname][$key]; } else { $display_vars['vars'][$optionname . '_' . $key] = array('lang' => $optionname . '_' . $key, 'validate' => 'string:0:50', 'type' => 'text:50:50', 'explain' => true, 'lang_explain' => $optionname . '_' . $key . '_explain'); $this->new_config[$optionname . '_' . $key] = $this->core->seo_opt[$optionname][$key]; } } } } } } } break; case 'forum_url': $forbidden = array($this->core->seo_static['forum'], $this->core->seo_static['global_announce'], $this->core->seo_static['user'], $this->core->seo_static['topic'], $this->core->seo_static['atopic'], $this->core->seo_static['utopic'], $this->core->seo_static['leaders'], $this->core->seo_static['post'], $this->core->seo_static['group'], $this->core->seo_static['npost'], $this->core->seo_static['index']); if ($this->core->modrtype == 1 || !$this->core->seo_opt['cache_layer']) { trigger_error($this->user->lang['ACP_NO_FORUM_URL'] . preg_replace('`(&|&|\\?)mode=forum_url`i', '', adm_back_link($this->u_action))); break; } $display_vars['title'] = 'ACP_FORUM_URL'; $this->user->lang['ACP_FORUM_URL_EXPLAIN'] .= '</p><hr/><p><b>' . $this->user->lang['ACP_PHPBB_SEO_VERSION'] . ' : ' . $this->modrtype_lang['link'] . ' - ( ' . $this->modrtype_lang['forumlink'] . ' )</b></p><hr/><p>'; $display_vars['vars'] = array(); $display_vars['vars']['legend1'] = 'ACP_FORUM_URL'; $sql = "SELECT forum_id, forum_name\n\t\t\t\t\tFROM " . FORUMS_TABLE . "\n\t\t\t\t\tORDER BY left_id ASC"; $result = $this->db->sql_query($sql); $forum_url_title = $error_cust = ''; while ($row = $this->db->sql_fetchrow($result)) { $this->forum_ids[$row['forum_id']] = $row['forum_name']; } $this->db->sql_freeresult($result); // take care of deleted forums foreach ($this->core->cache_config['forum_urls'] as $fid => $null) { if (!isset($this->forum_ids[$fid])) { unset($this->core->cache_config['forum_urls'][$fid]); } } foreach ($this->forum_ids as $forum_id => $forum_name) { $error_cust = ''; // Is the URL cached already ? if (empty($this->core->cache_config['forum_urls'][$forum_id])) { // Suggest the one from the title $forum_url_title = $this->core->format_url($forum_name, $this->core->seo_static['forum']); if (!in_array($forum_url_title, $forbidden)) { if (array_search($forum_url_title, $this->core->cache_config['forum_urls'])) { $this->new_config['forum_url' . $forum_id] = $forum_url_title . $this->core->seo_delim['forum'] . $forum_id; $error_cust = '<li> ' . sprintf($this->user->lang['SEO_ADVICE_DUPE'], $forum_url_title) . '</li>'; } else { $this->new_config['forum_url' . $forum_id] = $forum_url_title . (@$this->core->cache_config['settings']['rem_ids'] ? '' : $this->core->seo_delim['forum'] . $forum_id); } } else { $this->new_config['forum_url' . $forum_id] = $forum_url_title . $this->core->seo_delim['forum'] . $forum_id; $error_cust = '<li> ' . sprintf($this->user->lang['SEO_ADVICE_RESERVED'], $forum_url_title) . '</li>'; } $title = '<b style="color:red">' . $forum_name . ' - ID ' . $forum_id . '</b>'; $status_msg = '<b style="color:red">' . $this->user->lang['SEO_CACHE_URL_NOT_OK'] . '</b>'; $status_msg .= '<br/><span style="color:red">' . $this->user->lang['SEO_CACHE_URL'] . ' :</span> ' . $this->new_config['forum_url' . $forum_id] . $this->core->seo_ext['forum']; $display_vars['vars']['forum_url' . $forum_id] = array('lang' => $title, 'validate' => 'string', 'type' => 'custom', 'method' => 'forum_url_input', 'explain' => true, 'lang_explain_custom' => $status_msg, 'append' => $this->seo_advices($this->new_config['forum_url' . $forum_id], $forum_id, false, $error_cust)); } else { // Cached $this->new_config['forum_url' . $forum_id] = $this->core->cache_config['forum_urls'][$forum_id]; $title = '<b style="color:green">' . $forum_name . ' - ID ' . $forum_id . '</b>'; $status_msg = '<span style="color:green">' . $this->user->lang['SEO_CACHE_URL_OK'] . ' :</span> <b style="color:green">' . $this->new_config['forum_url' . $forum_id] . '</b>'; $status_msg .= '<br/><span style="color:green">' . $this->user->lang['SEO_CACHE_URL'] . ' :</span> ' . $this->new_config['forum_url' . $forum_id] . $this->core->seo_ext['forum']; $display_vars['vars']['forum_url' . $forum_id] = array('lang' => $title, 'validate' => 'string:0:100', 'type' => 'custom', 'method' => 'forum_url_input', 'explain' => true, 'lang_explain_custom' => $status_msg, 'append' => $this->seo_advices($this->new_config['forum_url' . $forum_id], $forum_id, true)); } } break; case 'server': $display_vars['title'] = 'ACP_REWRITE_CONF'; $this->user->lang['ACP_REWRITE_CONF_EXPLAIN'] .= '</p><hr/><p><b>' . $this->user->lang['ACP_PHPBB_SEO_VERSION'] . ' : ' . $this->modrtype_lang['link'] . ' - ( ' . $this->modrtype_lang['forumlink'] . ' )</b></p><p>'; $display_vars['vars'] = array(); $display_vars['vars']['legend1'] = 'ACP_REWRITE_CONF'; if ($this->core->seo_path['phpbb_script'] && !$this->core->seo_opt['virtual_root']) { $display_vars['vars']['rbase'] = array('lang' => 'SEO_SERVER_CONF_RBASE', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true); } $display_vars['vars']['save'] = array('lang' => 'SEO_SERVER_CONF_SAVE', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true); $display_vars['vars']['more_options'] = array('lang' => 'SEO_MORE_OPTION', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true); $this->new_config['save'] = false; $cfg_array = $this->request->is_set('config') ? utf8_normalize_nfc($this->request->variable('config', array('' => ''), true)) : $this->new_config; $this->new_config['more_options'] = isset($cfg_array['more_options']) ? $cfg_array['more_options'] : false; $this->new_config['slash'] = isset($cfg_array['slash']) ? $cfg_array['slash'] : false; $this->new_config['wslash'] = isset($cfg_array['wslash']) ? $cfg_array['wslash'] : false; $this->new_config['rbase'] = isset($cfg_array['rbase']) ? $cfg_array['rbase'] : false; if ($this->new_config['more_options']) { $display_vars['vars']['slash'] = array('lang' => 'SEO_SERVER_CONF_SLASH', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true); $display_vars['vars']['wslash'] = array('lang' => 'SEO_SERVER_CONF_WSLASH', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true); } // Dirty yet simple templating $this->user->lang['ACP_REWRITE_CONF_EXPLAIN'] .= $this->seo_server_conf(); $this->template->assign_vars(array('S_SEO_HTACCESS' => 1)); break; case 'extended': $display_vars = array('title' => 'ACP_SEO_EXTENDED', 'vars' => array('legend1' => 'SEO_EXTERNAL_LINKS', 'seo_ext_links' => array('lang' => 'SEO_EXTERNAL_LINKS', 'validate' => 'bool', 'type' => 'radio:enabled_disabled', 'explain' => true, 'default' => 1), 'seo_ext_subdomain' => array('lang' => 'SEO_EXTERNAL_SUBDOMAIN', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true, 'default' => 0), 'seo_ext_classes' => array('lang' => 'SEO_EXTERNAL_CLASSES', 'validate' => 'string', 'type' => 'text:40:250', 'explain' => true, 'default' => ''))); // Related topics if (!empty($this->config['seo_related_on'])) { $related_installed = true; $this->user->add_lang_ext('phpbbseo/usu', 'acp_usu_install'); $display_vars['vars'] += array('legend2' => 'SEO_RELATED_TOPICS', 'seo_related' => array('lang' => 'SEO_RELATED', 'validate' => 'bool', 'type' => 'radio:enabled_disabled', 'explain' => true, 'append' => !empty($this->config['seo_related']) ? '<br/>' . (!empty($this->config['seo_related_fulltext']) ? $this->user->lang['FULLTEXT_INSTALLED'] : $this->user->lang['FULLTEXT_NOT_INSTALLED']) : '', 'default' => 0), 'seo_related_check_ignore' => array('lang' => 'SEO_RELATED_CHECK_IGNORE', 'validate' => 'bool', 'type' => 'radio:enabled_disabled', 'explain' => true, 'default' => 0), 'seo_related_limit' => array('lang' => 'SEO_RELATED_LIMIT', 'validate' => 'int:2:25', 'type' => 'text:3:4', 'explain' => true, 'default' => 5), 'seo_related_allforums' => array('lang' => 'SEO_RELATED_ALLFORUMS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true, 'default' => 0)); } // dynamic meta tag mod if (!empty($this->config['seo_meta_on'])) { $display_vars['vars'] += array('legend3' => 'SEO_META', 'seo_meta_title' => array('lang' => 'SEO_META_TITLE', 'validate' => 'string:0:225', 'type' => 'text:40:250', 'explain' => true, 'default' => $this->config['sitename']), 'seo_meta_desc' => array('lang' => 'SEO_META_DESC', 'validate' => 'string:0:225', 'type' => 'text:40:250', 'explain' => true, 'default' => $this->config['site_desc']), 'seo_meta_desc_limit' => array('lang' => 'SEO_META_DESC_LIMIT', 'validate' => 'int:5:40', 'type' => 'text:3:4', 'explain' => true, 'default' => 25), 'seo_meta_bbcode_filter' => array('lang' => 'SEO_META_BBCODE_FILTER', 'validate' => 'string:0:225', 'type' => 'text:40:250', 'explain' => true, 'default' => 'img|url|flash|code'), 'seo_meta_keywords' => array('lang' => 'SEO_META_KEYWORDS', 'validate' => 'string:0:225', 'type' => 'text:40:250', 'explain' => true, 'default' => $this->config['site_desc']), 'seo_meta_keywords_limit' => array('lang' => 'SEO_META_KEYWORDS_LIMIT', 'validate' => 'int:5:40', 'type' => 'text:3:4', 'explain' => true, 'default' => 15), 'seo_meta_min_len' => array('lang' => 'SEO_META_MIN_LEN', 'validate' => 'int:0:10', 'type' => 'text:3:4', 'explain' => true, 'default' => 2), 'seo_meta_check_ignore' => array('lang' => 'SEO_META_CHECK_IGNORE', 'validate' => 'bool', 'type' => 'radio:enabled_disabled', 'explain' => true, 'default' => 0), 'seo_meta_lang' => array('lang' => 'SEO_META_LANG', 'validate' => 'lang', 'type' => 'select', 'method' => 'language_select', 'params' => array('{CONFIG_VALUE}'), 'explain' => true, 'default' => $this->config['default_lang']), 'seo_meta_copy' => array('lang' => 'SEO_META_COPY', 'validate' => 'string:0:225', 'type' => 'text:40:250', 'explain' => true, 'default' => $this->config['sitename']), 'seo_meta_file_filter' => array('lang' => 'SEO_META_FILE_FILTER', 'validate' => 'string:0:225', 'type' => 'text:40:250', 'explain' => true, 'default' => 'ucp'), 'seo_meta_get_filter' => array('lang' => 'SEO_META_GET_FILTER', 'validate' => 'string:0:225', 'type' => 'text:40:250', 'explain' => true, 'default' => 'style,hilit,sid'), 'seo_meta_robots' => array('lang' => 'SEO_META_ROBOTS', 'validate' => 'string:0:225', 'type' => 'text:25:150', 'explain' => true, 'default' => 'index,follow'), 'seo_meta_noarchive' => array('lang' => 'SEO_META_NOARCHIVE', 'validate' => 'string:0:225', 'multiple_validate' => 'int', 'type' => 'custom', 'method' => 'select_multiple', 'params' => array('{CONFIG_VALUE}', '{KEY}', $this->forum_select()), 'explain' => true, 'default' => ''), 'seo_meta_og' => array('lang' => 'SEO_META_OG', 'validate' => 'bool', 'type' => 'radio:enabled_disabled', 'explain' => true, 'default' => 0)); // Open Graph if (!empty($this->config['seo_meta_og'])) { $display_vars['vars'] += array('fb_app_id' => array('lang' => 'SEO_META_FB_APP_ID', 'validate' => 'string:0:225', 'type' => 'text:40:250', 'explain' => true, 'default' => '')); } } // Optimal title if (!empty($this->config['seo_optimal_title_on'])) { $display_vars['vars'] += array('legend' => 'SEO_PAGE_TITLES', 'seo_append_sitename' => array('lang' => 'SEO_APPEND_SITENAME', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true, 'default' => 0)); } // install if necessary foreach ($display_vars['vars'] as $config_name => $config_setup) { if (strpos($config_name, 'legend') !== false) { continue; } if (!isset($this->config[$config_name])) { set_config($config_name, $config_setup['default']); unset($display_vars['vars'][$config_name]['default']); } } $this->new_config = $this->config; break; case 'sync_url': $sync_url = $this->request->variable('sync', ''); $redirect_url = "{$phpbb_admin_path}index.{$phpEx}?i=-phpbbseo-usu-acp-usu&mode=sync_url"; $go = max(0, $this->request->variable('go', 0)); if ($cancel || !$go) { trigger_error($this->user->lang['SYNC_WARN'] . '<br/><br/><b> • <a href="' . append_sid($redirect_url, "go=1&sync=sync") . '">' . $this->user->lang['SYNC_TOPIC_URLS'] . '</a><br/><br/> • <a href="' . append_sid($redirect_url, "go=1&sync=reset") . '" >' . $this->user->lang['SYNC_RESET_TOPIC_URLS'] . '</a></b>'); } $starttime = microtime(true); $start = max(0, $this->request->variable('start', 0)); $limit = max(100, $this->request->variable('limit', 0)); // Do not go over 1000 topic in a row $limit = min(1000, $limit); $poll_processed = 0; $forum_data = array(); $url_updated = 0; if ($sync_url === 'sync') { // get all forum info $sql = 'SELECT forum_id, forum_name FROM ' . FORUMS_TABLE; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $forum_data[$row['forum_id']] = $row['forum_name']; $this->core->set_url($row['forum_name'], $row['forum_id'], $this->core->seo_static['forum']); } $db->sql_freeresult($result); // let's work $sql = 'SELECT * FROM ' . TOPICS_TABLE . ' ORDER BY topic_id ASC'; $result = $db->sql_query_limit($sql, $limit, $start); while ($row = $db->sql_fetchrow($result)) { $forum_id = (int) $row['forum_id']; $topic_id = (int) $row['topic_id']; $_parent = $row['topic_type'] == POST_GLOBAL ? $this->core->seo_static['global_announce'] : $this->core->seo_url['forum'][$forum_id]; if (!$this->core->check_url('topic', $row['topic_url'], $_parent)) { if (!empty($row['topic_url'])) { // Here we get rid of the seo delim (-t) and put it back even in simple mod // to be able to handle all cases at once $_url = preg_replace('`' . $this->core->seo_delim['topic'] . '$`i', '', $row['topic_url']); $_title = $this->core->get_url_info('topic', $_url . $this->core->seo_delim['topic'] . $topic_id, 'title'); } else { $_title = $this->core->modrtype > 2 ? censor_text($row['topic_title']) : ''; } unset($this->core->seo_url['topic'][$topic_id]); $row['topic_url'] = $this->core->get_url_info('topic', $this->core->prepare_url('topic', $_title, $topic_id, $_parent, empty($_title) || $_title == $this->core->seo_static['topic'] ? true : false), 'url'); unset($this->core->seo_url['topic'][$topic_id]); if ($row['topic_url']) { // Update the topic_url field for later re-use $sql = "UPDATE " . TOPICS_TABLE . " SET topic_url = '" . $db->sql_escape($row['topic_url']) . "'\n\t\t\t\t\t\t\t\t\tWHERE topic_id = {$topic_id}"; $db->sql_query($sql); $url_updated++; } } } $db->sql_freeresult($result); $sql = 'SELECT count(topic_id) as topic_cnt FROM ' . TOPICS_TABLE; $result = $db->sql_query($sql); $cnt = $db->sql_fetchrow($result); $db->sql_freeresult($result); if ($cnt['topic_cnt'] > $start + $limit) { $endtime = microtime(true); $duration = $endtime - $starttime; $speed = round($limit / $duration, 2); $percent = round(($start + $limit) / $cnt['topic_cnt'] * 100, 2); $message = sprintf($user->lang['SYNC_PROCESSING'], $percent, $start + $limit, $cnt['topic_cnt'], $limit, $speed, round($duration, 2), round(($cnt['topic_cnt'] - $start) / $speed / 60, 2)); if ($url_updated) { $message .= sprintf($user->lang['SYNC_ITEM_UPDATED'], '<br/>' . $url_updated); } $new_limit = $duration < 10 ? $limit + 50 : $limit - 10; meta_refresh(1, append_sid($redirect_url, 'go=1&start=' . ($start + $limit) . "&limit={$new_limit}&sync=sync")); trigger_error("{$message}<br/>"); } else { trigger_error($user->lang['SYNC_COMPLETE'] . sprintf($user->lang['RETURN_INDEX'], '<br/><br/><a href="' . append_sid($redirect_url) . '" >', '</a>')); } } else { if ($sync_url === 'reset') { if (confirm_box(true)) { $sql = "UPDATE " . TOPICS_TABLE . " SET topic_url = ''"; $db->sql_query($sql); trigger_error($user->lang['SYNC_RESET_COMPLETE'] . '<br/><br/><b> • <a href="' . append_sid($redirect_url, "go=1&sync=sync") . '">' . $user->lang['SYNC_TOPIC_URLS'] . '</a><br/><br/> • ' . sprintf($user->lang['RETURN_INDEX'], '<a href="' . append_sid($redirect_url) . '" >', '</a></b>')); } else { confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array('go' => '1', 'sync' => 'reset')), 'confirm_body.html'); } } else { trigger_error($user->lang['SYNC_WARN'] . '<br/><br/><b> • <a href="' . append_sid($redirect_url, "go=1&sync=sync") . '">' . $user->lang['SYNC_TOPIC_URLS'] . '</a><br/><br/> • <a href="' . append_sid($redirect_url, "go=1&sync=reset") . '" >' . $user->lang['SYNC_RESET_TOPIC_URLS'] . '</a></b>'); } } break; default: trigger_error('NO_MODE', E_USER_ERROR); break; } $error = array(); $seo_msg = array(); $cfg_array = $this->request->is_set('config') ? utf8_normalize_nfc($this->request->variable('config', array('' => ''), true)) : $this->new_config; if ($submit && !check_form_key($form_key)) { $error[] = $this->user->lang['FORM_INVALID']; } // We validate the complete config if whished validate_config_vars($display_vars['vars'], $cfg_array, $error); // Do not write values if there is an error if (!empty($error)) { $submit = false; } $additional_notes = ''; // We go through the display_vars to make sure no one is trying to set variables he/she is not allowed to... foreach ($display_vars['vars'] as $config_name => $cfg_setup) { if (!isset($cfg_array[$config_name]) && @$cfg_setup['method'] != 'select_multiple' || strpos($config_name, 'legend') !== false) { continue; } // Handle multiple select options if (!empty($cfg_setup['method']) && $cfg_setup['method'] == 'select_multiple') { if (isset($_POST['multiple_' . $config_name])) { $m_values = utf8_normalize_nfc($this->request->variable('multiple_' . $config_name, array('' => ''))); $validate_int = !empty($cfg_setup['multiple_validate']) && $cfg_setup['multiple_validate'] == 'int' ? true : false; foreach ($m_values as $k => $v) { if ($validate_int) { $v = max(0, (int) $v); } if (empty($v)) { unset($m_values[$k]); } else { $m_values[$k] = $v; } } sort($m_values); $this->new_config[$config_name] = $m_values; $config_value = implode(',', $m_values); if (strlen($config_value) > 255) { $error[] = sprintf($this->user->lang['SETTING_TOO_LONG'], $this->user->lang[$cfg_setup['lang']], 255); } $submit = empty($error); } else { if ($submit) { $this->new_config[$config_name] = array(); $config_value = ''; } else { $config_value = $this->new_config[$config_name]; $this->new_config[$config_name] = !empty($config_value) ? explode(',', $config_value) : array(); } } } else { $this->new_config[$config_name] = $config_value = $cfg_array[$config_name]; } if ($submit) { // In case we deal with forum URLs if ($mode == 'forum_url' && preg_match('`^forum_url([0-9]+)$`', $config_name, $matches)) { // Check if this is an actual forum_id if (isset($this->forum_ids[$matches[1]])) { $forum_id = intval($matches[1]); $config_value = $this->core->format_url($config_value, $this->core->seo_static['forum']); // Remove delim if required while (preg_match('`^[a-z0-9_-]+' . $this->core->seo_delim['forum'] . '[0-9]+$`i', $config_value)) { $config_value = preg_replace('`^([a-z0-9_-]+)' . $this->core->seo_delim['forum'] . '[0-9]+$`i', '\\1', $config_value); if (@$this->core->cache_config['settings']['rem_ids']) { $seo_msg['SEO_ADVICE_DELIM_REM'] = '<li> ' . $this->user->lang['SEO_ADVICE_DELIM_REM'] . '</li>'; } } // Forums cannot end with the pagination param while (preg_match('`^[a-z0-9_-]+' . $this->core->seo_delim['start'] . '[0-9]+$`i', $config_value)) { $config_value = preg_replace('`^([a-z0-9_-]+)' . $this->core->seo_delim['start'] . '[0-9]+$`i', "\\1", $config_value); $seo_msg['SEO_ADVICE_START'] = '<li> ' . $this->user->lang['SEO_ADVICE_START'] . '</li>'; } // Only update if the value is not a static one for forums if (!in_array($config_value, $forbidden)) { // and updated (sic) if ($config_value != @$this->core->cache_config['forum_urls'][$forum_id]) { // and if not already set if (!array_search($config_value, $this->core->cache_config['forum_urls'])) { $this->core->cache_config['forum_urls'][$forum_id] = $config_value . (@$this->core->cache_config['settings']['rem_ids'] ? '' : $this->core->seo_delim['forum'] . $forum_id); } else { $seo_msg['SEO_ADVICE_DUPE_' . $forum_id] = '<li> ' . sprintf($this->user->lang['SEO_ADVICE_DUPE'], $config_value) . '</li>'; } } } else { $seo_msg['SEO_ADVICE_RESERVED_' . $forum_id] = '<li> ' . sprintf($this->user->lang['SEO_ADVICE_RESERVED'], $config_value) . '</li>'; } } } else { if ($mode == 'settings') { if (isset($this->array_type_cfg[$config_name]) && isset($this->core->seo_opt[$this->array_type_cfg[$config_name]['main']][$this->array_type_cfg[$config_name]['sub']])) { if (is_bool($this->core->seo_opt[$this->array_type_cfg[$config_name]['main']][$this->array_type_cfg[$config_name]['sub']])) { $this->core->cache_config['settings'][$this->array_type_cfg[$config_name]['main']][$this->array_type_cfg[$config_name]['sub']] = $config_value == 1 ? true : false; } else { if (is_numeric($this->core->seo_opt[$this->array_type_cfg[$config_name]['main']][$this->array_type_cfg[$config_name]['sub']])) { $this->core->cache_config['settings'][$this->array_type_cfg[$config_name]['main']][$this->array_type_cfg[$config_name]['sub']] = intval($config_value); } else { if (is_string($this->core->seo_opt[$this->array_type_cfg[$config_name]['main']][$this->array_type_cfg[$config_name]['sub']])) { $this->core->cache_config['settings'][$this->array_type_cfg[$config_name]['main']][$this->array_type_cfg[$config_name]['sub']] = $config_value; } } } } else { if (isset($this->core->seo_opt[$config_name])) { if (is_bool($this->core->seo_opt[$config_name])) { $this->core->cache_config['settings'][$config_name] = $config_value == 1 ? true : false; } else { if (is_numeric($this->core->seo_opt[$config_name])) { $this->core->cache_config['settings'][$config_name] = intval($config_value); } else { if (is_string($this->core->seo_opt[$config_name])) { $this->core->cache_config['settings'][$config_name] = $config_value; } } } } } // Let's make sure that the proper field was added to the topic table if ($config_name === 'sql_rewrite' && $config_value == 1 && !$this->core->seo_opt['sql_rewrite']) { $db_tools = new \phpbb\db\tools($this->db); $db_tools->db->sql_return_on_error(true); if (!$db_tools->sql_column_exists(TOPICS_TABLE, 'topic_url')) { $db_tools->sql_column_add(TOPICS_TABLE, 'topic_url', array('VCHAR:255', '')); } $additional_notes = sprintf($this->user->lang['SYNC_TOPIC_URL_NOTE'], '<a href="' . append_sid("{$phpbb_admin_path}index.{$phpEx}", 'i=-phpbbseo-usu-acp-usu&mode=sync_url') . '">', '</a>'); if ($db_tools->db->get_sql_error_triggered()) { $error[] = '<b>' . $this->user->lang['sql_rewrite'] . '</b> : ' . $this->user->lang['SEO_SQL_ERROR'] . ' [ ' . $db_tools->db->get_sql_layer() . ' ] : ' . $db_tools->db->sql_error_returned['message'] . ' [' . $db_tools->db->sql_error_returned['code'] . ']' . '<br/>' . $this->user->lang['SEO_SQL_TRY_MANUALLY'] . '<br/>' . $db_tools->db->sql_error_sql; $submit = false; } $db_tools->db->sql_return_on_error(false); } } else { if ($mode == 'extended') { set_config($config_name, $config_value); } } } } } if (sizeof($error)) { $submit = false; } if ($submit) { if ($mode == 'server') { if ($this->new_config['save']) { $this->seo_server_conf(false); add_log('admin', 'SEO_LOG_CONFIG_' . strtoupper($mode)); } } else { if ($mode == 'extended') { add_log('admin', 'SEO_LOG_CONFIG_' . strtoupper($mode)); trigger_error($this->user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action)); } else { // config $file = $this->core->cache_config['file']; ksort($this->core->cache_config['forum_urls']); $update = '<' . '?php' . "\n" . '/**' . "\n" . '* phpBB SEO' . "\n" . '* www.phpBB-SEO.com' . "\n" . '* @package phpBB SEO USU' . "\n" . '*/' . "\n" . 'if (!defined(\'IN_PHPBB\')) {' . "\n\t" . 'exit;' . "\n" . '}' . "\n"; $update .= '$settings = ' . preg_replace('`[\\s]+`', ' ', var_export($this->core->cache_config['settings'], true)) . ';' . "\n"; $update .= '$forum_urls = ' . preg_replace('`[\\s]+`', ' ', var_export($this->core->cache_config['forum_urls'], true)) . ';'; if ($this->write_cache($file, $update)) { global $msg_long_text; add_log('admin', 'SEO_LOG_CONFIG_' . strtoupper($mode)); $msg = !empty($seo_msg) ? '<br /><h1 style="color:red;text-align:left;">' . $this->user->lang['SEO_VALIDATE_INFO'] . '</h1><ul style="text-align:left;">' . implode(' ', $seo_msg) . '</ul><br />' : ''; $msg_long_text = $this->user->lang['SEO_CACHE_MSG_OK'] . $msg . adm_back_link($this->u_action); if ($additional_notes) { $msg_long_text .= "<br/><br/>{$additional_notes}"; } trigger_error(false); } else { trigger_error($this->user->lang['SEO_CACHE_MSG_FAIL'] . adm_back_link($this->u_action)); } } } } $this->tpl_name = 'acp_board'; $this->page_title = $display_vars['title']; $l_title_explain = $this->user->lang[$display_vars['title'] . '_EXPLAIN']; if ($mode != 'extended') { $l_title_explain .= $mode == 'server' ? '' : $this->check_cache_folder($this->core->seo_opt['cache_folder']); } $this->template->assign_vars(array('L_TITLE' => $this->user->lang[$display_vars['title']], 'L_TITLE_EXPLAIN' => $l_title_explain, 'S_ERROR' => sizeof($error) ? true : false, 'ERROR_MSG' => implode('<br />', $error), 'U_ACTION' => $this->u_action)); // Output relevant page foreach ($display_vars['vars'] as $config_key => $vars) { if (!is_array($vars) && strpos($config_key, 'legend') === false) { continue; } if (strpos($config_key, 'legend') !== false) { $this->template->assign_block_vars('options', array('S_LEGEND' => true, 'LEGEND' => isset($this->user->lang[$vars]) ? $this->user->lang[$vars] : $vars)); continue; } $type = explode(':', $vars['type']); $l_explain = ''; if ($vars['explain'] && isset($vars['lang_explain'])) { $l_explain = isset($this->user->lang[$vars['lang_explain']]) ? $this->user->lang[$vars['lang_explain']] : $vars['lang_explain']; } else { if ($vars['explain'] && isset($vars['lang_explain_custom'])) { $l_explain = $vars['lang_explain_custom']; } else { if ($vars['explain']) { $l_explain = isset($this->user->lang[$vars['lang'] . '_EXPLAIN']) ? $this->user->lang[$vars['lang'] . '_EXPLAIN'] : ''; } } } $this->template->assign_block_vars('options', array('KEY' => $config_key, 'TITLE' => isset($this->user->lang[$vars['lang']]) ? $this->user->lang[$vars['lang']] : $vars['lang'], 'S_EXPLAIN' => $vars['explain'], 'TITLE_EXPLAIN' => $l_explain, 'CONTENT' => build_cfg_template($type, $config_key, $this->new_config, $config_key, $vars))); unset($display_vars['vars'][$config_key]); } }