2010-07-05 06:33:02 -04:00
< ? php
function group_add ( $uid , $name ) {
2010-07-13 02:08:07 -04:00
2010-07-05 06:33:02 -04:00
$ret = false ;
if ( x ( $uid ) && x ( $name )) {
$r = group_byname ( $uid , $name ); // check for dups
2011-09-18 09:20:18 -04:00
if ( $r !== false ) {
2014-03-11 18:52:32 -04:00
// This could be a problem.
2011-09-18 09:20:18 -04:00
// Let's assume we've just created a group which we once deleted
// all the old members are gone, but the group remains so we don't break any security
// access lists. What we're doing here is reviving the dead group, but old content which
2014-03-11 18:52:32 -04:00
// was restricted to this group may now be seen by the new group members.
2011-09-18 09:20:18 -04:00
$z = q ( " SELECT * FROM `group` WHERE `id` = %d LIMIT 1 " ,
intval ( $r )
);
if ( count ( $z ) && $z [ 0 ][ 'deleted' ]) {
2014-03-11 18:52:32 -04:00
$r = q ( " UPDATE `group` SET `deleted` = 0 WHERE `uid` = %d AND `name` = '%s' " ,
2011-09-18 09:20:18 -04:00
intval ( $uid ),
dbesc ( $name )
);
notice ( t ( 'A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name.' ) . EOL );
}
2010-07-05 06:33:02 -04:00
return true ;
2011-09-18 09:20:18 -04:00
}
2010-07-11 09:06:30 -04:00
$r = q ( " INSERT INTO `group` ( `uid`, `name` )
2010-07-05 06:33:02 -04:00
VALUES ( % d , '%s' ) " ,
intval ( $uid ),
dbesc ( $name )
);
$ret = $r ;
2014-03-11 18:52:32 -04:00
}
2010-07-05 06:33:02 -04:00
return $ret ;
}
function group_rmv ( $uid , $name ) {
$ret = false ;
if ( x ( $uid ) && x ( $name )) {
2012-09-29 19:53:06 -04:00
$r = q ( " SELECT id FROM `group` WHERE `uid` = %d AND `name` = '%s' LIMIT 1 " ,
2010-07-05 06:33:02 -04:00
intval ( $uid ),
dbesc ( $name )
2010-07-11 05:52:47 -04:00
);
2016-12-14 03:42:36 -05:00
if ( dbm :: is_result ( $r ))
2010-07-05 06:33:02 -04:00
$group_id = $r [ 0 ][ 'id' ];
if ( ! $group_id )
return false ;
2012-09-29 19:53:06 -04:00
// remove group from default posting lists
$r = q ( " SELECT def_gid, allow_gid, deny_gid FROM user WHERE uid = %d LIMIT 1 " ,
intval ( $uid )
);
if ( $r ) {
$user_info = $r [ 0 ];
$change = false ;
if ( $user_info [ 'def_gid' ] == $group_id ) {
$user_info [ 'def_gid' ] = 0 ;
$change = true ;
}
if ( strpos ( $user_info [ 'allow_gid' ], '<' . $group_id . '>' ) !== false ) {
$user_info [ 'allow_gid' ] = str_replace ( '<' . $group_id . '>' , '' , $user_info [ 'allow_gid' ]);
$change = true ;
}
if ( strpos ( $user_info [ 'deny_gid' ], '<' . $group_id . '>' ) !== false ) {
$user_info [ 'deny_gid' ] = str_replace ( '<' . $group_id . '>' , '' , $user_info [ 'deny_gid' ]);
$change = true ;
}
if ( $change ) {
q ( " UPDATE user SET def_gid = %d, allow_gid = '%s', deny_gid = '%s' WHERE uid = %d " ,
intval ( $user_info [ 'def_gid' ]),
dbesc ( $user_info [ 'allow_gid' ]),
dbesc ( $user_info [ 'deny_gid' ]),
intval ( $uid )
);
}
}
2010-07-05 06:33:02 -04:00
// remove all members
$r = q ( " DELETE FROM `group_member` WHERE `uid` = %d AND `gid` = %d " ,
intval ( $uid ),
intval ( $group_id )
);
// remove group
2014-03-11 18:52:32 -04:00
$r = q ( " UPDATE `group` SET `deleted` = 1 WHERE `uid` = %d AND `name` = '%s' " ,
2010-07-05 06:33:02 -04:00
intval ( $uid ),
dbesc ( $name )
);
$ret = $r ;
}
return $ret ;
}
function group_byname ( $uid , $name ) {
if (( ! $uid ) || ( ! strlen ( $name )))
return false ;
$r = q ( " SELECT * FROM `group` WHERE `uid` = %d AND `name` = '%s' LIMIT 1 " ,
intval ( $uid ),
dbesc ( $name )
);
2016-12-14 03:42:36 -05:00
if ( dbm :: is_result ( $r ))
2010-07-05 06:33:02 -04:00
return $r [ 0 ][ 'id' ];
return false ;
}
function group_rmv_member ( $uid , $name , $member ) {
$gid = group_byname ( $uid , $name );
if ( ! $gid )
return false ;
if ( ! ( $uid && $gid && $member ))
return false ;
2014-03-11 18:52:32 -04:00
$r = q ( " DELETE FROM `group_member` WHERE `uid` = %d AND `gid` = %d AND `contact-id` = %d " ,
2010-07-05 06:33:02 -04:00
intval ( $uid ),
intval ( $gid ),
intval ( $member )
);
return $r ;
2014-03-11 18:52:32 -04:00
2010-07-05 06:33:02 -04:00
}
2012-05-18 01:44:52 -04:00
function group_add_member ( $uid , $name , $member , $gid = 0 ) {
if ( ! $gid )
$gid = group_byname ( $uid , $name );
2010-07-05 06:33:02 -04:00
if (( ! $gid ) || ( ! $uid ) || ( ! $member ))
return false ;
2014-03-11 18:52:32 -04:00
$r = q ( " SELECT * FROM `group_member` WHERE `uid` = %d AND `gid` = %d AND `contact-id` = %d LIMIT 1 " ,
2010-07-05 06:33:02 -04:00
intval ( $uid ),
intval ( $gid ),
intval ( $member )
);
2016-12-14 03:42:36 -05:00
if ( dbm :: is_result ( $r ))
2014-03-11 18:52:32 -04:00
return true ; // You might question this, but
2011-11-23 04:44:07 -05:00
// we indicate success because the group member was in fact created
2010-07-05 06:33:02 -04:00
// -- It was just created at another time
2016-12-13 04:44:13 -05:00
if ( ! dbm :: is_result ( $r ))
2010-07-05 06:33:02 -04:00
$r = q ( " INSERT INTO `group_member` (`uid`, `gid`, `contact-id`)
VALUES ( % d , % d , % d ) " ,
intval ( $uid ),
intval ( $gid ),
intval ( $member )
);
return $r ;
2010-07-11 05:52:47 -04:00
}
2010-07-13 02:08:07 -04:00
function group_get_members ( $gid ) {
$ret = array ();
if ( intval ( $gid )) {
2015-11-08 10:41:00 -05:00
$r = q ( " SELECT `group_member`.`contact-id`, `contact`.* FROM `group_member`
INNER JOIN `contact` ON `contact` . `id` = `group_member` . `contact-id`
WHERE `gid` = % d AND `group_member` . `uid` = % d AND
NOT `contact` . `self` AND NOT `contact` . `blocked` AND NOT `contact` . `pending`
ORDER BY `contact` . `name` ASC " ,
2010-07-13 02:08:07 -04:00
intval ( $gid ),
2011-04-03 23:41:40 -04:00
intval ( local_user ())
2010-07-13 02:08:07 -04:00
);
2016-12-14 03:42:36 -05:00
if ( dbm :: is_result ( $r ))
2010-07-13 02:08:07 -04:00
$ret = $r ;
}
return $ret ;
}
2011-04-03 23:41:40 -04:00
function group_public_members ( $gid ) {
$ret = 0 ;
if ( intval ( $gid )) {
2015-11-08 10:41:00 -05:00
$r = q ( " SELECT `contact`.`id` AS `contact-id` FROM `group_member`
INNER JOIN `contact` ON `contact` . `id` = `group_member` . `contact-id`
WHERE `gid` = % d AND `group_member` . `uid` = % d
2011-09-13 18:26:47 -04:00
AND `contact` . `network` = '%s' AND `contact` . `notify` != '' " ,
2011-04-03 23:41:40 -04:00
intval ( $gid ),
2011-08-23 21:17:35 -04:00
intval ( local_user ()),
dbesc ( NETWORK_OSTATUS )
2015-11-08 10:41:00 -05:00
);
2016-12-14 03:42:36 -05:00
if ( dbm :: is_result ( $r ))
2011-04-03 23:41:40 -04:00
$ret = count ( $r );
}
return $ret ;
}
2010-07-11 05:52:47 -04:00
2016-03-06 07:15:27 -05:00
function mini_group_select ( $uid , $gid = 0 , $label = " " ) {
2015-11-08 10:41:00 -05:00
2012-05-18 01:44:52 -04:00
$grps = array ();
$o = '' ;
$r = q ( " SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC " ,
intval ( $uid )
);
$grps [] = array ( 'name' => '' , 'id' => '0' , 'selected' => '' );
2016-12-14 03:42:36 -05:00
if ( dbm :: is_result ( $r )) {
2012-05-18 01:44:52 -04:00
foreach ( $r as $rr ) {
$grps [] = array ( 'name' => $rr [ 'name' ], 'id' => $rr [ 'id' ], 'selected' => (( $gid == $rr [ 'id' ]) ? 'true' : '' ));
}
}
logger ( 'groups: ' . print_r ( $grps , true ));
2016-03-06 07:15:27 -05:00
if ( $label == " " )
$label = t ( 'Default privacy group for new contacts' );
2012-05-18 04:38:11 -04:00
$o = replace_macros ( get_markup_template ( 'group_selection.tpl' ), array (
2016-03-06 07:15:27 -05:00
'$label' => $label ,
2015-11-08 10:41:00 -05:00
'$groups' => $grps
2012-05-18 04:38:11 -04:00
));
2012-05-18 01:44:52 -04:00
return $o ;
}
2015-11-28 14:09:28 -05:00
/**
* @ brief Create group sidebar widget
2016-02-13 12:15:24 -05:00
*
2015-11-28 14:09:28 -05:00
* @ param string $every
* @ param string $each
* @ param string $editmode
* 'standard' => include link 'Edit groups'
* 'extended' => include link 'Create new group'
* 'full' => include link 'Create new group' and provide for each group a link to edit this group
* @ param int $group_id
* @ param int $cid
* @ return string
*/
function group_side ( $every = " contacts " , $each = " group " , $editmode = " standard " , $group_id = 0 , $cid = 0 ) {
2010-07-11 05:52:47 -04:00
2010-10-31 19:38:22 -04:00
$o = '' ;
2010-07-11 05:52:47 -04:00
if ( ! local_user ())
2010-10-31 19:38:22 -04:00
return '' ;
2010-07-27 22:27:14 -04:00
2011-11-21 06:34:22 -05:00
$groups = array ();
2016-02-13 12:15:24 -05:00
2011-11-21 06:34:22 -05:00
$groups [] = array (
'text' => t ( 'Everybody' ),
2011-12-01 02:01:42 -05:00
'id' => 0 ,
2011-11-21 06:34:22 -05:00
'selected' => (( $group_id == 0 ) ? 'group-selected' : '' ),
'href' => $every ,
);
2010-07-11 05:52:47 -04:00
2010-07-11 09:06:30 -04:00
2010-07-11 05:52:47 -04:00
2011-05-30 00:45:00 -04:00
$r = q ( " SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC " ,
2010-07-11 05:52:47 -04:00
intval ( $_SESSION [ 'uid' ])
);
2011-11-21 06:34:22 -05:00
$member_of = array ();
2011-08-03 01:39:35 -04:00
if ( $cid ) {
$member_of = groups_containing ( local_user (), $cid );
2015-11-28 14:09:28 -05:00
}
2011-08-03 01:39:35 -04:00
2016-12-14 03:42:36 -05:00
if ( dbm :: is_result ( $r )) {
2011-07-01 09:26:46 -04:00
foreach ( $r as $rr ) {
2011-09-23 06:12:31 -04:00
$selected = (( $group_id == $rr [ 'id' ]) ? ' group-selected' : '' );
2016-02-13 12:15:24 -05:00
2015-11-28 14:09:28 -05:00
if ( $editmode == " full " ) {
2011-11-21 06:34:22 -05:00
$groupedit = array (
'href' => " group/ " . $rr [ 'id' ],
'title' => t ( 'edit' ),
);
} else {
$groupedit = null ;
}
2016-02-13 12:15:24 -05:00
2011-11-21 06:34:22 -05:00
$groups [] = array (
'id' => $rr [ 'id' ],
'cid' => $cid ,
'text' => $rr [ 'name' ],
'selected' => $selected ,
'href' => $each . " / " . $rr [ 'id' ],
'edit' => $groupedit ,
'ismember' => in_array ( $rr [ 'id' ], $member_of ),
);
2011-07-01 09:26:46 -04:00
}
2010-07-11 05:52:47 -04:00
}
2015-08-08 16:30:43 -04:00
2011-11-21 06:34:22 -05:00
$tpl = get_markup_template ( " group_side.tpl " );
$o = replace_macros ( $tpl , array (
2015-11-28 14:09:28 -05:00
'$title' => t ( 'Groups' ),
'newgroup' => (( $editmode == " extended " ) || ( $editmode == " full " ) ? 1 : '' ),
'$editgroupstext' => t ( 'Edit groups' ),
'grouppage' => " group/ " ,
2011-12-01 19:33:53 -05:00
'$edittext' => t ( 'Edit group' ),
2011-11-21 06:34:22 -05:00
'$createtext' => t ( 'Create a new group' ),
2015-11-28 14:09:28 -05:00
'$creategroup' => t ( 'Group Name: ' ),
'$form_security_token' => get_form_security_token ( " group_edit " ),
2012-04-13 02:06:41 -04:00
'$ungrouped' => (( $every === 'contacts' ) ? t ( 'Contacts not in any group' ) : '' ),
2015-11-28 14:09:28 -05:00
'$groups' => $groups ,
'$add' => t ( 'add' ),
2011-11-21 06:34:22 -05:00
));
2015-08-08 16:30:43 -04:00
2010-07-11 05:52:47 -04:00
return $o ;
2010-07-15 02:04:10 -04:00
}
2016-01-10 03:19:00 -05:00
function expand_groups ( $a , $check_dead = false , $use_gcontact = false ) {
2010-07-15 02:04:10 -04:00
if ( ! ( is_array ( $a ) && count ( $a )))
return array ();
$groups = implode ( ',' , $a );
$groups = dbesc ( $groups );
2016-01-10 03:19:00 -05:00
if ( $use_gcontact )
$r = q ( " SELECT `gcontact`.`id` AS `contact-id` FROM `group_member`
INNER JOIN `contact` ON `contact` . `id` = `group_member` . `contact-id`
INNER JOIN `gcontact` ON `gcontact` . `nurl` = `contact` . `nurl`
WHERE `gid` IN ( $groups ) " );
else
$r = q ( " SELECT `contact-id` FROM `group_member` WHERE `gid` IN ( $groups ) " );
2010-07-15 02:04:10 -04:00
$ret = array ();
2016-12-14 03:42:36 -05:00
if ( dbm :: is_result ( $r ))
2010-07-15 02:04:10 -04:00
foreach ( $r as $rr )
$ret [] = $rr [ 'contact-id' ];
2016-01-10 03:19:00 -05:00
if ( $check_dead AND ! $use_gcontact ) {
2012-12-14 00:02:14 -05:00
require_once ( 'include/acl_selectors.php' );
$ret = prune_deadguys ( $ret );
}
2010-07-15 02:04:10 -04:00
return $ret ;
}
2011-05-31 22:24:26 -04:00
function member_of ( $c ) {
2014-03-09 04:19:14 -04:00
$r = q ( " SELECT `group`.`name`, `group`.`id` FROM `group` INNER JOIN `group_member` ON `group_member`.`gid` = `group`.`id` WHERE `group_member`.`contact-id` = %d AND `group`.`deleted` = 0 ORDER BY `group`.`name` ASC " ,
2011-05-31 22:24:26 -04:00
intval ( $c )
);
return $r ;
}
2011-08-03 01:39:35 -04:00
function groups_containing ( $uid , $c ) {
$r = q ( " SELECT `gid` FROM `group_member` WHERE `uid` = %d AND `group_member`.`contact-id` = %d " ,
intval ( $uid ),
intval ( $c )
);
$ret = array ();
2016-12-14 03:42:36 -05:00
if ( dbm :: is_result ( $r )) {
2011-08-03 01:39:35 -04:00
foreach ( $r as $rr )
$ret [] = $rr [ 'gid' ];
}
return $ret ;
2011-11-21 06:34:22 -05:00
}
2015-12-03 16:42:53 -05:00
/**
* @ brief count unread group items
*
* Count unread items of each groups
*
* @ return array
2015-12-03 16:51:00 -05:00
* 'id' => group id
2015-12-03 16:42:53 -05:00
* 'name' => group name
* 'count' => counted unseen group items
*
*/
2015-12-03 11:15:49 -05:00
function groups_count_unseen () {
2015-12-03 16:42:53 -05:00
2016-02-13 12:15:24 -05:00
$r = q ( " SELECT `group`.`id`, `group`.`name`,
2016-06-06 16:57:27 -04:00
( SELECT COUNT ( * ) FROM `item` FORCE INDEX ( `uid_unseen_contactid` )
2016-02-13 12:15:24 -05:00
WHERE `uid` = % d AND `unseen` AND
`contact-id` IN ( SELECT `contact-id` FROM `group_member`
WHERE `group_member` . `gid` = `group` . `id` AND `group_member` . `uid` = % d )) AS `count`
FROM `group` WHERE `group` . `uid` = % d ; " ,
intval ( local_user ()),
2015-12-03 11:15:49 -05:00
intval ( local_user ()),
intval ( local_user ())
);
2015-12-03 16:42:53 -05:00
return $r ;
2016-01-10 03:19:00 -05:00
}
2016-03-06 07:15:27 -05:00
/**
* @ brief Returns the default group for a given user and network
*
* @ param int $uid User id
* @ param string $network network name
*
* @ return int group id
*/
function get_default_group ( $uid , $network = " " ) {
$default_group = 0 ;
if ( $network == NETWORK_OSTATUS )
$default_group = get_pconfig ( $uid , " ostatus " , " default_group " );
if ( $default_group != 0 )
return $default_group ;
$g = q ( " SELECT `def_gid` FROM `user` WHERE `uid` = %d LIMIT 1 " , intval ( $uid ));
if ( $g && intval ( $g [ 0 ][ " def_gid " ]))
$default_group = $g [ 0 ][ " def_gid " ];
return $default_group ;
}