Skip to:
Content
Pages
Categories
Search
Top
Bottom

Soon to release bp group control plugin


  • dpolant
    Participant

    @dpolant

    I am almost done with a plugin that will allow some new interactions within Buddypress groups. This plugin is designed to be useful for sites that have users whose presence on the site is dependent on being tied to a certain group. I developed these features for a client whose users were people who worked for different companies.

    Features (all of which can be disabled through options)

    – Members can select an identifying group to display next to their name

    – Group admins and/or site admins can add users directly to groups

    – Group admins can delete users from their groups if they created that user

    The people for whom I built this plugin run a trade association that companies must pay to join. They wanted a work flow in which they could create a group for a new company and assign a group admin, and then let him or her add other users to be members of that group.

    I want to get some feedback as to whether any one thought these features might be useful. Any commentary is welcome.

Viewing 13 replies - 1 through 13 (of 13 total)

  • @mercime
    Keymaster

    @mercime

    Sounds cool to me. Hopefully it will work with Jeff’s Privacy Control Plugin as well.


    Bowe
    Participant

    @bowromir

    Interesting concept and I think this could come in handy for my project.. Basically I will have two kinds of groups: discussions groups and charity groups. I need to find a way to separate these groups and allow them to have different functions, but I would use the features described above for my charity groups for sure. I only have one question;

    Can normal users still join a group in the regular way ? Or does it mean that group leaders can only assign users to the group and normal users can’t join? It would be ideal if some users could get the “role” you described (with group name for their username) and that normal users could become members as well..

    I sure like the idea!


    abcde666
    Participant

    @erich73

    @dpolant

    I am very much interested in your plug-in (if it is working fine with BP 1.2).

    Many thanks !


    dpolant
    Participant

    @dpolant

    @bowe

    Right now my plugin doesn’t distinguish between different types of groups. But maybe today I will add an option that will let you enable different features in private vs public groups. The buddypress guys are working on a taxonomy system for groups that gives you more options than just private public or hidden, but that maybe a ways off. Sounds like you only need two types of groups right now anyway.

    There’s nothing that will prevent normal users from joining a group in the usual way. You can set it so that they can set the group as “identifying” (with the group name next to their name) or not.

    @mercime

    Seems like it shouldn’t have any conflicts with the privacy plugin, but I’ll have to try it out to be sure.


    Bowe
    Participant

    @bowromir

    Thanks for your reply and now that you’ve explained it better it sounds like an even better idea. My “group categories” functionality is not currently available in BP, but I think it won’t be long before someone creates something like this. I might ask someone to develop it for me (paid ofcourse), because I would like to see such a feature on my site. Looking forward to your plugin!


    dpolant
    Participant

    @dpolant

    Burt adsit created a plugin called bp-contents for group and member taxonomy, but it was never updated for bp 1.1 or above. I updated the group features to work in bp 1.1.2, but if I were you I would wait for the Buddypress team to add taxonomy stuff to the core (this will be better supported than my hacked bp-contents).

    Any way, I hope to have some code for you guys to test out by the end of the week :)

    PS, if any one here has experience finding security vulnerabilities, I’d like to get some other sets of eyes to make sure my plugin is completely secure.


    r-a-y
    Keymaster

    @r-a-y

    Hey dpolant,

    You should also know that Marius Ooms has attempted a port of BP Contents:

    http://sandbox.ywamcloud.com

    Maybe you guys can work together?


    Anonymous
    Inactive

    Sounds very interesting. I’d be curious about (a) Whether users can apply for membership in groups, which group admins can then approve or deny (i.e. shift the burden to users) and (b) whether groups can have grandparent-parent-child-grandchild hierarchies (e.g. Class 1B is a child of all first grade classes, which is a child of School Z, which is a child of School District Q, etc.)


    Boris
    Participant

    @travel-junkie

    @Bowe

    setting up different group types is fairly easy. You just have to attach some groupmeta to the group, that basically let you add as many types as you’d like. Then you just check the metadata to figure out what type of group you’re in. Using the groups API you can then add different functionality for different groups.

    I’ve written a types-plugin for one of my sites. It doesn’t have an interface, though. The 3 types I needed are hardcoded into it, so it’s really not suited for a release at the moment. There’s also a lot of more stuff, like a shopping cart, part of that plugin. So, I’ve stripped the functions needed for group types out (hopefully al of them).

    First we need to add the addtional fields to our registration form:

    function sv_add_registration_group_types()
    {
    ?>
    <div id="account-type" class="register-section">
    <h3 class="transform"><?php _e( 'Choose your account type (required)', 'group-types' ) ?></h3>

    <script type="text/javascript" defer="defer">
    jQuery(document).ready(function(){
    jQuery("#account-type-normal_user").attr("checked", true);
    jQuery("#group-details").hide();
    jQuery("#account-type-type_one,#account-type-type_two,#account-type-type_three").click(function(){
    if (jQuery(this).is(":checked")) {
    jQuery("#group-details").slideDown("slow");
    } else {
    jQuery("#group-details").slideUp("slow");
    }
    });
    jQuery("#account-type-normal_user").click(function(){
    if (jQuery(this).is(":checked")) {
    jQuery("#group-details").slideUp("slow");
    } else {
    jQuery("#group-details").slideDown("slow");
    }
    });
    });
    </script>

    <?php do_action( 'bp_account_type_errors' ) ?>
    <label><input type="radio" name="account_type" id="account-type-normal_user" value="normal_user" checked="checked" /><?php _e( 'User', 'group-types' ) ?></label>
    <label><input type="radio" name="account_type" id="account-type-type_one" value="type_one" /><?php _e( 'Type 1', 'group-types' ) ?></label>
    <label><input type="radio" name="account_type" id="account-type-type_two" value="type_two" /><?php _e( 'Type 2', 'group-types' ) ?></label>
    <label><input type="radio" name="account_type" id="account-type-type_three" value="type_three" /><?php _e( 'Type 3', 'group-types' ) ?></label>

    <div id="group-details">
    <p><?php _e( 'We will automatically create a group for your business or organization. This group will be tailored to your needs! You can change the description and the news later in the admin section of your group.', 'group-types' ); ?></p>

    <?php do_action( 'bp_group_name_errors' ) ?>
    <label for="group_name"><?php _e( 'Group Name', 'scuba' ) ?> <?php _e( '(required)', 'buddypress' ) ?></label>
    <input type="text" name="group_name" id="group_name" value="" />
    <br /><small><?php _e( 'We suggest you use the name of your business or organization', 'group-types' ) ?></small>

    <label for="group_desc"><?php _e( 'Group Description', 'scuba' ) ?></label>
    <textarea rows="5" cols="40" name="group_desc" id="group_desc"></textarea>
    <br /><small><?php _e( 'This description will be visible on your group profile, so it could be used to present your mission statement for example.', 'group-types' ) ?></small>

    <label for="group_news"><?php _e( 'Group News', 'scuba' ) ?></label>
    <textarea rows="5" cols="40" name="group_news" id="group_news"></textarea>
    <br /><small><?php _e( 'Enter any news that you want potential members to see.', 'group-types' ) ?></small>
    </div>
    </div>
    <?php
    }
    add_action( 'bp_before_registration_submit_buttons', 'sv_add_registration_group_types' );

    Then we have to validate things and add some usermeta when a regitration happens:

    /**
    * Add custom userdata from register.php
    * @since 1.0
    */
    function sv_add_to_signup( $usermeta )
    {
    $usermeta['account_type'] = $_POST['account_type'];

    if( isset( $_POST['group_name'] ) )
    $usermeta['group_name'] = $_POST['group_name'];

    if( isset( $_POST['group_desc'] ) )
    $usermeta['group_desc'] = $_POST['group_desc'];

    if( isset( $_POST['group_news'] ) )
    $usermeta['group_news'] = $_POST['group_news'];

    return $usermeta;
    }
    add_filter( 'bp_signup_usermeta', 'sv_add_to_signup' );

    /**
    * Update usermeta with custom registration data
    * @since 1.0
    */
    function sv_user_activate_fields( $user )
    {
    update_usermeta( $user['user_id'], 'account_type', $user['meta']['account_type'] );

    if( isset( $user['meta']['group_name'] ) )
    update_usermeta( $user['user_id'], 'group_name', $user['meta']['group_name'] );

    if( isset( $user['meta']['group_desc'] ) )
    update_usermeta( $user['user_id'], 'group_desc', $user['meta']['group_desc'] );

    if( isset( $user['meta']['group_news'] ) )
    update_usermeta( $user['user_id'], 'group_news', $user['meta']['group_news'] );

    return $user;
    }
    add_filter( 'bp_core_activate_account', 'sv_user_activate_fields' );

    /**
    * Perform checks for custom registration data
    * @since 1.0
    */
    function sv_check_additional_signup()
    {
    global $bp;

    if( empty( $_POST['account_type'] ) )
    $bp->signup->errors['account_type'] = __( 'You need to choose your account type', 'group-types' );

    if( empty( $_POST['group_name'] ) && $_POST['account_type'] != 'normal_user' )
    $bp->signup->errors['group_name'] = __( 'You need to pick a group name', 'group-types' );

    if( ! empty( $_POST['group_name'] ) && $_POST['account_type'] != 'normal_user' )
    {
    $slug = sanitize_title_with_dashes( $_POST['group_name'] );
    $exist = groups_check_group_exists( $slug );
    if( $exist )
    $bp->signup->errors['group_name'] = __( 'This name is not available. If you feel this is a mistake, please <a href="/contact">contact us</a>.', 'group-types' );
    }
    }
    add_action( 'bp_signup_validate', 'sv_check_additional_signup' );

    And then we set up the group for the user (there are some constants in this function, so you’ll need to change that):

    /**
    * Create custom groups for skools, biz and org accounts
    * @since 1.0
    */
    function sv_init_special_groups( $user )
    {
    global $bp;

    // get account type
    $type = get_usermeta( $user['user_id'], 'account_type' );

    if( $type == 'normal_user' )
    {
    // Do nothing
    }
    elseif( $type == 'type_one' || $type == 'type_two' || $type == 'type_three' )
    {
    // get some more data from sign up
    $group_name = get_usermeta( $user['user_id'], 'group_name' );
    $group_desc = get_usermeta( $user['user_id'], 'group_desc' );
    $group_news = get_usermeta( $user['user_id'], 'group_news' );

    $slug = sanitize_title_with_dashes( $group_name );

    // create dive skool group
    $group_id = groups_create_group( array(
    'creator_id' => $user['user_id'],
    'name' => $group_name,
    'slug' => $slug,
    'description' => $group_desc,
    'news' => $group_news,
    'status' => 'public',
    'enable_wire' => true,
    'enable_forum' => true,
    'date_created' => gmdate('Y-m-d H:i:s')
    )
    );
    // add the type to our group
    groups_update_groupmeta( $group_id, 'group_type', $type );

    // delete now useless data
    delete_usermeta( $user['user_id'], 'group_name' );
    delete_usermeta( $user['user_id'], 'group_desc' );
    delete_usermeta( $user['user_id'], 'group_news' );

    // include PHPMailer
    require_once( SV_MAILER . 'class.phpmailer.php' );

    $mail = new PHPMailer();
    $mail->IsSMTP();
    $mail->Host = SV_SMTP;

    $auth = get_userdata( $user['user_id'] );
    $profile_link = $bp->root_domain . '/' . $bp->groups->slug . '/' . $slug . '/admin';

    $message = sprintf( __( 'Hello %s,

    we have created a group for your business or organization. To get more out of your presence on Yoursitenamehere please take some time to set it up properly.

    Please follow this link to fill in the rest of your profile: %s

    We wish you all the best. Should you have any questions regarding your new group, please contact us at support@yoursitenamehere.com.

    Your Yoursitenamehere Team', 'group-types' ), $auth->display_name, $profile_link );

    $mail->SetFrom("support@yoursitenamehere.com","Yoursitenamehere");
    $mail->AddAddress( $auth->user_email );

    $mail->Subject = __( 'Your new group pages on Yoursitenamehere', 'group-types' );
    $mail->Body = $message;
    $mail->WordWrap = 75;
    $mail->Send();
    }
    }
    add_action( 'bp_core_account_activated', 'sv_init_special_groups' );

    When you write a group extension we’ll have to swap the activation call with a function like the one below to be able to check for group types.

    /**
    * Replacement activation function for group extension classes
    */
    function activate_type_one()
    {
    global $bp;
    $type = groups_get_groupmeta( $bp->groups->current_group->id, 'group_type' );
    if( $type == 'type_one' )
    {
    $extension = new Group_Type_One;
    add_action( "wp", array( &$extension, "_register" ), 2 );
    }
    }
    add_action( 'plugins_loaded', 'activate_type_one' );

    The last thing we need to do is add our group type names to group and directory pages:

    /**
    * Modify the group type status
    */
    function sv_get_group_type( $type, $group = false )
    {
    global $groups_template;

    if( ! $group )
    $group =& $groups_template->group;

    $gtype = groups_get_groupmeta( $group->id, 'group_type' );
    if( $gtype == 'type_one' )
    $name = __( 'Type 1', 'group-types' );

    elseif( $gtype == 'type_two' )
    $name = __( 'Type 2', 'group-types' );

    elseif( $gtype == 'type_three' )
    $name = __( 'Type 3', 'group-types' );

    else
    $name = __( 'User Group', 'group-types' );

    if( 'public' == $group->status )
    {
    $type = sprintf( __( "%s (public)", "group-types" ), $name );
    }
    elseif( 'hidden' == $group->status )
    {
    $type = sprintf( __( "%s (hidden)", "group-types" ), $name );
    }
    elseif( 'private' == $group->status )
    {
    $type = sprintf( __( "%s (private)", "group-types" ), $name );
    }
    else
    {
    $type = ucwords( $group->status ) . ' ' . __( 'Group', 'buddypress' );
    }

    return $type;
    }
    add_filter( 'bp_get_group_type', 'sv_get_group_type' );

    /**
    * Modify the group type status on directory pages
    */
    function sv_get_the_site_group_type()
    {
    global $site_groups_template;

    return sv_get_group_type( '', $site_groups_template->group );
    }
    add_filter( 'bp_get_the_site_group_type', 'sv_get_the_site_group_type' );

    It’s quite a bit of code, but it should get you started. This hasn’t been tested with 1.2 btw.


    dpolant
    Participant

    @dpolant

    @robertdevane

    I haven’t implemented anything that gives different admins different permission levels – but I like this idea and I will add it to the list of things to include in the next version.

    I agree with a lot of you that group taxonomy systems will complement this plugin well. Per the request of Bowe, I added in options that let you make different settings for private and public groups. I’m going to leave further taxonomical distinctions to other plugin developers I think.

    I got a little distracted during the holidays and it will be another week or so before I get this code out. Thanks for the interest, i’ll keep you all posted.

    Just want to chime in and say much love to you all :-) I need better group management and it sounds like this will be the answer.


    designodyssey
    Participant

    @designodyssey

    Just looked at this in detail. Very helpful. Any testing done with 1.2 yet?


    aribo
    Participant

    @aribo

    Hi, +1 for group taxonomy. I’d need to divide between two group types: working and community groups. Then I’d need two types of permissions. Working groups can only be created by admins and community group by any users. Working groups can only be accessible by members. Community groups by any user.
    Any ideas? Thanks for all your work!
    A.

Viewing 13 replies - 1 through 13 (of 13 total)
  • The topic ‘Soon to release bp group control plugin’ is closed to new replies.
Skip to toolbar