diff options
Diffstat (limited to 'engine/lib/river.php')
| -rw-r--r-- | engine/lib/river.php | 267 | 
1 files changed, 158 insertions, 109 deletions
| diff --git a/engine/lib/river.php b/engine/lib/river.php index fefd56ef2..ad069d5cf 100644 --- a/engine/lib/river.php +++ b/engine/lib/river.php @@ -3,22 +3,26 @@   * Elgg river 2.0.   * Functions for listening for and generating the river separately from the system log.   * - * @package Elgg - * @subpackage Core + * @package Elgg.Core + * @subpackage SocialModel.River   */  /**   * Adds an item to the river.   * - * @param string $view The view that will handle the river item (must exist) - * @param string $action_type An arbitrary one-word string to define the action (eg 'comment', 'create') - * @param int $subject_guid The GUID of the entity doing the action - * @param int $object_guid The GUID of the entity being acted upon - * @param int $access_id The access ID of the river item (default: same as the object) - * @param int $posted The UNIX epoch timestamp of the river item (default: now) - * @return true|false Depending on success + * @param string $view          The view that will handle the river item (must exist) + * @param string $action_type   An arbitrary string to define the action (eg 'comment', 'create') + * @param int    $subject_guid  The GUID of the entity doing the action + * @param int    $object_guid   The GUID of the entity being acted upon + * @param int    $access_id     The access ID of the river item (default: same as the object) + * @param int    $posted        The UNIX epoch timestamp of the river item (default: now) + * @param int    $annotation_id The annotation ID associated with this river entry + * + * @return bool Depending on success   */ -function add_to_river($view,$action_type,$subject_guid,$object_guid,$access_id = "",$posted = 0, $annotation_id = 0) { +function add_to_river($view, $action_type, $subject_guid, $object_guid, $access_id = "", +$posted = 0, $annotation_id = 0) { +  	// use default viewtype for when called from REST api  	if (!elgg_view_exists($view, 'default')) {  		return false; @@ -59,7 +63,7 @@ function add_to_river($view,$action_type,$subject_guid,$object_guid,$access_id =  		" posted = {$posted} ");  	//update the entities which had the action carried out on it -	if($insert_data){ +	if ($insert_data) {  		update_entity_last_action($object_guid, $posted);  		return $insert_data;  	} @@ -69,7 +73,8 @@ function add_to_river($view,$action_type,$subject_guid,$object_guid,$access_id =   * Removes all items relating to a particular acting entity from the river   *   * @param int $subject_guid The GUID of the entity - * @return true|false Depending on success + * + * @return bool Depending on success   */  function remove_from_river_by_subject($subject_guid) {  	// Sanitise @@ -86,7 +91,8 @@ function remove_from_river_by_subject($subject_guid) {   * Removes all items relating to a particular entity being acted upon from the river   *   * @param int $object_guid The GUID of the entity - * @return true|false Depending on success + * + * @return bool Depending on success   */  function remove_from_river_by_object($object_guid) {  	// Sanitise @@ -102,8 +108,9 @@ function remove_from_river_by_object($object_guid) {  /**   * Removes all items relating to a particular annotation being acted upon from the river   * - * @param int annotation_id The ID of the annotation - * @return true|false Depending on success + * @param int $annotation_id The ID of the annotation + * + * @return bool Depending on success   * @since 1.7.0   */  function remove_from_river_by_annotation($annotation_id) { @@ -121,7 +128,8 @@ function remove_from_river_by_annotation($annotation_id) {   * Removes a single river entry   *   * @param int $id The ID of the river entry - * @return true|false Depending on success + * + * @return bool Depending on success   * @since 1.7.2   */  function remove_from_river_by_id($id) { @@ -137,8 +145,9 @@ function remove_from_river_by_id($id) {   * Sets the access ID on river items for a particular object   *   * @param int $object_guid The GUID of the entity - * @param int $access_id The access ID - * @return true|false Depending on success + * @param int $access_id   The access ID + * + * @return bool Depending on success   */  function update_river_access_by_object($object_guid, $access_id) {  	// Sanitise @@ -149,28 +158,35 @@ function update_river_access_by_object($object_guid, $access_id) {  	global $CONFIG;  	// Remove -	return update_data("update {$CONFIG->dbprefix}river set access_id = {$access_id} where object_guid = {$object_guid}"); +	$query = "update {$CONFIG->dbprefix}river +		set access_id = {$access_id} +		where object_guid = {$object_guid}"; +	return update_data($query);  }  /**   * Retrieves items from the river. All parameters are optional.   * - * @param int|array $subject_guid Acting entity to restrict to. Default: all - * @param int|array $object_guid Entity being acted on to restrict to. Default: all - * @param string $subject_relationship If set to a relationship type, this will use - * 	$subject_guid as the starting point and set the subjects to be all users this - * 	entity has this relationship with (eg 'friend'). Default: blank - * @param string $type The type of entity to restrict to. Default: all - * @param string $subtype The subtype of entity to restrict to. Default: all - * @param string $action_type The type of river action to restrict to. Default: all - * @param int $limit The number of items to retrieve. Default: 20 - * @param int $offset The page offset. Default: 0 - * @param int $posted_min The minimum time period to look at. Default: none - * @param int $posted_max The maximum time period to look at. Default: none + * @param int|array $subject_guid         Acting entity to restrict to. Default: all + * @param int|array $object_guid          Entity being acted on to restrict to. Default: all + * @param string    $subject_relationship If set to a relationship type, this will use + * 	                                      $subject_guid as the starting point and set the + *                                        subjects to be all users this + *                                        entity has this relationship with (eg 'friend'). + *                                        Default: blank + * @param string    $type                 The type of entity to restrict to. Default: all + * @param string    $subtype              The subtype of entity to restrict to. Default: all + * @param string    $action_type          The type of river action to restrict to. Default: all + * @param int       $limit                The number of items to retrieve. Default: 20 + * @param int       $offset               The page offset. Default: 0 + * @param int       $posted_min           The minimum time period to look at. Default: none + * @param int       $posted_max           The maximum time period to look at. Default: none + *   * @return array|false Depending on success   */ -function get_river_items($subject_guid = 0, $object_guid = 0, $subject_relationship = '', $type = '', -	$subtype = '', $action_type = '', $limit = 20, $offset = 0, $posted_min = 0, $posted_max = 0) { +function get_river_items($subject_guid = 0, $object_guid = 0, $subject_relationship = '', +$type = '',	$subtype = '', $action_type = '', $limit = 20, $offset = 0, $posted_min = 0, +$posted_max = 0) {  	// Get config  	global $CONFIG; @@ -179,14 +195,14 @@ function get_river_items($subject_guid = 0, $object_guid = 0, $subject_relations  	if (!is_array($subject_guid)) {  		$subject_guid = (int) $subject_guid;  	} else { -		foreach($subject_guid as $key => $temp) { +		foreach ($subject_guid as $key => $temp) {  			$subject_guid[$key] = (int) $temp;  		}  	}  	if (!is_array($object_guid)) {  		$object_guid = (int) $object_guid;  	} else { -		foreach($object_guid as $key => $temp) { +		foreach ($object_guid as $key => $temp) {  			$object_guid[$key] = (int) $temp;  		}  	} @@ -207,40 +223,41 @@ function get_river_items($subject_guid = 0, $object_guid = 0, $subject_relations  	// Construct 'where' clauses for the river  	$where = array();  	// river table does not have columns expected by get_access_sql_suffix so we modify its output -	$where[] = str_replace("and enabled='yes'",'',str_replace('owner_guid','subject_guid',get_access_sql_suffix())); +	$where[] = str_replace("and enabled='yes'", '', +		str_replace('owner_guid', 'subject_guid', get_access_sql_suffix()));  	if (empty($subject_relationship)) {  		if (!empty($subject_guid)) {  			if (!is_array($subject_guid)) {  				$where[] = " subject_guid = {$subject_guid} ";  			} else { -				$where[] = " subject_guid in (" . implode(',',$subject_guid) . ") "; +				$where[] = " subject_guid in (" . implode(',', $subject_guid) . ") ";  			}  		}  	} else {  		if (!is_array($subject_guid)) { -			if ($entities = elgg_get_entities_from_relationship(array( +			if ($entities = elgg_get_entities_from_relationship(array (  				'relationship' => $subject_relationship,  				'relationship_guid' => $subject_guid,  				'limit' => 9999))  			) {  				$guids = array(); -				foreach($entities as $entity) { +				foreach ($entities as $entity) {  					$guids[] = (int) $entity->guid;  				} -				// $guids[] = $subject_guid; -				$where[] = " subject_guid in (" . implode(',',$guids) . ") "; +				$where[] = " subject_guid in (" . implode(',', $guids) . ") ";  			} else {  				return array();  			}  		}  	} -	if (!empty($object_guid)) +	if (!empty($object_guid)) {  		if (!is_array($object_guid)) {  			$where[] = " object_guid = {$object_guid} ";  		} else { -			$where[] = " object_guid in (" . implode(',',$object_guid) . ") "; +			$where[] = " object_guid in (" . implode(',', $object_guid) . ") ";  		} +	}  	if (!empty($type)) {  		$where[] = " type = '{$type}' ";  	} @@ -260,8 +277,10 @@ function get_river_items($subject_guid = 0, $object_guid = 0, $subject_relations  	$whereclause = implode(' and ', $where);  	// Construct main SQL -	$sql = "select id,type,subtype,action_type,access_id,view,subject_guid,object_guid,annotation_id,posted" . -			" from {$CONFIG->dbprefix}river where {$whereclause} order by posted desc limit {$offset},{$limit}"; +	$sql = "select id, type, subtype, action_type, access_id, view, +			subject_guid, object_guid, annotation_id, posted +		from {$CONFIG->dbprefix}river +		where {$whereclause} order by posted desc limit {$offset}, {$limit}";  	// Get data  	return get_data($sql); @@ -270,22 +289,25 @@ function get_river_items($subject_guid = 0, $object_guid = 0, $subject_relations  /**   * Retrieves items from the river. All parameters are optional.   * - * @param int|array $subject_guid Acting entity to restrict to. Default: all - * @param int|array $object_guid Entity being acted on to restrict to. Default: all - * @param string $subject_relationship If set to a relationship type, this will use - * 	$subject_guid as the starting point and set the subjects to be all users this - * 	entity has this relationship with (eg 'friend'). Default: blank - * @param string $type The type of entity to restrict to. Default: all - * @param string $subtype The subtype of entity to restrict to. Default: all - * @param string $action_type The type of river action to restrict to. Default: all - * @param int $limit The number of items to retrieve. Default: 20 - * @param int $offset The page offset. Default: 0 - * @param int $posted_min The minimum time period to look at. Default: none - * @param int $posted_max The maximum time period to look at. Default: none + * @param int|array $subject_guid         Acting entity to restrict to. Default: all + * @param int|array $object_guid          Entity being acted on to restrict to. Default: all + * @param string    $subject_relationship If set to a relationship type, this will use + * 	                                      $subject_guid as the starting point and set the + *                                        subjects to be all users this entity has this + *                                        relationship with (eg 'friend'). Default: blank + * @param string    $type                 The type of entity to restrict to. Default: all + * @param string    $subtype              The subtype of entity to restrict to. Default: all + * @param string    $action_type          The type of river action to restrict to. Default: all + * @param int       $limit                The number of items to retrieve. Default: 20 + * @param int       $offset               The page offset. Default: 0 + * @param int       $posted_min           The minimum time period to look at. Default: none + * @param int       $posted_max           The maximum time period to look at. Default: none + *   * @return array|false Depending on success   */ -function elgg_get_river_items($subject_guid = 0, $object_guid = 0, $subject_relationship = '', $type = '', -	$subtype = '', $action_type = '', $limit = 10, $offset = 0, $posted_min = 0, $posted_max = 0) { +function elgg_get_river_items($subject_guid = 0, $object_guid = 0, $subject_relationship = '', +$type = '', $subtype = '', $action_type = '', $limit = 10, $offset = 0, $posted_min = 0, +$posted_max = 0) {  	// Get config  	global $CONFIG; @@ -294,14 +316,14 @@ function elgg_get_river_items($subject_guid = 0, $object_guid = 0, $subject_rela  	if (!is_array($subject_guid)) {  		$subject_guid = (int) $subject_guid;  	} else { -		foreach($subject_guid as $key => $temp) { +		foreach ($subject_guid as $key => $temp) {  			$subject_guid[$key] = (int) $temp;  		}  	}  	if (!is_array($object_guid)) {  		$object_guid = (int) $object_guid;  	} else { -		foreach($object_guid as $key => $temp) { +		foreach ($object_guid as $key => $temp) {  			$object_guid[$key] = (int) $temp;  		}  	} @@ -322,14 +344,15 @@ function elgg_get_river_items($subject_guid = 0, $object_guid = 0, $subject_rela  	// Construct 'where' clauses for the river  	$where = array();  	// river table does not have columns expected by get_access_sql_suffix so we modify its output -	$where[] = str_replace("and enabled='yes'",'',str_replace('owner_guid','subject_guid',get_access_sql_suffix_new('er','e'))); +	$where[] = str_replace("and enabled='yes'", '', +		str_replace('owner_guid', 'subject_guid', get_access_sql_suffix_new('er', 'e')));  	if (empty($subject_relationship)) {  		if (!empty($subject_guid)) {  			if (!is_array($subject_guid)) {  				$where[] = " subject_guid = {$subject_guid} ";  			} else { -				$where[] = " subject_guid in (" . implode(',',$subject_guid) . ") "; +				$where[] = " subject_guid in (" . implode(',', $subject_guid) . ") ";  			}  		}  	} else { @@ -341,22 +364,23 @@ function elgg_get_river_items($subject_guid = 0, $object_guid = 0, $subject_rela  			));  			if (is_array($entities) && !empty($entities)) {  				$guids = array(); -				foreach($entities as $entity) { +				foreach ($entities as $entity) {  					$guids[] = (int) $entity->guid;  				}  				// $guids[] = $subject_guid; -				$where[] = " subject_guid in (" . implode(',',$guids) . ") "; +				$where[] = " subject_guid in (" . implode(',', $guids) . ") ";  			} else {  				return array();  			}  		}  	} -	if (!empty($object_guid)) +	if (!empty($object_guid)) {  		if (!is_array($object_guid)) {  			$where[] = " object_guid = {$object_guid} ";  		} else { -			$where[] = " object_guid in (" . implode(',',$object_guid) . ") "; +			$where[] = " object_guid in (" . implode(',', $object_guid) . ") ";  		} +	}  	if (!empty($type)) {  		$where[] = " er.type = '{$type}' ";  	} @@ -379,7 +403,7 @@ function elgg_get_river_items($subject_guid = 0, $object_guid = 0, $subject_rela  	$sql = "select er.*" .  			" from {$CONFIG->dbprefix}river er, {$CONFIG->dbprefix}entities e " .  			" where {$whereclause} AND er.object_guid = e.guid GROUP BY object_guid " . -			" ORDER BY e.last_action desc LIMIT {$offset},{$limit}"; +			" ORDER BY e.last_action desc LIMIT {$offset}, {$limit}";  	// Get data  	return get_data($sql); @@ -391,6 +415,7 @@ function elgg_get_river_items($subject_guid = 0, $object_guid = 0, $subject_rela   * @see get_river_items   *   * @param stdClass $item A river item object as returned from get_river_items + *   * @return string|false Depending on success   */  function elgg_view_river_item($item) { @@ -402,12 +427,12 @@ function elgg_view_river_item($item) {  			return false;  		} else {  			if (elgg_view_exists($item->view)) { -				$body = elgg_view($item->view,array( +				$body = elgg_view($item->view, array(  					'item' => $item  				));  			}  		} -		return elgg_view('river/item/wrapper',array( +		return elgg_view('river/item/wrapper', array(  			'item' => $item,  			'body' => $body  		)); @@ -418,36 +443,43 @@ function elgg_view_river_item($item) {  /**   * Returns a human-readable version of the river.   * - * @param int|array $subject_guid Acting entity to restrict to. Default: all - * @param int|array $object_guid Entity being acted on to restrict to. Default: all - * @param string $subject_relationship If set to a relationship type, this will use - * 	$subject_guid as the starting point and set the subjects to be all users this - * 	entity has this relationship with (eg 'friend'). Default: blank - * @param string $type The type of entity to restrict to. Default: all - * @param string $subtype The subtype of entity to restrict to. Default: all - * @param string $action_type The type of river action to restrict to. Default: all - * @param int $limit The number of items to retrieve. Default: 20 - * @param int $posted_min The minimum time period to look at. Default: none - * @param int $posted_max The maximum time period to look at. Default: none + * @param int|array $subject_guid         Acting entity to restrict to. Default: all + * @param int|array $object_guid          Entity being acted on to restrict to. Default: all + * @param string    $subject_relationship If set to a relationship type, this will use + * 	                                      $subject_guid as the starting point and set + *                                        the subjects to be all users this entity has this + *                                        relationship with (eg 'friend'). Default: blank + * @param string    $type                 The type of entity to restrict to. Default: all + * @param string    $subtype              The subtype of entity to restrict to. Default: all + * @param string    $action_type          The type of river action to restrict to. Default: all + * @param int       $limit                The number of items to retrieve. Default: 20 + * @param int       $posted_min           The minimum time period to look at. Default: none + * @param int       $posted_max           The maximum time period to look at. Default: none + * @param bool      $pagination           Show pagination? + * @param $bool     $chronological        Show in chronological order? + *   * @return string Human-readable river.   */  function elgg_view_river_items($subject_guid = 0, $object_guid = 0, $subject_relationship = '', -	$type = '', $subtype = '', $action_type = '', $limit = 20, $posted_min = 0, $posted_max = 0, $pagination = true, $chronological = false) { +$type = '', $subtype = '', $action_type = '', $limit = 20, $posted_min = 0, +$posted_max = 0, $pagination = true, $chronological = false) {  	// Get input from outside world and sanitise it -	$offset = (int) get_input('offset',0); +	$offset = (int) get_input('offset', 0);  	// Get the correct function -	if($chronological == true){ -		$riveritems = get_river_items($subject_guid,$object_guid,$subject_relationship,$type,$subtype,$action_type,($limit + 1),$offset,$posted_min,$posted_max); -	}else{ -		$riveritems = elgg_get_river_items($subject_guid,$object_guid,$subject_relationship,$type,$subtype,$action_type,($limit + 1),$offset,$posted_min,$posted_max); +	if ($chronological == true) { +		$riveritems = get_river_items($subject_guid, $object_guid, $subject_relationship, $type, +			$subtype, $action_type, ($limit + 1), $offset, $posted_min, $posted_max); +	} else { +		$riveritems = elgg_get_river_items($subject_guid, $object_guid, $subject_relationship, $type, +			$subtype, $action_type, ($limit + 1), $offset, $posted_min, $posted_max);  	}  	// Get river items, if they exist  	if ($riveritems) { -		return elgg_view('river/item/list',array( +		return elgg_view('river/item/list', array(  			'limit' => $limit,  			'offset' => $offset,  			'items' => $riveritems, @@ -463,10 +495,14 @@ function elgg_view_river_items($subject_guid = 0, $object_guid = 0, $subject_rel   * This function has been added here until we decide if it is going to roll into core or not   * Add access restriction sql code to a given query.   * Note that if this code is executed in privileged mode it will return blank. + *   * @TODO: DELETE once Query classes are fully integrated   * - * @param string $table_prefix Optional table. prefix for the access code. - * @param int $owner + * @param string $table_prefix_one Optional table. prefix for the access code. + * @param string $table_prefix_two Another optiona table prefix? + * @param int    $owner            Owner GUID + * + * @return string   */  function get_access_sql_suffix_new($table_prefix_one = '', $table_prefix_two = '', $owner = null) {  	global $ENTITY_SHOW_HIDDEN_OVERRIDE, $CONFIG; @@ -503,16 +539,19 @@ function get_access_sql_suffix_new($table_prefix_one = '', $table_prefix_two = '  				WHERE relationship='friend' AND guid_two=$owner  			)"; -		$friends_bit = '('.$friends_bit.') OR '; +		$friends_bit = '(' . $friends_bit . ') OR ';  		if ((isset($CONFIG->user_block_and_filter_enabled)) && ($CONFIG->user_block_and_filter_enabled)) {  			// check to see if the user is in the entity owner's block list  			// or if the entity owner is in the user's filter list  			// if so, disallow access -			$enemies_bit = get_annotation_sql('elgg_block_list', "{$table_prefix_one}owner_guid", $owner, false); +			$enemies_bit = get_annotation_sql('elgg_block_list', "{$table_prefix_one}owner_guid", +				$owner, false); +  			$enemies_bit = '('  				. $enemies_bit -				. '	AND ' . get_annotation_sql('elgg_filter_list', $owner, "{$table_prefix_one}owner_guid", false) +				. '	AND ' . get_annotation_sql('elgg_filter_list', $owner, "{$table_prefix_one}owner_guid", +					false)  			. ')';  		}  	} @@ -531,9 +570,11 @@ function get_access_sql_suffix_new($table_prefix_one = '', $table_prefix_two = '  		$sql = "$enemies_bit AND ($sql)";  	} -	if (!$ENTITY_SHOW_HIDDEN_OVERRIDE) +	if (!$ENTITY_SHOW_HIDDEN_OVERRIDE) {  		$sql .= " and {$table_prefix_two}enabled='yes'"; -	return '('.$sql.')'; +	} + +	return '(' . $sql . ')';  }  /** @@ -541,15 +582,22 @@ function get_access_sql_suffix_new($table_prefix_one = '', $table_prefix_two = '   *   * @deprecated 1.8   * - * @param int $limit Limit the query. - * @param int $offset Execute from the given object - * @param mixed $type A type, or array of types to look for. Note: This is how they appear in the SYSTEM LOG. - * @param mixed $subtype A subtype, or array of types to look for. Note: This is how they appear in the SYSTEM LOG. - * @param mixed $owner_guid The guid or a collection of GUIDs - * @param string $owner_relationship If defined, the relationship between $owner_guid and the entity owner_guid - so "is $owner_guid $owner_relationship with $entity->owner_guid" + * @param int    $limit              Limit the query. + * @param int    $offset             Execute from the given object + * @param mixed  $type               A type, or array of types to look for. + *                                   Note: This is how they appear in the SYSTEM LOG. + * @param mixed  $subtype            A subtype, or array of types to look for. + *                                   Note: This is how they appear in the SYSTEM LOG. + * @param mixed  $owner_guid         The guid or a collection of GUIDs + * @param string $owner_relationship If defined, the relationship between $owner_guid and + *                                   the entity owner_guid - so "is $owner_guid $owner_relationship + *                                   with $entity->owner_guid" + *   * @return array An array of system log entries.   */ -function get_activity_stream_data($limit = 10, $offset = 0, $type = "", $subtype = "", $owner_guid = "", $owner_relationship = "") { +function get_activity_stream_data($limit = 10, $offset = 0, $type = "", $subtype = "", +$owner_guid = "", $owner_relationship = "") { +  	global $CONFIG;  	$limit = (int)$limit; @@ -588,14 +636,15 @@ function get_activity_stream_data($limit = 10, $offset = 0, $type = "", $subtype  	$owner_relationship = sanitise_string($owner_relationship);  	// Get a list of possible views -	$activity_events= array(); -	$activity_views = array_merge(elgg_view_tree('activity', 'default'), elgg_view_tree('river', 'default')); // Join activity with river +	$activity_events = array(); +	$activity_views = array_merge(elgg_view_tree('activity', 'default'), +		elgg_view_tree('river', 'default'));  	$done = array();  	foreach ($activity_views as $view) {  		$fragments = explode('/', $view); -		$tmp = explode('/',$view, 2); +		$tmp = explode('/', $view, 2);  		$tmp = $tmp[1];  		if ((isset($fragments[0])) && (($fragments[0] == 'river') || ($fragments[0] == 'activity')) @@ -653,7 +702,7 @@ function get_activity_stream_data($limit = 10, $offset = 0, $type = "", $subtype  			}  			$access = ""; -			if ($details['type']!='relationship') { +			if ($details['type'] != 'relationship') {  				$access = " and " . get_access_sql_suffix('sl');  			} @@ -667,7 +716,7 @@ function get_activity_stream_data($limit = 10, $offset = 0, $type = "", $subtype  	// User  	if ((count($owner_guid)) &&  ($owner_guid[0] != 0)) { -		$user = " and sl.performed_by_guid in (".implode(',', $owner_guid).")"; +		$user = " and sl.performed_by_guid in (" . implode(',', $owner_guid) . ")";  		if ($owner_relationship) {  			$friendsarray = ""; @@ -681,11 +730,11 @@ function get_activity_stream_data($limit = 10, $offset = 0, $type = "", $subtype  			) {  				$friendsarray = array(); -				foreach($friends as $friend) { +				foreach ($friends as $friend) {  					$friendsarray[] = $friend->getGUID();  				} -				$user = " and sl.performed_by_guid in (" . implode(',', $friendsarray).")"; +				$user = " and sl.performed_by_guid in (" . implode(',', $friendsarray) . ")";  			}  		}  	} | 
