Skip to:
Content

bbPress.org


Ignore:
Timestamp:
01/08/2012 10:32:12 PM (10 years ago)
Author:
johnjamesjacoby
Message:

BuddyPress Group Forum Integration:

  • BuddyPress group/forum sync functions
  • Add forum/topic row actions
  • Group create/edit helper methods
  • Forum create/edit handlers
  • See #1669
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/plugin/bbp-includes/bbp-extend-buddypress.php

    r3627 r3654  
    404404     * Append forum options to activity filter select box
    405405     *
    406      * @since bbPress (r????)
     406     * @since bbPress (r3653)
    407407     */
    408408    function activity_filter_options() {
     
    930930
    931931    function display() {
    932 
     932        global $bbp;
     933
     934        // More than one forum, so show hierarchy
     935        if ( count( bbp_get_group_forum_ids( bp_get_current_group_id() ) ) > 1 )
     936            $this->display_group_forums();
     937
     938        // Only one forum, so show its topics
     939        else
     940            $this->display_group_forum();
    933941    }
    934942
     
    944952     * @since bbPress (r3563)
    945953     *
    946      * @uses groups_get_groupmeta()
    947      * @uses bp_get_current_group_id()
    948      * @uses bbp_has_forums()
    949954     * @uses bbp_get_template_part()
    950955     */
    951956    function edit_screen() {
    952957
    953         // Forum data
    954         $group_id   = bp_get_current_group_id();
    955         $forum_ids  = groups_get_groupmeta( $group_id, 'forum_id' );
    956         $forum_args = array(
    957             'post__in' => $forum_ids
    958         );
    959 
    960         // Query forums and show them if
    961         if ( !empty( $forum_ids ) && bbp_has_forums( $forum_args ) ) {
    962             bbp_get_template_part( 'bbpress/loop', 'forums' );
    963         } else { ?>
    964 
    965             <div id="message" class="info">
    966                 <p><?php _e( 'This group does not have any forums.', 'bbpress' ); ?></p>
    967             </div>
    968 
    969         <?php };
     958        // Add group admin actions to forum row actions
     959        add_action( 'bbp_forum_row_actions', array( $this, 'forum_row_actions' ) );
     960
     961        // Show forums if needed
     962        $this->display_group_forums();
    970963
    971964        // Output the forum form
     
    981974     * @since bbPress (r3465)
    982975     *
    983      * @todo Everything
     976     * @uses bbp_new_forum_handler() To check for forum creation
     977     * @uses bbp_edit_forum_handler() To check for forum edit
    984978     */
    985979    function edit_screen_save() {
    986         check_admin_referer( 'bbp_group_edit_save_' . $this->slug );
     980
     981        // Bail if not a POST action
     982        if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
     983            return;
     984
     985        // Bail if action is empty
     986        if ( empty( $_POST['action'] ) )
     987            return;
     988
     989        // Handle the different actions that can happen here
     990        switch ( $_POST['action'] ) {
     991
     992            // New forum
     993            case 'bbp-new-forum' :
     994
     995                // Redirect back here, not to the new forum
     996                add_filter( 'bbp_new_forum_redirect_to',   array( $this, 'edit_redirect_to' )        );
     997
     998                // Add actions to bbp_new_forum
     999                add_action( 'bbp_new_forum',               array( $this, 'new_forum'        ), 10, 4 );
     1000
     1001                // Handle the new forum
     1002                bbp_new_forum_handler();
     1003
     1004                break;
     1005
     1006            // Edit existing forum
     1007            case 'bbp-edit-forum' :
     1008
     1009                // Redirect back here, not to the new forum
     1010                add_filter( 'bbp_edit_forum_redirect_to',  array( $this, 'edit_redirect_to' )        );
     1011
     1012                // Handle the forum edit
     1013                bbp_edit_forum_handler();
     1014
     1015                break;
     1016
     1017            // Trash a forum
     1018            case 'bbp-trash-forum' :
     1019                //bbp_trash_forum_handler();
     1020                break;
     1021
     1022            // Permanently delet a forum
     1023            case 'bbp-delete-forum' :
     1024                //bbp_delete_forum_handler();
     1025                break;
     1026        }
    9871027    }
    9881028
     
    10021042            return false;
    10031043
     1044        // Add group admin actions to forum row actions
     1045        add_action( 'bbp_forum_row_actions', array( $this, 'forum_row_actions' ) );
     1046
     1047        // Show forums if needed
     1048        $this->display_group_forums();
     1049
     1050        // Output the forum form
     1051        bbp_get_template_part( 'bbpress/form', 'forum' );
     1052
     1053        // Verify intent
     1054        wp_nonce_field( 'bbp_group_create_save_' . $this->slug );
     1055    }
     1056
     1057    /**
     1058     * Save the Group Forum data on create
     1059     *
     1060     * @since bbPress (r3465)
     1061     *
     1062     * @todo Everything
     1063     */
     1064    function create_screen_save() {
     1065
     1066        // Bail if not a POST action
     1067        if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
     1068            return;
     1069
     1070        // Bail if action is empty
     1071        if ( empty( $_POST['action'] ) )
     1072            return;
     1073
     1074        // Handle the different actions that can happen here
     1075        switch ( $_POST['action'] ) {
     1076
     1077            // New forum
     1078            case 'bbp-new-forum' :
     1079
     1080                // Redirect back here, not to the new forum
     1081                add_filter( 'bbp_new_forum_redirect_to',  array( $this, 'create_redirect_to' )        );
     1082
     1083                // Add actions to bbp_new_forum
     1084                add_action( 'bbp_new_forum',              array( $this, 'new_forum'          ), 10, 4 );
     1085
     1086                // Handle the new forum
     1087                bbp_new_forum_handler();
     1088
     1089                break;
     1090
     1091            // Edit existing forum
     1092            case 'bbp-edit-forum' :
     1093
     1094                // Redirect back here, not to the new forum
     1095                add_filter( 'bbp_edit_forum_redirect_to', array( $this, 'create_redirect_to' )        );
     1096
     1097                // Handle the forum edit
     1098                bbp_edit_forum_handler();
     1099
     1100                break;
     1101
     1102            // Trash a forum
     1103            case 'bbp-trash-forum' :
     1104                //bbp_trash_forum_handler();
     1105                break;
     1106
     1107            // Permanently delet a forum
     1108            case 'bbp-delete-forum' :
     1109                //bbp_delete_forum_handler();
     1110                break;
     1111        }
     1112    }
     1113
     1114    /**
     1115     * Creating a group forum or category (including root for group)
     1116     *
     1117     * @since bbPress (r3653)
     1118     * @param type $forum_args
     1119     * @uses bbp_get_forum_id()
     1120     * @uses bp_get_current_group_id()
     1121     * @uses bbp_add_forum_id_to_group()
     1122     * @uses bbp_add_group_id_to_forum()
     1123     * @return if no forum_id is available
     1124     */
     1125    public function new_forum( $forum_args = array() ) {
     1126
     1127        // Bail if no forum_id was passed
     1128        if ( empty( $forum_args['forum_id'] ) )
     1129            return;
     1130
     1131        // Validate forum_id
     1132        $forum_id = bbp_get_forum_id( $forum_args['forum_id'] );
     1133        $group_id = bp_get_current_group_id();
     1134
     1135        bbp_add_forum_id_to_group( $group_id, $forum_id );
     1136        bbp_add_group_id_to_forum( $forum_id, $group_id );
     1137    }
     1138
     1139    /**
     1140     * Removing a group forum or category (including root for group)
     1141     *
     1142     * @since bbPress (r3653)
     1143     * @param type $forum_args
     1144     * @uses bbp_get_forum_id()
     1145     * @uses bp_get_current_group_id()
     1146     * @uses bbp_add_forum_id_to_group()
     1147     * @uses bbp_add_group_id_to_forum()
     1148     * @return if no forum_id is available
     1149     */
     1150    public function remove_forum( $forum_args = array() ) {
     1151
     1152        // Bail if no forum_id was passed
     1153        if ( empty( $forum_args['forum_id'] ) )
     1154            return;
     1155
     1156        // Validate forum_id
     1157        $forum_id = bbp_get_forum_id( $forum_args['forum_id'] );
     1158        $group_id = bp_get_current_group_id();
     1159
     1160        bbp_remove_forum_id_from_group( $group_id, $forum_id );
     1161        bbp_remove_group_id_from_forum( $forum_id, $group_id );
     1162    }
     1163
     1164    /** Display Methods *******************************************************/
     1165
     1166    /**
     1167     * Output the forums for a group in the edit/create screens
     1168     *
     1169     * @since bbPress (r3653)
     1170     * @uses bp_get_current_group_id()
     1171     * @uses bbp_get_group_forum_ids()
     1172     * @uses bbp_has_forums()
     1173     * @uses bbp_get_template_part()
     1174     */
     1175    static function display_group_forums() {
     1176
    10041177        // Forum data
    1005         $group_id   = bp_get_current_group_id();
    1006         $forum_ids  = groups_get_groupmeta( $group_id, 'forum_id' );
    1007         $forum_args = array(
    1008             'post__in' => $forum_ids
    1009         );
     1178        $forum_ids  = bbp_get_group_forum_ids( bp_get_current_group_id() );
     1179        $forum_args = array( 'post__in' => $forum_ids );
    10101180
    10111181        // Query forums and show them if
    1012         if ( !empty( $forum_ids ) && bbp_has_forums( $forum_args ) ) {
    1013             bbp_get_template_part( 'bbpress/loop', 'forums' );
    1014         } else { ?>
     1182        if ( !empty( $forum_ids ) && bbp_has_forums( $forum_args ) ) : ?>
     1183
     1184            <div id="bbpress-forums">
     1185
     1186                <?php bbp_get_template_part( 'bbpress/loop', 'forums' ); ?>
     1187
     1188            </div>
     1189
     1190        <?php else : ?>
    10151191
    10161192            <div id="message" class="info">
     
    10181194            </div>
    10191195
    1020         <?php };
    1021 
    1022         // Output the forum form
    1023         bbp_get_template_part( 'bbpress/form', 'forum' );
    1024 
    1025         // Verify intent
    1026         wp_nonce_field( 'bbp_group_create_save_' . $this->slug );
    1027     }
    1028 
    1029     /**
    1030      * Save the Group Forum data on create
    1031      *
    1032      * @since bbPress (r3465)
    1033      *
    1034      * @todo Everything
    1035      */
    1036     function create_screen_save() {
    1037         check_admin_referer( 'groups_create_save_' . $this->slug );
     1196        <?php endif;
     1197    }
     1198
     1199    /**
     1200     * Output the forums for a group in the edit/create screens
     1201     *
     1202     * @since bbPress (r3653)
     1203     * @uses bp_get_current_group_id()
     1204     * @uses bbp_get_group_forum_ids()
     1205     * @uses bbp_has_forums()
     1206     * @uses bbp_get_template_part()
     1207     */
     1208    static function display_group_forum() {
     1209
     1210        // Forum data
     1211        $forum_ids  = bbp_get_group_forum_ids( bp_get_current_group_id() );
     1212        $forum_args = array( 'post__in' => $forum_ids );
     1213
     1214        // Query forums and show them if
     1215        if ( !empty( $forum_ids ) && bbp_has_forums( $forum_args ) ) : ?>
     1216
     1217            <div id="bbpress-forums">
     1218
     1219                <?php bbp_get_template_part( 'bbpress/content', 'single-forum' ); ?>
     1220
     1221            </div>
     1222
     1223        <?php else : ?>
     1224
     1225            <div id="message" class="info">
     1226                <p><?php _e( 'This group does not have any forums. Create some or continue to the next step. You can modify this groups forums later.', 'bbpress' ); ?></p>
     1227            </div>
     1228
     1229        <?php endif;
     1230    }
     1231
     1232    /**
     1233     * Add forum row action HTML when viewing group forum admin
     1234     *
     1235     * @since bbPress (r3653)
     1236     *
     1237     * @uses bp_is_item_admin()
     1238     * @uses bbp_get_forum_id()
     1239     */
     1240    public function forum_row_actions() {
     1241
     1242        // Only admins can take actions on forums
     1243        if ( !bp_is_item_admin() )
     1244            return;
     1245
     1246        $forum_id = bbp_get_forum_id();
     1247
     1248        ?>
     1249
     1250        <div class="row-actions">
     1251
     1252            <?php // @todo add links echo 'Edit | Remove | Trash'; ?>
     1253
     1254        </div>
     1255
     1256        <?php
     1257    }
     1258
     1259    /**
     1260     * Add topic row action HTML when viewing group forum admin
     1261     *
     1262     * @since bbPress (r3653)
     1263     *
     1264     * @uses bp_is_item_admin()
     1265     * @uses bbp_get_forum_id()
     1266     */
     1267    public function topic_row_actions() {
     1268
     1269        // Only admins can take actions on forums
     1270        if ( !bp_is_item_admin() || !bp_is_item_mod() )
     1271            return;
     1272
     1273        $forum_id = bbp_get_forum_id();
     1274        $topic_id = bbp_get_topic_id();
     1275
     1276        ?>
     1277
     1278        <div class="row-actions">
     1279
     1280            <?php // @todo add links echo 'Edit | Trash | View | Close | Stick (To Front) | Spam'; ?>
     1281
     1282        </div>
     1283
     1284        <?php
     1285    }
     1286
     1287    /** Redirect Helpers ******************************************************/
     1288
     1289    /**
     1290     * Redirect to the group admin forum edit screen
     1291     *
     1292     * @since bbPress (r3653)
     1293     *
     1294     * @uses groups_get_current_group()
     1295     * @uses bp_is_group_admin_screen()
     1296     * @uses trailingslashit()
     1297     * @uses bp_get_root_domain()
     1298     * @uses bp_get_groups_root_slug()
     1299     */
     1300    public function edit_redirect_to( $redirect_url = '' ) {
     1301
     1302        // Get the current group, if there is one
     1303        $group = groups_get_current_group();
     1304
     1305        // If this is a group of any kind, empty out the redirect URL
     1306        if ( bp_is_group_admin_screen( $this->slug ) )
     1307            $redirect_url = trailingslashit( bp_get_root_domain() . '/' . bp_get_groups_root_slug() . '/' . $group->slug . '/admin/' . $this->slug );
     1308
     1309        return $redirect_url;
     1310    }
     1311
     1312    /**
     1313     * Redirect to the group creation forum edit screen
     1314     *
     1315     * @since bbPress (r3653)
     1316     *
     1317     * @uses bp_is_group_creation_step()
     1318     * @uses bp_is_action_variable()
     1319     * @uses bp_get_root_domain()
     1320     * @uses bp_get_groups_root_slug()
     1321     */
     1322    public function create_redirect_to( $redirect_url = '' ) {
     1323        global $bp;
     1324
     1325        // If this is a group of any kind, empty out the redirect URL
     1326        if ( bp_is_group_creation_step( $this->slug ) ) {
     1327
     1328            // Loop through
     1329            foreach ( (array) $bp->groups->group_creation_steps as $slug => $name ) {
     1330                if ( bp_is_action_variable( $slug ) ) {
     1331                    $previous_steps[] = $slug;
     1332                    break;
     1333                }
     1334
     1335                $previous_steps[] = $slug;
     1336            }
     1337        }
     1338        $redirect_url = trailingslashit( bp_get_root_domain() ) . bp_get_groups_root_slug() . '/create/step/' . array_pop( $previous_steps );
     1339
     1340        return $redirect_url;
    10381341    }
    10391342}
     
    10431346 * Creates the Forums component in BuddyPress
    10441347 *
    1045  * @since bbPress (r????)
     1348 * @since bbPress (r3653)
    10461349 *
    10471350 * @global bbPress $bbp
     
    12401543}
    12411544
     1545/** Forum/Group Sync **********************************************************/
     1546
     1547/**
     1548 * These functions are used to keep the many-to-many relationships between
     1549 * groups and forums synchronized. Each forum and group stores ponters to each
     1550 * other in their respective meta. This way if a group or forum is deleted
     1551 * their associattions can be updated without much effort.
     1552 */
     1553
     1554/**
     1555 * Get forum ID's for a group
     1556 *
     1557 * @param type $group_id
     1558 * @since bbPress (r3653)
     1559 */
     1560function bbp_get_group_forum_ids( $group_id = 0 ) {
     1561
     1562    // Assume no forums
     1563    $forum_ids = array();
     1564
     1565    // Use current group if none is set
     1566    if ( empty( $group_id ) )
     1567        $group_id = bp_get_current_group_id();
     1568
     1569    // Get the forums
     1570    if ( !empty( $group_id ) )
     1571        $forum_ids = groups_get_groupmeta( $group_id, 'forum_id' );
     1572
     1573    // Trim out any empty array items
     1574    $forum_ids = array_filter( $forum_ids );
     1575
     1576    return (array) apply_filters( 'bbp_get_group_forum_ids', $forum_ids, $group_id );
     1577}
     1578
     1579/**
     1580 * Get group ID's for a forum
     1581 *
     1582 * @param type $forum_id
     1583 * @since bbPress (r3653)
     1584 */
     1585function bbp_get_forum_group_ids( $forum_id = 0 ) {
     1586
     1587    // Assume no forums
     1588    $group_ids = array();
     1589
     1590    // Use current group if none is set
     1591    if ( empty( $forum_id ) )
     1592        $forum_id = bbp_get_forum_id();
     1593
     1594    // Get the forums
     1595    if ( !empty( $forum_id ) )
     1596        $group_ids = get_post_meta( $forum_id, '_bbp_group_ids' );
     1597
     1598    // Trim out any empty array items
     1599    $group_ids = array_filter( $group_ids );
     1600
     1601    return (array) apply_filters( 'bbp_get_forum_group_ids', $group_ids, $forum_id );
     1602}
     1603
     1604/**
     1605 * Get forum ID's for a group
     1606 *
     1607 * @param type $group_id
     1608 * @since bbPress (r3653)
     1609 */
     1610function bbp_update_group_forum_ids( $group_id = 0, $forum_ids = array() ) {
     1611
     1612    // Use current group if none is set
     1613    if ( empty( $group_id ) )
     1614        $group_id = bp_get_current_group_id();
     1615
     1616    // Trim out any empties
     1617    $forum_ids = array_filter( $forum_ids );
     1618
     1619    // Get the forums
     1620    return groups_update_groupmeta( $group_id, 'forum_id', $forum_ids );
     1621}
     1622
     1623/**
     1624 * Update group ID's for a forum
     1625 *
     1626 * @param type $forum_id
     1627 * @since bbPress (r3653)
     1628 */
     1629function bbp_update_forum_group_ids( $forum_id = 0, $group_ids = array() ) {
     1630    $forum_id = bbp_get_forum_id( $forum_id );
     1631
     1632    // Trim out any empties
     1633    $group_ids = array_filter( $group_ids );
     1634
     1635    // Get the forums
     1636    return update_post_meta( $forum_id, '_bbp_group_ids', $group_ids );
     1637}
     1638
     1639/**
     1640 * Add a group to a forum
     1641 *
     1642 * @param type $group_id
     1643 * @since bbPress (r3653)
     1644 */
     1645function bbp_add_group_id_to_forum( $forum_id = 0, $group_id = 0 ) {
     1646
     1647    // Validate forum_id
     1648    $forum_id = bbp_get_forum_id( $forum_id );
     1649
     1650    // Use current group if none is set
     1651    if ( empty( $group_id ) )
     1652        $group_id = bp_get_current_group_id();
     1653
     1654    // Get current group IDs
     1655    $group_ids = bbp_get_forum_group_ids( $forum_id );
     1656
     1657    // Maybe update the groups forums
     1658    if ( !in_array( $group_id, $group_ids ) ) {
     1659        $group_ids[] = $group_id;
     1660        return bbp_update_forum_group_ids( $forum_id, $group_ids );
     1661    }
     1662}
     1663
     1664/**
     1665 * Remove a forum from a group
     1666 *
     1667 * @param type $group_id
     1668 * @since bbPress (r3653)
     1669 */
     1670function bbp_add_forum_id_to_group( $group_id = 0, $forum_id = 0 ) {
     1671
     1672    // Validate forum_id
     1673    $forum_id = bbp_get_forum_id( $forum_id );
     1674
     1675    // Use current group if none is set
     1676    if ( empty( $group_id ) )
     1677        $group_id = bp_get_current_group_id();
     1678
     1679    // Get current group IDs
     1680    $forum_ids = bbp_get_group_forum_ids( $group_id );
     1681
     1682    // Maybe update the groups forums
     1683    if ( !in_array( $forum_id, $forum_ids ) ) {
     1684        $forum_ids[] = $forum_id;
     1685        return bbp_update_group_forum_ids( $group_id, $forum_ids );
     1686    }
     1687}
     1688
     1689/**
     1690 * Remove a group from a forum
     1691 *
     1692 * @param type $group_id
     1693 * @since bbPress (r3653)
     1694 */
     1695function bbp_remove_group_id_from_forum( $forum_id = 0, $group_id = 0 ) {
     1696
     1697    // Validate forum_id
     1698    $forum_id = bbp_get_forum_id( $forum_id );
     1699
     1700    // Use current group if none is set
     1701    if ( empty( $group_id ) )
     1702        $group_id = bp_get_current_group_id();
     1703
     1704    // Get current group IDs
     1705    $group_ids = bbp_get_forum_group_ids( $forum_id );
     1706
     1707    // Maybe update the groups forums
     1708    if ( in_array( $group_id, $group_ids ) ) {
     1709        unset( $group_ids[$group_id] );
     1710        return bbp_update_forum_group_ids( $forum_id, $group_ids );
     1711    }
     1712}
     1713
     1714/**
     1715 * Remove a forum from a group
     1716 *
     1717 * @param type $group_id
     1718 * @since bbPress (r3653)
     1719 */
     1720function bbp_remove_forum_id_from_group( $group_id = 0, $forum_id = 0 ) {
     1721
     1722    // Validate forum_id
     1723    $forum_id = bbp_get_forum_id( $forum_id );
     1724
     1725    // Use current group if none is set
     1726    if ( empty( $group_id ) )
     1727        $group_id = bp_get_current_group_id();
     1728
     1729    // Get current group IDs
     1730    $forum_ids = bbp_get_group_forum_ids( $group_id );
     1731
     1732    // Maybe update the groups forums
     1733    if ( in_array( $forum_id, $forum_ids ) ) {
     1734        unset( $forum_ids[$forum_id] );
     1735        return bbp_update_group_forum_ids( $group_id, $forum_ids );
     1736    }
     1737}
     1738
     1739/**
     1740 * Remove a group from aall forums
     1741 *
     1742 * @param type $group_id
     1743 * @since bbPress (r3653)
     1744 */
     1745function bbp_remove_group_id_from_all_forums( $group_id = 0 ) {
     1746
     1747    // Use current group if none is set
     1748    if ( empty( $group_id ) )
     1749        $group_id = bp_get_current_group_id();
     1750
     1751    // Get current group IDs
     1752    $forum_ids = bbp_get_group_forum_ids( $group_id );
     1753
     1754    // Loop through forums and remove this group from each one
     1755    foreach( (array) $forum_ids as $forum_id ) {
     1756        bbp_remove_group_id_from_forum( $group_id, $forum_id );
     1757    }
     1758}
     1759
     1760/**
     1761 * Remove a forum from all groups
     1762 *
     1763 * @param type $forum_id
     1764 * @since bbPress (r3653)
     1765 */
     1766function bbp_remove_forum_id_from_all_groups( $forum_id = 0 ) {
     1767
     1768    // Validate
     1769    $forum_id  = bbp_get_forum_id( $forum_id );
     1770    $group_ids = bbp_get_forum_group_ids( $forum_id );
     1771
     1772    // Loop through groups and remove this forum from each one
     1773    foreach( (array) $group_ids as $group_id ) {
     1774        bbp_remove_forum_id_from_group( $forum_id, $group_id );
     1775    }
     1776}
     1777
    12421778?>
Note: See TracChangeset for help on using the changeset viewer.