acp_forums::update_forum_data PHP Method

update_forum_data() public method

Update forum data
public update_forum_data ( &$forum_data_ary )
    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 . '&amp;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;
    }

Usage Example

示例#1
0
 public static function save(&$forum_data)
 {
     $forum_data += array('parent_id' => 0, 'forum_type' => FORUM_POST, 'type_action' => '', 'forum_status' => ITEM_UNLOCKED, 'forum_parents' => '', 'forum_name' => '', 'forum_link' => '', 'forum_link_track' => false, 'forum_desc' => '', 'forum_desc_uid' => '', 'forum_desc_options' => 7, 'forum_desc_bitfield' => '', 'forum_rules' => '', 'forum_rules_uid' => '', 'forum_rules_options' => 7, 'forum_rules_bitfield' => '', 'forum_rules_link' => '', 'forum_image' => '', 'forum_style' => 0, 'display_subforum_list' => false, 'display_on_index' => false, 'forum_topics_per_page' => 0, 'enable_indexing' => true, 'enable_icons' => false, 'enable_prune' => false, 'enable_post_review' => true, 'enable_quick_reply' => false, 'prune_days' => 7, 'prune_viewed' => 7, 'prune_freq' => 1, 'prune_old_polls' => false, 'prune_announce' => false, 'prune_sticky' => false, 'show_active' => false, 'forum_password' => '', 'forum_password_confirm' => '', 'forum_password_unset' => false);
     $forum = new \acp_forums();
     $errors = $forum->update_forum_data($forum_data);
     return $errors;
 }
All Usage Examples Of acp_forums::update_forum_data