function update_forum_data(&$forum_data_ary)
{
global $db, $user, $cache, $phpbb_root_path, $phpbb_container, $phpbb_dispatcher, $phpbb_log, $request;
$errors = array();
$forum_data = $forum_data_ary;
/**
* Validate the forum data before we create/update the forum
*
* @event core.acp_manage_forums_validate_data
* @var array forum_data Array with new forum data
* @var array errors Array of errors, should be strings and not
* language key.
* @since 3.1.0-a1
*/
$vars = array('forum_data', 'errors');
extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_validate_data', compact($vars)));
$forum_data_ary = $forum_data;
unset($forum_data);
if ($forum_data_ary['forum_name'] == '') {
$errors[] = $user->lang['FORUM_NAME_EMPTY'];
}
if (utf8_strlen($forum_data_ary['forum_desc']) > 4000) {
$errors[] = $user->lang['FORUM_DESC_TOO_LONG'];
}
if (utf8_strlen($forum_data_ary['forum_rules']) > 4000) {
$errors[] = $user->lang['FORUM_RULES_TOO_LONG'];
}
if ($forum_data_ary['forum_password'] || $forum_data_ary['forum_password_confirm']) {
if ($forum_data_ary['forum_password'] != $forum_data_ary['forum_password_confirm']) {
$forum_data_ary['forum_password'] = $forum_data_ary['forum_password_confirm'] = '';
$errors[] = $user->lang['FORUM_PASSWORD_MISMATCH'];
}
}
if ($forum_data_ary['prune_days'] < 0 || $forum_data_ary['prune_viewed'] < 0 || $forum_data_ary['prune_freq'] < 0) {
$forum_data_ary['prune_days'] = $forum_data_ary['prune_viewed'] = $forum_data_ary['prune_freq'] = 0;
$errors[] = $user->lang['FORUM_DATA_NEGATIVE'];
}
$range_test_ary = array(array('lang' => 'FORUM_TOPICS_PAGE', 'value' => $forum_data_ary['forum_topics_per_page'], 'column_type' => 'TINT:0'));
if (!empty($forum_data_ary['forum_image']) && !file_exists($phpbb_root_path . $forum_data_ary['forum_image'])) {
$errors[] = $user->lang['FORUM_IMAGE_NO_EXIST'];
}
validate_range($range_test_ary, $errors);
// Set forum flags
// 1 = link tracking
// 2 = prune old polls
// 4 = prune announcements
// 8 = prune stickies
// 16 = show active topics
// 32 = enable post review
$forum_data_ary['forum_flags'] = 0;
$forum_data_ary['forum_flags'] += $forum_data_ary['forum_link_track'] ? FORUM_FLAG_LINK_TRACK : 0;
$forum_data_ary['forum_flags'] += $forum_data_ary['prune_old_polls'] ? FORUM_FLAG_PRUNE_POLL : 0;
$forum_data_ary['forum_flags'] += $forum_data_ary['prune_announce'] ? FORUM_FLAG_PRUNE_ANNOUNCE : 0;
$forum_data_ary['forum_flags'] += $forum_data_ary['prune_sticky'] ? FORUM_FLAG_PRUNE_STICKY : 0;
$forum_data_ary['forum_flags'] += $forum_data_ary['show_active'] ? FORUM_FLAG_ACTIVE_TOPICS : 0;
$forum_data_ary['forum_flags'] += $forum_data_ary['enable_post_review'] ? FORUM_FLAG_POST_REVIEW : 0;
$forum_data_ary['forum_flags'] += $forum_data_ary['enable_quick_reply'] ? FORUM_FLAG_QUICK_REPLY : 0;
// Unset data that are not database fields
$forum_data_sql = $forum_data_ary;
unset($forum_data_sql['forum_link_track']);
unset($forum_data_sql['prune_old_polls']);
unset($forum_data_sql['prune_announce']);
unset($forum_data_sql['prune_sticky']);
unset($forum_data_sql['show_active']);
unset($forum_data_sql['enable_post_review']);
unset($forum_data_sql['enable_quick_reply']);
unset($forum_data_sql['forum_password_confirm']);
// What are we going to do tonight Brain? The same thing we do everynight,
// try to take over the world ... or decide whether to continue update
// and if so, whether it's a new forum/cat/link or an existing one
if (sizeof($errors)) {
return $errors;
}
// As we don't know the old password, it's kinda tricky to detect changes
if ($forum_data_sql['forum_password_unset']) {
$forum_data_sql['forum_password'] = '';
} else {
if (empty($forum_data_sql['forum_password'])) {
unset($forum_data_sql['forum_password']);
} else {
// Instantiate passwords manager
/* @var $passwords_manager \phpbb\passwords\manager */
$passwords_manager = $phpbb_container->get('passwords.manager');
$forum_data_sql['forum_password'] = $passwords_manager->hash($forum_data_sql['forum_password']);
}
}
unset($forum_data_sql['forum_password_unset']);
$forum_data = $forum_data_ary;
/**
* Remove invalid values from forum_data_sql that should not be updated
*
* @event core.acp_manage_forums_update_data_before
* @var array forum_data Array with forum data
* @var array forum_data_sql Array with data we are going to update
* If forum_data_sql[forum_id] is set, we update
* that forum, otherwise a new one is created.
* @since 3.1.0-a1
*/
$vars = array('forum_data', 'forum_data_sql');
extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_update_data_before', compact($vars)));
$forum_data_ary = $forum_data;
unset($forum_data);
$is_new_forum = !isset($forum_data_sql['forum_id']);
if ($is_new_forum) {
// no forum_id means we're creating a new forum
unset($forum_data_sql['type_action']);
if ($forum_data_sql['parent_id']) {
$sql = 'SELECT left_id, right_id, forum_type
FROM ' . FORUMS_TABLE . '
WHERE forum_id = ' . $forum_data_sql['parent_id'];
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
if (!$row) {
trigger_error($user->lang['PARENT_NOT_EXIST'] . adm_back_link($this->u_action . '&parent_id=' . $this->parent_id), E_USER_WARNING);
}
if ($row['forum_type'] == FORUM_LINK) {
$errors[] = $user->lang['PARENT_IS_LINK_FORUM'];
return $errors;
}
$sql = 'UPDATE ' . FORUMS_TABLE . '
SET left_id = left_id + 2, right_id = right_id + 2
WHERE left_id > ' . $row['right_id'];
$db->sql_query($sql);
$sql = 'UPDATE ' . FORUMS_TABLE . '
SET right_id = right_id + 2
WHERE ' . $row['left_id'] . ' BETWEEN left_id AND right_id';
$db->sql_query($sql);
$forum_data_sql['left_id'] = $row['right_id'];
$forum_data_sql['right_id'] = $row['right_id'] + 1;
} else {
$sql = 'SELECT MAX(right_id) AS right_id
FROM ' . FORUMS_TABLE;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$forum_data_sql['left_id'] = $row['right_id'] + 1;
$forum_data_sql['right_id'] = $row['right_id'] + 2;
}
$sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $forum_data_sql);
$db->sql_query($sql);
$forum_data_ary['forum_id'] = $db->sql_nextid();
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_ADD', false, array($forum_data_ary['forum_name']));
} else {
$row = $this->get_forum_info($forum_data_sql['forum_id']);
if ($row['forum_type'] == FORUM_POST && $row['forum_type'] != $forum_data_sql['forum_type']) {
// Has subforums and want to change into a link?
if ($row['right_id'] - $row['left_id'] > 1 && $forum_data_sql['forum_type'] == FORUM_LINK) {
$errors[] = $user->lang['FORUM_WITH_SUBFORUMS_NOT_TO_LINK'];
return $errors;
}
// we're turning a postable forum into a non-postable forum
if ($forum_data_sql['type_action'] == 'move') {
$to_forum_id = $request->variable('to_forum_id', 0);
if ($to_forum_id) {
$errors = $this->move_forum_content($forum_data_sql['forum_id'], $to_forum_id);
} else {
return array($user->lang['NO_DESTINATION_FORUM']);
}
} else {
if ($forum_data_sql['type_action'] == 'delete') {
$errors = $this->delete_forum_content($forum_data_sql['forum_id']);
} else {
return array($user->lang['NO_FORUM_ACTION']);
}
}
$forum_data_sql['forum_posts_approved'] = $forum_data_sql['forum_posts_unapproved'] = $forum_data_sql['forum_posts_softdeleted'] = $forum_data_sql['forum_topics_approved'] = $forum_data_sql['forum_topics_unapproved'] = $forum_data_sql['forum_topics_softdeleted'] = 0;
$forum_data_sql['forum_last_post_id'] = $forum_data_sql['forum_last_poster_id'] = $forum_data_sql['forum_last_post_time'] = 0;
$forum_data_sql['forum_last_poster_name'] = $forum_data_sql['forum_last_poster_colour'] = '';
} else {
if ($row['forum_type'] == FORUM_CAT && $forum_data_sql['forum_type'] == FORUM_LINK) {
// Has subforums?
if ($row['right_id'] - $row['left_id'] > 1) {
// We are turning a category into a link - but need to decide what to do with the subforums.
$action_subforums = $request->variable('action_subforums', '');
$subforums_to_id = $request->variable('subforums_to_id', 0);
if ($action_subforums == 'delete') {
$rows = get_forum_branch($row['forum_id'], 'children', 'descending', false);
foreach ($rows as $_row) {
// Do not remove the forum id we are about to change. ;)
if ($_row['forum_id'] == $row['forum_id']) {
continue;
}
$forum_ids[] = $_row['forum_id'];
$errors = array_merge($errors, $this->delete_forum_content($_row['forum_id']));
}
if (sizeof($errors)) {
return $errors;
}
if (sizeof($forum_ids)) {
$sql = 'DELETE FROM ' . FORUMS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_ids);
$db->sql_query($sql);
$sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_ids);
$db->sql_query($sql);
$sql = 'DELETE FROM ' . ACL_USERS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_ids);
$db->sql_query($sql);
// Delete forum ids from extension groups table
$sql = 'SELECT group_id, allowed_forums
FROM ' . EXTENSION_GROUPS_TABLE;
$result = $db->sql_query($sql);
while ($_row = $db->sql_fetchrow($result)) {
if (!$_row['allowed_forums']) {
continue;
}
$allowed_forums = unserialize(trim($_row['allowed_forums']));
$allowed_forums = array_diff($allowed_forums, $forum_ids);
$sql = 'UPDATE ' . EXTENSION_GROUPS_TABLE . "\n\t\t\t\t\t\t\t\t\tSET allowed_forums = '" . (sizeof($allowed_forums) ? serialize($allowed_forums) : '') . "'\n\t\t\t\t\t\t\t\t\tWHERE group_id = {$_row['group_id']}";
$db->sql_query($sql);
}
$db->sql_freeresult($result);
$cache->destroy('_extensions');
}
} else {
if ($action_subforums == 'move') {
if (!$subforums_to_id) {
return array($user->lang['NO_DESTINATION_FORUM']);
}
$sql = 'SELECT forum_name
FROM ' . FORUMS_TABLE . '
WHERE forum_id = ' . $subforums_to_id;
$result = $db->sql_query($sql);
$_row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
if (!$_row) {
return array($user->lang['NO_FORUM']);
}
$sql = 'SELECT forum_id
FROM ' . FORUMS_TABLE . "\n\t\t\t\t\t\t\tWHERE parent_id = {$row['forum_id']}";
$result = $db->sql_query($sql);
while ($_row = $db->sql_fetchrow($result)) {
$this->move_forum($_row['forum_id'], $subforums_to_id);
}
$db->sql_freeresult($result);
$sql = 'UPDATE ' . FORUMS_TABLE . "\n\t\t\t\t\t\t\tSET parent_id = {$subforums_to_id}\n\t\t\t\t\t\t\tWHERE parent_id = {$row['forum_id']}";
$db->sql_query($sql);
}
}
// Adjust the left/right id
$sql = 'UPDATE ' . FORUMS_TABLE . '
SET right_id = left_id + 1
WHERE forum_id = ' . $row['forum_id'];
$db->sql_query($sql);
}
} else {
if ($row['forum_type'] == FORUM_CAT && $forum_data_sql['forum_type'] == FORUM_POST) {
// Changing a category to a forum? Reset the data (you can't post directly in a cat, you must use a forum)
$forum_data_sql['forum_posts_approved'] = 0;
$forum_data_sql['forum_posts_unapproved'] = 0;
$forum_data_sql['forum_posts_softdeleted'] = 0;
$forum_data_sql['forum_topics_approved'] = 0;
$forum_data_sql['forum_topics_unapproved'] = 0;
$forum_data_sql['forum_topics_softdeleted'] = 0;
$forum_data_sql['forum_last_post_id'] = 0;
$forum_data_sql['forum_last_post_subject'] = '';
$forum_data_sql['forum_last_post_time'] = 0;
$forum_data_sql['forum_last_poster_id'] = 0;
$forum_data_sql['forum_last_poster_name'] = '';
$forum_data_sql['forum_last_poster_colour'] = '';
}
}
}
if (sizeof($errors)) {
return $errors;
}
if ($row['parent_id'] != $forum_data_sql['parent_id']) {
if ($row['forum_id'] != $forum_data_sql['parent_id']) {
$errors = $this->move_forum($forum_data_sql['forum_id'], $forum_data_sql['parent_id']);
} else {
$forum_data_sql['parent_id'] = $row['parent_id'];
}
}
if (sizeof($errors)) {
return $errors;
}
unset($forum_data_sql['type_action']);
if ($row['forum_name'] != $forum_data_sql['forum_name']) {
// the forum name has changed, clear the parents list of all forums (for safety)
$sql = 'UPDATE ' . FORUMS_TABLE . "\n\t\t\t\t\tSET forum_parents = ''";
$db->sql_query($sql);
}
// Setting the forum id to the forum id is not really received well by some dbs. ;)
$forum_id = $forum_data_sql['forum_id'];
unset($forum_data_sql['forum_id']);
$sql = 'UPDATE ' . FORUMS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $forum_data_sql) . '
WHERE forum_id = ' . $forum_id;
$db->sql_query($sql);
// Add it back
$forum_data_ary['forum_id'] = $forum_id;
$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_FORUM_EDIT', false, array($forum_data_ary['forum_name']));
}
$forum_data = $forum_data_ary;
/**
* Event after a forum was updated or created
*
* @event core.acp_manage_forums_update_data_after
* @var array forum_data Array with forum data
* @var array forum_data_sql Array with data we updated
* @var bool is_new_forum Did we create a forum or update one
* If you want to overwrite this value,
* ensure to set forum_data_sql[forum_id]
* @var array errors Array of errors, should be strings and not
* language key.
* @since 3.1.0-a1
*/
$vars = array('forum_data', 'forum_data_sql', 'is_new_forum', 'errors');
extract($phpbb_dispatcher->trigger_event('core.acp_manage_forums_update_data_after', compact($vars)));
$forum_data_ary = $forum_data;
unset($forum_data);
return $errors;
}