| Server IP : 54.36.91.62 / Your IP : 216.73.217.112 Web Server : Apache System : Linux webm013.cluster127.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64 User : coopiak ( 151928) PHP Version : 8.3.23 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/coopiak/www/cj79373/components/com_community/models/ |
Upload File : |
<?php
/**
* @copyright (C) 2013 iJoomla, Inc. - All rights reserved.
* @license GNU General Public License, version 2 (http://www.gnu.org/licenses/gpl-2.0.html)
* @author iJoomla.com <webmaster@ijoomla.com>
* @url https://www.jomsocial.com/license-agreement
* The PHP code portions are distributed under the GPL license. If not otherwise stated, all images, manuals, cascading style sheets, and included JavaScript *are NOT GPL, and are released under the IJOOMLA Proprietary Use License v1.0
* More info at https://www.jomsocial.com/license-agreement
*/
defined('_JEXEC') or die('Restricted access');
require_once(JPATH_ROOT . '/components/com_community/models/models.php');
if (!class_exists('CommunityModelActivities')) {
/**
*
*/
class CommunityModelActivities extends JCCModel
{
/**
* Return an object with a single activity item
* @todo Return CActivity instead JTable
* @staticvar array $activities
* @param type $activityId
* @return JTable
*/
public function getActivity($activityId)
{
static $activities = array();
if (!isset($activities[$activityId])) {
$activities[$activityId] = JTable::getInstance('Activity', 'CTable');
$activities[$activityId]->load($activityId);
}
return $activities[$activityId];
}
/**
* Retrieves the activity content for specific activity
* @deprecated since 2.2
* @return string
* */
public function getActivityContent($activityId)
{
$act = $this->getActivity($activityId);
return $act->content;
}
/**
* Retrieves the activity stream for specific activity
* @deprecated since 2.2
* */
public function getActivityStream($activityId)
{
return $this->getActivity($activityId);
}
/**
* Add new data to the stream
* @deprecated since 2.2
*/
public function add(
$actor,
$target,
$title,
$content,
$appname = '',
$cid = 0,
$params = '',
$points = 1,
$access = 0
) {
jimport('joomla.utilities.date');
$table = JTable::getInstance('Activity', 'CTable');
$table->actor = $actor;
$table->target = $target;
$table->title = $title;
$table->content = $content;
$table->app = $appname;
$table->cid = $cid;
$table->points = $points;
$table->access = $access;
$table->location = '';
$table->params = $params;
return $table->store();
}
/**
* For photo upload, we should delete all aggregated photo upload activity,
* instead of just 1 photo uplaod activity
*/
public function hide($userId, $activityId)
{
$db = $this->getDBO();
// 1st we compare if the activity stream author match the userId. If yes,
// archive the record. if not, insert into hide table.
$activity = $this->getActivityStream($activityId);
if (!empty($activity)) {
$query = 'SELECT ' . $db->quoteName('id') . ' FROM ' . $db->quoteName('#__community_activities');
$query .= ' WHERE ' . $db->quoteName('app') . ' = ' . $db->Quote($activity->app);
$query .= ' AND ' . $db->quoteName('cid') . ' = ' . $db->Quote($activity->cid);
$query .= ' AND ' . $db->quoteName('title') . ' = ' . $db->Quote($activity->title);
$query .= ' AND DATEDIFF( created, ' . $db->Quote($activity->created) . ' )=0';
$db->setQuery($query);
try {
$db->execute();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
$rows = $db->loadColumn();
if (!empty($rows)) {
foreach ($rows as $key => $value) {
$obj = new stdClass();
$obj->user_id = $userId;
$obj->activity_id = $value;
try {
$db->insertObject('#__community_activities_hide', $obj);
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
}
}
}
return true;
}
/**
*
* @param type $userid
* @param type $friends
* @param type $afterDate
* @param type $maxEntries
* @param type $respectPrivacy
* @param type $actidRange
* @param type $displayArchived
* @param type $actid
* @param type $groupid
* @param type $eventid
* @param type $filters
* @return type
*/
public function countActivities(
$userid = '',
$friends = '',
$afterDate = null,
$maxEntries = 0,
$respectPrivacy = true,
$actidRange = null,
$displayArchived = true,
$actid = null,
$groupid = null,
$eventid = null,
$pageid = null,
$filters = array(),
$ignoreOrderByLastComment = false
) {
/**
* Get blocked user id
* We do filter blocked user activities in root cause of query
*/
$me = CFactory::getUser();
$blockLists = $me->getBlockedUsers();
$blockedUserIds = array();
foreach ($blockLists as $blocklist) {
$blockedUserIds[] = $blocklist->blocked_userid;
}
$userModel = CFactory::getModel('User');
$bannedList = $userModel->getBannedUser();
$blockedUserIds = array_merge($blockedUserIds, $bannedList);
$db = $this->getDBO();
$filters = array_merge(array(
'userid' => $userid,
'friends' => $friends,
'afterDate' => $afterDate,
'maxEntries' => 1, // avoid returning too many data
'respectPrivacy' => $respectPrivacy,
'actidRange' => $actidRange,
'displayArchived' => $displayArchived,
'actid' => $actid,
'pageid' => $pageid,
'groupid' => $groupid,
'eventid' => $eventid,
'blockedUserIds' => $blockedUserIds,
/* Specific query format */
'returnCount' => true,
'ignoreOrderByLastComment' => $ignoreOrderByLastComment
), $filters);
// $sql = $this->_buildQuery($filters);
// $sql = CString::str_ireplace('a.*', ' SQL_CALC_FOUND_ROWS a.* ', $sql);
// $db->setQuery($sql);
// $db->execute();
// $db->setQuery("SELECT FOUND_ROWS()");
// $result = $db->loadResult();
//this is used to check if the latest id is same as the one provided because some date might get updated
//unset($filters['actidRange']);
//unset($filters['actid']);
$filters['maxEntries'] = 100;
$sql = $this->_buildQuery($filters);
$sql = CString::str_ireplace('a.*', ' SQL_CALC_FOUND_ROWS a.* ', $sql);
$db->setQuery($sql);
$latestActivities = $db->loadObjectList();
$total = 0;
if (count($latestActivities) > 0) {
foreach ($latestActivities as $act) {
if ($act->id == abs($actidRange)) {
break;
}
if ($act->app == 'photos.comment') {
$photo = JTable::getInstance('Photo', 'CTable');
$photo->load($act->cid);
if ($photo->permissions == 30 && !CFriendsHelper::isConnected($me->id, $photo->creator)) {
continue;
}
}
if ($act->app == 'albums.comment') {
$album = JTable::getInstance('Album', 'CTable');
$album->load($act->cid);
if ($album->permissions == 30 && !CFriendsHelper::isConnected($me->id, $album->creator)) {
continue;
}
}
$total++;
}
}
return $total;
}
protected function getItems($queryOptions, $temp = array())
{
$query = $this->_buildQuery($queryOptions);
$db = JFactory::getDbo();
$list = $db->setQuery($query)->loadObjectList();
if (!$list) {
return $temp;
}
$count = 0;
foreach ($list as $item) {
$queryOptions['actidRange'] = $item->id;
if ($item->app === 'photos') {
$params = new JRegistry($item->params);
$photoIds = $params->get('photosId', '');
$photoIds = explode(',', $photoIds);
foreach ($photoIds as $photoId) {
$photo = JTable::getInstance('Photo', 'CTable');
$photo->load($photoId);
if (!$photo->id || !$photo->published || $photo->status === 'delete') {
continue 2;
}
}
}
if (!$item->app) {
continue;
}
$temp[] = $item;
$count++;
}
$numItemLeft = +$queryOptions['maxEntries'] - $count;
if ($numItemLeft > 0) {
$queryOptions['maxEntries'] = $numItemLeft;
return $this->getItems($queryOptions, $temp);
}
return $temp;
}
/**
* @param string $userid
* @param string $friends
* @param null $afterDate
* @param int $maxEntries
* @param bool $respectPrivacy
* @param null $actidRange
* @param bool $displayArchived
* @param null $actid
* @param null $groupid
* @param null $eventid
* @param array $filters
* @return array
*/
public function getActivities(
$userid = '',
$friends = '',
$afterDate = null,
$maxEntries = 20,
$respectPrivacy = true,
$actidRange = null,
$displayArchived = true,
$actid = null,
$groupid = null,
$eventid = null,
$pageid = null,
$filters = array(),
$ignoreOrderByLastComment = false
) {
/**
* Get blocked user id
* We do filter blocked user activities in root cause of query
*/
$me = CFactory::getUser();
$blockLists = $me->getBlockedUsers();
$blockedUserIds = array();
foreach ($blockLists as $blocklist) {
$blockedUserIds[] = $blocklist->blocked_userid;
}
// this will show the latest post on top, which is useful when someone newly posted an activity. So the record retrieved via
// ajax will be on top. Reason is user might confused if the newly posted activity is moved under the featured post.
$showLatestPostOnTop = isset($filters['showLatestActivityOnTop']) && $filters['showLatestActivityOnTop'];
$userModel = CFactory::getModel('User');
$bannedList = $userModel->getBannedUser();
$blockedUserIds = array_merge($blockedUserIds, $bannedList);
$db = $this->getDBO();
$queryOptions = array(
'userid' => $userid,
'friends' => $friends,
'afterDate' => $afterDate,
'maxEntries' => $maxEntries,
'respectPrivacy' => $respectPrivacy,
'actidRange' => $actidRange,
'displayArchived' => $displayArchived,
'actid' => $actid,
'pageid' => $pageid,
'groupid' => $groupid,
'eventid' => $eventid,
'blockedUserIds' => $blockedUserIds,
'apps' => null,
'ignoreOrderByLastComment' => $ignoreOrderByLastComment
);
/**
* @since 3.2 A2
* Allow input more than one filter by use array
*/
$queryOptions = array_merge($queryOptions, $filters);
/**
* Hashtag filtering
*/
if (isset($filters['hashtag']) && !empty($filters['hashtag'])) {
$hashtagModel = CFactory::getModel('hashtags');
$activityIds = $hashtagModel->getActivityIds($filters['hashtag']);
if ($activityIds) {
$queryOptions['specificid'] = $activityIds;
} else {
return array(); // return empty results
}
}
try {
$result = $this->getItems($queryOptions);
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
return array();
}
if (!empty($result)) {
//check if this stream is featured
$checkFeatured = isset($queryOptions['show_featured']) && $queryOptions['show_featured'] && CFactory::getConfig()->get('featured_stream');
$featuredModel = CFactory::getModel('featured');
$featuredLists = $featuredModel->getStreamFeaturedList();//current featured counts
$latestActivityAfterFeatured = false;
foreach ($result as $key=>$row) {
if (CFactory::getUser($row->actor)->block) {
$row->content = $row->title = JText::_('COM_COMMUNITY_CENSORED');
}
//load raw params into registry
if (($row->params != '') && (!is_object($row->params))) {
$params = new JRegistry;
$params->loadString($row->params);
$row->params = $params;
}
//check if
//@since 4.1
$actualList = array(); // actual featured list to check
if($checkFeatured){
if(isset($queryOptions['type'])) {
switch($queryOptions['type']){
case 'profile':
if(is_array($filters['target'])){
$actualList = isset($featuredLists['stream.profile'][$queryOptions['userid']]) ? $featuredLists['stream.profile'][$queryOptions['userid']] : array();
//echo '<pre>';print_r($actualList);die;
}else{
//this is a special case where there is no userid provided and the type is profile (probably called from frontpage ajaxaddstream)
$actualList = isset($featuredLists['stream.frontpage'][0]) ? $featuredLists['stream.frontpage'][0] : array();
}
break;
case 'frontpage':
$actualList = isset($featuredLists['stream.frontpage'][0]) ? $featuredLists['stream.frontpage'][0] : array();
break;
default:
break;
}
}elseif(isset($queryOptions['pageid']) && $queryOptions['pageid']){
$actualList = isset($featuredLists['stream.page'][$queryOptions['pageid']]) ? $featuredLists['stream.page'][$queryOptions['pageid']] : array();
}elseif(isset($queryOptions['groupid']) && $queryOptions['groupid']){
$actualList = isset($featuredLists['stream.group'][$queryOptions['groupid']]) ? $featuredLists['stream.group'][$queryOptions['groupid']] : array();
}elseif(isset($queryOptions['eventid']) && $queryOptions['eventid']){
$actualList = isset($featuredLists['stream.event'][$queryOptions['eventid']]) ? $featuredLists['stream.event'][$queryOptions['eventid']] : array();
}
//lets go through the list
foreach($actualList as $list){
if($list->cid == $row->id){
$row->isFeatured = true;
break;
}
}
//we will unset the latest 'normal' post from the list
if((!isset($row->isFeatured) || !$row->isFeatured) && !$latestActivityAfterFeatured && $showLatestPostOnTop){
$latestActivityAfterFeatured = $row;
unset($result[$key]);
}
}
}
}
// here, we put the latest post to the top again
if($showLatestPostOnTop && isset($latestActivityAfterFeatured) && $latestActivityAfterFeatured){
array_unshift($result,$latestActivityAfterFeatured);
}
$activities = $this->_getActivitiesLikeComment($result);
//$cache->store($activities, $cacheid,array('activities'));
$this->_getGroups();
return $activities;
}
/**
* Build master query
* @param array $filters condition
* @return string part of query
*/
private function _buildQuery($filters)
{
$db = $this->getDBO();
$my = CFactory::getUser();
$todayDate = new JDate();
$orWhere = array();
$andWhere = array(' 1 ');
$onActor = '';
$config = CFactory::getConfig();
//default the 1st condition here so that if the date is null, it wont give sql error.
/* Disabled on 2.6 to take all activities including the archived one.
if( !$displayArchived )
{
$andWhere[] = $db->quoteName('archived')."=0";
}
*/
if (!empty($filters['userid'])) {
$orWhere[] = '(a.' . $db->quoteName('actor') . '=' . $db->Quote($filters['userid']) . ')';
//@since 2.6, show friends activities even its not related to the current user(me-and-friends fpage)
if ($filters['userid'] != $my->id) {
$onActor .= ' AND ((a.' . $db->quoteName('actor') . '=' . $db->Quote($filters['userid']) . ') OR (a.' . $db->quoteName('target') . '=' . $db->Quote($filters['userid']) . '))';
}
//@since 2.8 also search within actors column
$orWhere[] = '(
(a.' . $db->quoteName('actor') . '=' . $db->Quote(0) . ') AND
(a.' . $db->quoteName('actors') . ' LIKE \'%{"id":"' . $filters['userid'] . '"}%\')
)';
}
//
if (!empty($filters['friends']) && implode(',', $filters['friends']) != '') {
$orWhere[] = '(a.' . $db->quoteName('actor') . ' IN (' . implode(',', $filters['friends']) . '))';
$orWhere[] = '(a.' . $db->quoteName('target') . ' IN (' . implode(',', $filters['friends']) . '))';
//actor are friends, clear the on Actor condition
$onActor .= '';
}
if (!empty($filters['userid'])) {
$orWhere[] = '(a.' . $db->quoteName('target') . '=' . $db->Quote($filters['userid']) . ')';
}
if (!empty($afterDate)) {
$andWhere[] = '(a.' . $db->quoteName('created') . ' between ' . $db->Quote($afterDate->toSql()) . ' and ' . $db->Quote($todayDate->toSql()) . ')';
}
// this will filter specific id only
if (isset($filters['specificid']) && count($filters['specificid']) > 0) {
$ids = implode(',', $filters['specificid']);
if ($ids) {
$andWhere[] = 'a.id IN (' . $ids . ')';
}
}
//we will sort the order with updated at if its enabled
if (isset($filters['ignoreOrderByLastComment']) && $filters['ignoreOrderByLastComment']) {
$sortByLastUpdate = false;
} else {
$sortByLastUpdate = $config->get('sortactivitybylastupdate', 0);
// force to disable if comment disabled
if (!$config->get('enablewallcomment')) {
$sortByLastUpdate = false;
}
}
// this will filter date before the date specified
if (isset($filters['beforeDate']) && (!empty($filters['beforeDate']) && $filters['beforeDate'] != '0000-00-00 00:00:00') && !$sortByLastUpdate){
$andWhere[] = 'a.created <= '.$db->Quote($filters['beforeDate']);
}
// Make sure it is an integer (singed and unsigned)
$filters['actidRange'] = isset($filters['actidRange']) ? intval($filters['actidRange']) : null;
//if this is sort by last update and id range is given, we must make sure that we get the item sort by last updated
// 1000000000 indicates loading old stream
if($sortByLastUpdate && !is_null($filters['actidRange']) && $filters['actidRange'] && $filters['actidRange'] != 1000000000){
$andWhere[] = ' a.'.$db->quoteName('updated_at')."< (SELECT updated_at FROM "
.$db->quoteName('#__community_activities')." WHERE ".$db->quoteName('id')."=".$db->quote($filters['actidRange']).")";
}
// If idrange is positive, return items older than the given id
if (!is_null($filters['actidRange']) && $filters['actidRange'] > 0 && !$sortByLastUpdate) {
//if this is sort by updated time, we cannot sort by id
$exclusionQuery = ' a.id < ' . $filters['actidRange'] . ' ';
$andWhere[] = $exclusionQuery;
}
if (!is_null($filters['actidRange']) && $filters['actidRange'] < 0 && !$sortByLastUpdate) {
//$exclusionQuery = ' a.id = '. abs($filters['actidRange']).' ';
$exclusionQuery = ' a.id >= ' . abs($filters['actidRange']) . ' ';
$andWhere[] = $exclusionQuery;
}
if (isset($filters['actid']) && !is_null($filters['actid']) && $filters['actid'] > 0) {
$andWhere[] = ' ( a.id = ' . (int)$filters['actid'] . ' ) ';
}
//if this is own profile, do not display whatever post i ever posted to another user
if (!empty($filters['userid']) && empty($filters['actid'])) {
$tmp = ' (( a.' . $db->quoteName('actor') . ' <> ' . $db->Quote($filters['userid']) . ' AND a.target <> a.actor) OR a.target = ' . $filters['userid'] . ' OR a.target = 0';
if (!empty($filters['friends']) && implode(',', $filters['friends']) != '') {
$tmp .= ' OR (a.' . $db->quoteName('actor') . ' IN (' . implode(',',
$filters['friends']) . ')) ';
}
$tmp .= ')';
$andWhere[] = $tmp;
}
// Limit to a particular page
if (isset($filters['pageid']) && !is_null($filters['pageid']) && $filters['pageid'] > 0) {
$andWhere[] = ' ( a.pageid = ' . (int)$filters['pageid'] . ' AND a.comment_type != "pages.create") ';
}
// Limit to a particular group
if (isset($filters['groupid']) && !is_null($filters['groupid']) && $filters['groupid'] > 0) {
$andWhere[] = ' ( a.groupid = ' . (int)$filters['groupid'] . ' AND a.comment_type != "groups.create") ';
}
// Limit to a particular event
if (isset($filters['eventid']) && !is_null($filters['eventid']) && $filters['eventid'] > 0) {
$andWhere[] = ' ( a.eventid = ' . (int)$filters['eventid'] . ' AND a.comment_type != "events") ';
}
if (!$config->get('creatediscussion')) {
$andWhere[] = ' ( a.app NOT IN ("groups.discussion","groups.discussion.reply")) ';
}
/**
* Filter blocked user
*/
if (isset($filters['blockedUserIds'])) {
if (count($filters['blockedUserIds']) > 0) {
$andWhere[] = ' ( a.actor NOT IN (' . implode(',', $filters['blockedUserIds']) . ') )';
}
}
// Filter by group permission
// Admin can see all groups
if (!CFactory::getUser($my->id)->authorise('community.postcommentedit', 'com_community') && !CFactory::getUser($my->id)->authorise('community.postcommentdelete', 'com_community')) {
$groupIds = $this->_getGroups();
if ($groupIds && is_array($groupIds) && count($groupIds) > 0) {
$andWhere[] = '( (a.' . $db->quoteName('group_access') . '=' . $db->Quote(0) . ')'
. ' OR '
. ' (a.' . $db->quoteName('groupid') . ' IN (' . implode(',',
$groupIds) . ' ) )'
. ' OR (a.' . $db->quoteName('groupid') . '=' . $db->Quote(0) . '))';
} else {
// Only show public groups
$andWhere[] = ' (a.' . $db->quoteName('group_access') . '=' . $db->Quote(0) . ')';
}
$pageIds = $this->_getPages();
if ($pageIds && is_array($pageIds) && count($pageIds) > 0) {
$andWhere[] = '( (a.' . $db->quoteName('page_access') . '=' . $db->Quote(0) . ')'
. ' OR '
. ' (a.' . $db->quoteName('pageid') . ' IN (' . implode(',',
$pageIds) . ' ) )'
. ' OR (a.' . $db->quoteName('pageid') . '=' . $db->Quote(0) . '))';
} else {
// Only show public pages
$andWhere[] = ' (a.' . $db->quoteName('page_access') . '=' . $db->Quote(0) . ')';
}
}
// Filter by event permission
// Admin can see everything
if (!CFactory::getUser($my->id)->authorise('community.postcommentedit', 'com_community') && !CFactory::getUser($my->id)->authorise('community.postcommentdelete', 'com_community')) {
$eventModel = CFactory::getModel('events');
$eventIds = implode(',',$eventModel->getEventIds($my->id));
$eventIds = empty($eventIds) ? "" : $eventIds;
if (!empty($eventIds)) {
$andWhere[] = '( (a.' . $db->quoteName('event_access') . '=' . $db->Quote(0) . ')'
. ' OR '
. ' (a.' . $db->quoteName('eventid') . ' IN (' . $eventIds . ' ) ) '
. ' OR (a.' . $db->quoteName('eventid') . '=' . $db->Quote(0) . ') )';
}else{
// Only show public events
$andWhere[] = ' (a.' . $db->quoteName('event_access') . '=' . $db->Quote(0) . ')';
}
}
if ($filters['respectPrivacy'] && !$config->get('overrideactivityprivacy')) {
// Add friends limits, but admin should be able to see all
// @todo: should use global admin code check instead
if ($my->id == 0) {
// for guest, it is enough to just test access <= 0
//$andWhere[] = "(a.`access` <= 10)";
$andWhere[] = "(a." . $db->quoteName('access') . " <= 10)";
} elseif (!CFactory::getUser($my->id)->authorise('community.postcommentedit', 'com_community') && !CFactory::getUser($my->id)->authorise('community.postcommentdelete', 'com_community')) {
$orWherePrivacy = array();
$orWherePrivacy[] = '((a.' . $db->quoteName('access') . ' = 0) ' . $onActor . ')';
$orWherePrivacy[] = '((a.' . $db->quoteName('access') . ' = 10) ' . $onActor . ')';
$orWherePrivacy[] = '((a.' . $db->quoteName('access') . ' = 20) AND ( ' . $db->Quote($my->id) . ' != 0) ' . $onActor . ')';
if ($my->id != 0) {
$orWherePrivacy[] = '((a.' . $db->quoteName('access') . ' = ' . $db->Quote(40) . ') AND (a.' . $db->quoteName('actor') . ' = ' . $db->Quote($my->id) . ') ' . $onActor . ')';
$orWherePrivacy[] = '((a.' . $db->quoteName('access') . ' = ' . $db->Quote(30) . ') AND ((a.' . $db->quoteName('actor') . 'IN (SELECT c.' . $db->quoteName('connect_to')
. ' FROM ' . $db->quoteName('#__community_connection') . ' as c'
. ' WHERE c.' . $db->quoteName('connect_from') . ' = ' . $db->Quote($my->id)
. ' AND c.' . $db->quoteName('status') . ' = ' . $db->Quote(1) . ' ) ) OR (a.' . $db->quoteName('actor') . ' = ' . $db->Quote($my->id) . ') )' . $onActor . ' )';
}
$OrPrivacy = implode(' OR ', $orWherePrivacy);
// If groupid and pageid are specified, no need to check the privacy
$andWhere[] = "((a." . $db->quoteName('groupid') . " OR (" . $OrPrivacy . ")) OR (a." . $db->quoteName('pageid') . " OR (" . $OrPrivacy . ")))";
}
}
/**
* @link https://trello.com/c/cL314YcO/72-jom-2282-private-group-events-visibility-1
* We get list of public groups & joined groups than make sure activity groupid in this list
*/
$groups = $this->_getGroups();
if ($groups && is_array($groups) && count($groups) > 0 && !CFactory::getUser()->authorise('community.groupeditstate', 'com_community') && !CFactory::getUser()->authorise('community.groupedit', 'com_community') && !CFactory::getUser()->authorise('community.groupdelete', 'com_community')) {
$andWhere[] = ' ( a.' . $db->quoteName('groupid') . ' IN ( ' . implode(',',
$groups) . ' )' /* in valid group */
. ' OR ( a.' . $db->quoteName('groupid') . ' IS NULL )'
. ' OR ( a.' . $db->quoteName('groupid') . ' = 0 ) )'; /* or not in any group */
}
$pages = $this->_getPages();
if ($pages && is_array($pages) && count($pages) > 0 && !CFactory::getUser()->authorise('community.pageeditstate', 'com_community') && !CFactory::getUser()->authorise('community.pageedit', 'com_community') && !CFactory::getUser()->authorise('community.pagedelete', 'com_community')) {
$andWhere[] = ' ( a.' . $db->quoteName('pageid') . ' IN ( ' . implode(',',
$pages) . ' )' /* in valid page */
. ' OR ( a.' . $db->quoteName('pageid') . ' IS NULL )'
. ' OR ( a.' . $db->quoteName('pageid') . ' = 0 ) )'; /* or not in any page */
}
/**
* Filter unpublished video activities
*/
$unpublishedVideo = $this->_getUnpublishedVideos();
if ($unpublishedVideo && is_array($unpublishedVideo) && count($unpublishedVideo) > 0) {
$andWhere[] = ' ( a.' . $db->quoteName('app') . ' NOT LIKE ' . $db->quote('video%')
. ' OR ( ' . ' ( a.' . $db->quoteName('app') . 'LIKE ' . $db->quote('video%') . ' AND a.' . $db->quoteName('cid') . ' NOT IN ( ' . implode(',',
$unpublishedVideo) . ' ) ) ) )';
}
if (isset($filters['apps']) && is_array($filters['apps']) && count($filters['apps']) > 0 ) {
/**
* @link http://stackoverflow.com/questions/4172195/mysql-like-multiple-values
*/
// add album, cover, and avatar for filtered by photo
if (isset($filters['apps'][0]) && $filters['apps'][0] == 'photo') {
$filters['apps'] = array_merge($filters['apps'], array('album', 'avatar', 'cover'));
}
// remove avatar stream item if filtered by Status
if (isset($filters['apps'][0]) && $filters['apps'][0] == 'profile') {
$andWhere[] = ' ( a.' . $db->quoteName('app') . ' REGEXP \'' . implode("|",
$filters['apps']) . '\' AND a.' . $db->quoteName('app') . ' NOT REGEXP \'avatar\' ) ';
} else if ($filters['apps'][0] == 'my-following') {
// get following
$modelFollowers = CFactory::getModel('followers');
$myFollowing = $modelFollowers->getFollowing($my->id, 'latest', false);
$followingIds = array();
foreach ($myFollowing as $following) {
$followingIds[] = $following->id;
}
if ($followingIds) {
$andWhere[] = ' ( a.' . $db->quoteName('actor') . ' IN (' . implode(',',
$followingIds) . ')) ';
$filters['apps'] = array_merge($filters['apps'], array('video', 'photo', 'album', 'avatar', 'cover', 'profile'));
$andWhere[] = ' ( a.' . $db->quoteName('app') . ' REGEXP \'' . implode("|",
$filters['apps']) . '\' ) ';
} else {
// always return false if no following
$andWhere[] = '1 = 2';
}
} else {
$andWhere[] = ' ( a.' . $db->quoteName('app') . ' REGEXP \'' . implode("|",
$filters['apps']) . '\' ) ';
}
} elseif (isset($filters['apps']) && $filters['apps'] != ''){
//since this is not an array, it should be a one line app, such as groups or events
if($filters['apps'] == 'pages'){
$andWhere[] = ' a.pageid <>'.$db->quote(0).' ';
}elseif($filters['apps'] == 'groups'){
$andWhere[] = ' a.groupid <>'.$db->quote(0).' ';
}elseif($filters['apps'] == 'events'){
$andWhere[] = ' a.eventid <>'.$db->quote(0).' ';
}elseif($filters['apps'] == 'profiles'){
//profile should exclude groups and events activities / system
$andWhere[] = ' a.eventid = '.$db->quote(0).' AND '
.'a.groupid = '.$db->quote(0).' AND '
.'a.pageid = '.$db->quote(0).' AND '
.'a.actor <> '.$db->quote(0).' '
;
}
}
//filter by keywords if there is any
if(isset($filters['keyword']) && !empty($filters['keyword'])){
$andWhere[] = "(a.`title` LIKE ".$db->quote("%".$filters['keyword']."%")." OR a.`content` LIKE ".$db->quote("%".$filters['keyword']."%").")";
}
//if (!empty($filters['userid'])) {
//get the list of acitivity id in archieve table 1st.
//Use GROUP_CONCAT ============
$subQuery = 'SELECT GROUP_CONCAT(DISTINCT b.' . $db->quoteName('activity_id')
. ') as activity_id FROM ' . $db->quoteName('#__community_activities_hide') . ' as b WHERE b.' . $db->quoteName('user_id') . ' = ' . $db->Quote($my->id);
$db->setQuery($subQuery);
$subResult = $db->loadColumn();
$subString = (empty($subResult)) ? array() : explode(',', $subResult[0]);
$idlist = array();
//cleanup empty values
while (!empty($subString)) {
$str = array_shift($subString);
if (!empty($str)) {
$idlist[] = $str;
}
unset($str);
}
$subString = implode(',', $idlist);
//==========================
if (!empty($subString)) {
$andWhere[] = 'a.' . $db->quoteName('id') . ' NOT IN (' . $subString . ')';
}
// }
// If current user is blocked by a user he should not see the activity of the user
// who block him. (of course, if the user data is public, he can see it anyway!)
/*
if($my->id != 0){
$andWhere[] = "a.`actor` NOT IN (SELECT `userid` FROM #__community_blocklist WHERE `blocked_userid`='{$my->id}')";
}
*/
if (count($orWhere)) /**
* They are groupped OR condition inside
*/ {
$whereOr = ' ( ' . implode(' OR ', $orWhere) . ' ) AND ';
} else {
$whereOr = '';
}
if (count($andWhere)) /**
* whereAND will start AND with before condition. But they are groupped AND condition inside
*/ {
$whereAnd = ' ( ' . implode(' AND ', $andWhere) . ' ) ';
} else {
$whereAnd = '';
}
// Actors can also be your friends
// We load 100 activities to cater for aggregated content
$date = CTimeHelper::getDate(); //we need to compare where both date with offset so that the day diff correctly.
// Have limit?
$maxEntries = '';
if (!empty($filters['maxEntries'])) {
$maxEntries = ' LIMIT ' . (int)$filters['maxEntries']; /* Do never use $limit without (int) */
}
//@since 4.1
// sorting by the featured stream
$extraOrderBy = '';
if(isset($filters['show_featured']) && $filters['show_featured'] && $config->get('featured_stream')){
if(isset($filters['type'])) {
switch($filters['type']){
case 'profile':
if((isset($filters['userid']) && $filters['userid'])){
$query = "SELECT cid FROM ".$db->quoteName('#__community_featured')." WHERE target_id=".$filters['userid']." AND type=".$db->quote('stream.profile');
}else{
//this is a special case where there is no userid provided and the type is profile (probably called from frontpage ajaxaddstream)
$query = "SELECT cid FROM ".$db->quoteName('#__community_featured')." WHERE type=".$db->quote('stream.frontpage');
}
break;
case 'frontpage':
$query = "SELECT cid FROM ".$db->quoteName('#__community_featured')." WHERE type=".$db->quote('stream.frontpage');
break;
default:
break;
}
}elseif(isset($filters['groupid']) && $filters['groupid']){
$query = "SELECT cid FROM ".$db->quoteName('#__community_featured')." WHERE target_id=".$filters['groupid']." AND type=".$db->quote('stream.group');
}elseif(isset($filters['eventid']) && $filters['eventid']){
$query = "SELECT cid FROM ".$db->quoteName('#__community_featured')." WHERE target_id=".$filters['eventid']." AND type=".$db->quote('stream.event');
}elseif(isset($filters['pageid']) && $filters['pageid']){
$query = "SELECT cid FROM ".$db->quoteName('#__community_featured')." WHERE target_id=".$filters['pageid']." AND type=".$db->quote('stream.page');
}
if(isset($query) && !empty($query)){
$db->setQuery($query);
$results = $db->loadColumn();
if(count($results) > 0){
$results = implode(',', $results);
$extraOrderBy = '( a.`id` IN ('.$results.') ) DESC, ';
}
}
}
// 1. Get all the ids of the activities
$sql = 'SELECT a.* '
/* .' TO_DAYS('.$db->Quote($date->toSql(true)).') - TO_DAYS( DATE_ADD(a.' . $db->quoteName('created').', INTERVAL '.$date->getOffset(true).' HOUR ) ) as _daydiff' */
. ' FROM ' . $db->quoteName('#__community_activities') . ' as a '
. ' WHERE '
/* AND with groupped OR */
. $whereOr
/* AND with groupped AND */
. $whereAnd
/**
* System app must be display by any reason - filtering
* @todo Need re-apply for 3.3 branch
*/
. ' AND a.' . $db->quoteName('archived') . ' = 0'
. ' GROUP BY a.' . $db->quoteName('id')
. ' ORDER BY ' . $extraOrderBy
. ( $sortByLastUpdate
? ('a.' . $db->quoteName('updated_at') . ' DESC, a.' . $db->quoteName('id') . ' DESC')
: ('a.' . $db->quoteName('id') . ' DESC') )
. $maxEntries;
// Remove the bracket if it is not needed
$sql = CString::str_ireplace('WHERE ( ) AND', ' WHERE ', $sql);
return $sql;
}
/**
* Get public & joined group
* @return type
*/
private function _getGroups()
{
$db = JFactory::getDbo();
/* Get public groups */
$query = ' SELECT ' . $db->quoteName('id');
$query .= ' FROM ' . $db->quoteName('#__community_groups');
$query .= ' WHERE ' . $db->quoteName('approvals') . ' = 0';
$db->setQuery($query);
$publicGroups = $db->loadColumn();
$query = ' SELECT ' . $db->quoteName('groupid');
$query .= ' FROM ' . $db->quoteName('#__community_groups_members');
$query .= ' WHERE ' . $db->quoteName('approved') . ' = 1';
$query .= ' AND ' . $db->quoteName('memberid') . ' = ' . CFactory::getUser()->id;
$query .= ' AND ' . $db->quoteName('memberid') . ' > 0';
$query .= ' GROUP BY ' . $db->quoteName('groupid');
$db->setQuery($query);
$joinedGroups = $db->loadColumn();
$groups = array_merge($publicGroups, $joinedGroups);
return (array_unique($groups));
}
/**
* Get public & joined page
* @return type
*/
private function _getPages()
{
$db = JFactory::getDbo();
/* Get public pages */
$query = ' SELECT ' . $db->quoteName('id');
$query .= ' FROM ' . $db->quoteName('#__community_pages');
$query .= ' WHERE ' . $db->quoteName('approvals') . ' = 0';
$db->setQuery($query);
$publicPages = $db->loadColumn();
$query = ' SELECT ' . $db->quoteName('pageid');
$query .= ' FROM ' . $db->quoteName('#__community_pages_members');
$query .= ' WHERE ' . $db->quoteName('approved') . ' = 1';
$query .= ' AND ' . $db->quoteName('memberid') . ' = ' . CFactory::getUser()->id;
$query .= ' AND ' . $db->quoteName('memberid') . ' > 0';
$query .= ' GROUP BY ' . $db->quoteName('pageid');
$db->setQuery($query);
$joinedPages = $db->loadColumn();
$pages = array_merge($publicPages, $joinedPages);
return (array_unique($pages));
}
/**
* Get array unpublished video ids
* @return type
*/
private function _getUnpublishedVideos()
{
$db = JFactory::getDbo();
/* Get public groups */
$query = ' SELECT ' . $db->quoteName('id');
$query .= ' FROM ' . $db->quoteName('#__community_videos');
$query .= ' WHERE ' . $db->quoteName('published') . ' = 0';
$db->setQuery($query);
return $db->loadColumn();
}
/**
* Given rows of activities, return activities with the likes and comment data
* @param array $result
*
*/
public function _getActivitiesLikeComment($result)
{
$config = CFactory::getConfig();
$enablereaction = !!$config->get('enablereaction');
$db = $this->getDBO();
// 2. Get the ids of the comments and likes we will query
$comments = array();
$likes = array();
if (!empty($result)) {
foreach ($result as $key => $row) {
if (!empty($row->comment_type)) {
// this will show the video.linking stream comment same as the one in actual video comment
if($row->comment_type == 'videos.linking'){
$row->comment_type = 'videos';
}
if ($row->comment_type == 'photos') {
if ($row->params->get('batchcount', 0) > 1) {
$comments['albums'][] = $row->cid;
} else {
$comments['photos'][] = $row->comment_id;
}
} else {
$comments[$row->comment_type][] = $row->comment_id;
}
}
if (!empty($row->like_type)) {
if ($row->like_type == 'photo') {
$photoId = explode(',', $row->params->get('photosId'));
if (count($photoId) > 1) {
$likes['album.self.share'][] = $row->id;
$result[$key]->like_type = 'album.self.share';
$result[$key]->like_id = $row->id;
} else {
$likes['photo'][] = $row->like_id;
$result[$key]->like_type = 'photo';
$result[$key]->like_id = $row->like_id;
}
} else if ($row->like_type == 'albums') {
$likes['album.self.share'][] = $row->id;
$result[$key]->like_type = 'album.self.share';
$result[$key]->like_id = $row->id;
} else {
if ($row->like_type == 'videos') {
$likes['videos.self.share'][] = $row->id;
$result[$key]->like_type = 'videos.self.share';
$result[$key]->like_id = $row->id;
} else {
$likes[$row->like_type][] = $row->like_id;
}
}
}
}
}
// 3. Query the comments
$commentsResult = array();
if (!empty($result)) {
$cond = array();
foreach ($comments as $lk => $lv) {
// Make every uid unique
$lv = array_unique($lv);
if (!empty($lv)) {
$cond[] = ' ( '
. ' a.' . $db->quoteName('type') . '=' . $db->Quote($lk)
. ' AND '
. ' a.' . $db->quoteName('contentid') . ' IN (' . implode(',', $lv) . ') '
. ' ) ';
}
}
if (!empty($cond)) {
$sql = 'SELECT a.* '
. ' FROM ' . $db->quoteName('#__community_wall') . ' as a '
. ' WHERE '
. ' (' . implode(' OR ', $cond) . ') '
. ' AND a.' . $db->quoteName('published') . '=' . $db->Quote(1)
. ' ORDER BY ' . $db->quoteName('id') . ' DESC ';
$db->setQuery($sql);
try {
$resultComments = $db->loadObjectList();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
foreach ($resultComments as $comment) {
$params = new CParameter($comment->params);
$actId = $params->get('activityId', null);
if ($actId) {
$key = $comment->type . '-' . $comment->contentid . '-' . $actId;
} else {
$key = $comment->type . '-' . $comment->contentid;
}
if (!isset($commentsResult[$key])) {
$commentsResult[$key] = $comment;
$commentsResult[$key]->_comment_count = 0;
$commentsResult[$key]->actId = $actId;
}
$commentsResult[$key]->_comment_count++;
$allComments[$key][] = $comment;
}
}
}
// 4. Query the likes
$likesResult = array();
if (!empty($result)) {
$cond = array();
foreach ($likes as $lk => $lv) {
// Make every uid unique
$lv = array_unique($lv);
if (!empty($lv)) {
$cond[] = ' ( '
. ' a.' . $db->quoteName('element') . '=' . $db->Quote($lk)
. ' AND '
. ' a.' . $db->quoteName('uid') . ' IN (' . implode(',', $lv) . ') '
. ' ) ';
}
}
if (!empty($cond)) {
$sql = 'SELECT a.`element`, a.`uid`, a.`reaction_ids`, a.`like`, a.`dislike` '
. ' FROM ' . $db->quoteName('#__community_likes') . ' as a '
. ' WHERE '
. '(' . implode(' OR ', $cond) . ')';
$db->setQuery($sql);
try {
$resultLikes = $db->loadObjectList();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
foreach ($resultLikes as $like) {
$key = $like->element . '-' . $like->uid;
$arr = explode( ',', $like->like );
if (isset($likesResult[$key])) {
$likesResult[$key] = array_merge($likesResult[$key], $arr);
} else {
$likesResult[$key] = $arr;
}
}
}
}
// 4. Merge data
$activities = array();
if (!empty($result)) {
foreach ($result as $row) {
// Merge Like data
$key = $row->like_type . '-' . $row->like_id;
if (array_key_exists($key, $likesResult)) {
$row->_likes = implode(',', $likesResult[$key]);
$my = CFactory::getUser();
$reacted = array_filter( $resultLikes, function($item) use ($row) {
return $item->uid == $row->like_id;
});
$reacted = array_shift($reacted);
$_keys = explode(',', $reacted->like);
$_values = explode(',', $reacted->reaction_ids);
$index = array_search($my->id, $_keys);
$row->reacted_id = $my->id && $index !== false && isset($_values[$index]) ? $_values[$index] : '';
} else {
$row->_likes = '';
$row->reacted_id = '';
}
if ($row->comment_type == 'photos' && $row->params->get('batchcount', 0) > 1) {
$row->comment_id = $row->cid;
$row->comment_type = 'albums';
}
// Merge comment data
if (array_key_exists($row->comment_type . '-' . $row->comment_id,
$commentsResult) || array_key_exists($row->comment_type . '-' . $row->comment_id . '-' . $row->id,
$commentsResult)
) {
if (isset($commentsResult[$row->comment_type . '-' . $row->comment_id . '-' . $row->id])) {
$data = $commentsResult[$row->comment_type . '-' . $row->comment_id . '-' . $row->id];
$row->_comments_all = $allComments[$row->comment_type . '-' . $row->comment_id . '-' . $row->id];
} else {
$data = $commentsResult[$row->comment_type . '-' . $row->comment_id];
$row->_comments_all = $allComments[$row->comment_type . '-' . $row->comment_id];
}
if ($row->app == 'photos' && $row->params->get('batchcount',
0) > 1 && $row->id != $data->actId
) {
$row->_comment_last_id = '';
$row->_comment_last_by = '';
$row->_comment_date = '';
$row->_comment_count = 0;
$row->_comment_last = '';
$row->__comment_type= null;
} else {
$row->_comment_last_id = $data->id;
$row->_comment_last_by = $data->post_by;
$row->_comment_date = $data->date;
$row->_comment_count = $data->_comment_count;
$row->_comment_last = isset($data->comment) ? $data->comment : null;
$row->_comment_type = $data->type;
if (isset($data->params)) {
$row->_comment_params = $data->params;
} else {
$row->_comment_params = null;
}
}
} else {
$row->_comment_last_id = '';
$row->_comment_last_by = '';
$row->_comment_date = '';
$row->_comment_count = 0;
$row->_comment_last = '';
$row->_comment_type = null;
}
// Create table object
$act = JTable::getInstance('Activity', 'CTable');
$act->bind($row);
$act->isFeatured = isset($row->isFeatured) ? $row->isFeatured : false; // bind the isfeatured to the activity
$activities[] = $act;
}
}
return $activities;
}
/**
* Return all activities by the given apps
*
* @param mixed $appname string or array of string
*/
public function getAppActivities($options)
{
$me = CFactory::getUser();
$blockLists = $me->getBlockedUsers();
$blockedUserIds = array();
foreach ($blockLists as $blocklist) {
$blockedUserIds[] = $blocklist->blocked_userid;
}
$queryOptions = array(
'userid' => null,
'friends' => '',
'afterDate' => null,
/* Back work with old code */
'createdAfter' => null,
'exclusions' => null,
'maxEntries' => 100,
'respectPrivacy' => true,
'actidRange' => null,
'displayArchived' => true,
'actid' => null,
'groupid' => null,
'eventid' => null,
'blockedUserIds' => $blockedUserIds
);
$options = array_merge($queryOptions, $options);
if (is_array($options['app']) && count($options['app']) > 1) {
$options['apps'] = "'" . implode("','", $options['app']) . "'";
} else {
$options['apps'] = "'" . $options['app'] . "'";
}
$sql = $this->_buildQuery($options);
$db = JFactory::getDbo();
$db->setQuery($sql);
try {
$result = $db->loadObjectList();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
foreach ($result as $key => $_result) {
$result[$key]->params = new CParameter($_result->params);
}
$activities = $this->_getActivitiesLikeComment($result);
return $activities;
}
/*
* Remove One Photo Activity
* As it's tricky to remove the activity since there's no photo id in the
* activity data. Here we get all the activities of 5 seconds within the
* activity creation time, then we try to match the photo id in the activity
* params, and also the thumbnail in the activity content field. When all
* fails, we fallback to removeOneActivity()
*/
public function removeOnePhotoActivity($app, $uniqueId, $datetime, $photoId, $thumbnail)
{
$db = JFactory::getDBO();
$query = 'SELECT * FROM ' . $db->quoteName('#__community_activities') . ' '
. 'WHERE ' . $db->quoteName('app') . '=' . $db->Quote($app) . ' '
. 'AND ' . $db->quoteName('cid') . '=' . $db->Quote($uniqueId) . ' '
. 'AND ( ' . $db->quoteName('created') . ' BETWEEN ' . $db->Quote($datetime) . ' '
. 'AND ( ADDTIME(' . $db->Quote($datetime) . ', ' . $db->Quote('00:00:05') . ' ) ) ) ';
$db->setQuery($query);
try {
$result = $db->loadObjectList();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
$activityId = null;
$handler = new CParameter(null);
// the activity data contains photoid and the photo thumbnail
// which can be useful for us to find the correct activity id
foreach ($result as $activity) {
$handler->loadINI($activity->params);
if ($handler->getValue('photoid') == $photoId) {
$activityId = $activity->id;
break;
}
if (CStringHelper::strpos($activity->content, $thumbnail) !== false) {
$activityId = $activity->id;
break;
}
}
if (is_null($activityId)) {
return $this->removeOneActivity($app, $uniqueId);
}
$query = 'DELETE FROM ' . $db->quoteName('#__community_activities') . ' '
. 'WHERE ' . $db->quoteName('id') . '=' . $db->Quote($activityId) . ' '
. 'LIMIT 1 ';
$db->setQuery($query);
try {
$status = $db->execute();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
return $status;
}
public function removeOneActivity($app, $uniqueId)
{
$db = $this->getDBO();
$query = 'DELETE FROM ' . $db->quoteName('#__community_activities') . ' '
. 'WHERE ' . $db->quoteName('app') . '=' . $db->Quote($app) . ' '
. 'AND ' . $db->quoteName('cid') . '=' . $db->Quote($uniqueId) . ' '
. 'LIMIT 1 ';
$db->setQuery($query);
try {
$status = $db->execute();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
return $status;
}
//Remove Discussion via params
function removeDiscussion($app, $uniqueId, $paramName, $paramValue)
{
$db = $this->getDBO();
$query = 'DELETE FROM ' . $db->quoteName('#__community_activities') . ' '
. 'WHERE ' . $db->quoteName('app') . '=' . $db->Quote($app) . ' '
. 'AND ' . $db->quoteName('cid') . '=' . $db->Quote($uniqueId) . ' '
. 'AND ' . $db->quoteName('params') . ' LIKE ' . $db->Quote('%' . $paramName . '=' . $paramValue . '%');
$db->setQuery($query);
try {
$status = $db->execute();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
return $status;
}
public function removeAlbumActivity($uniqueId)
{
$db = $this->getDBO();
$query = 'DELETE FROM ' . $db->quoteName('#__community_activities') . ' '
. 'WHERE ' . $db->quoteName('app') . '=' . $db->Quote('photos') . ' '
. 'AND ' . $db->quoteName('comment_type') . '=' . $db->Quote('albums') . ' '
. 'AND ' . $db->quoteName('cid') . '=' . $db->Quote($uniqueId);
$db->setQuery($query);
try {
$status = $db->execute();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
return $status;
}
/**
* This is used to remove all the activity related to avatar
* @param $app
* @param $id ( profile - user id, group - groupid, event - eventid)
*/
public function removeAvatarActivity($app, $id){
$db = $this->getDBO();
switch($app){
case 'profile.avatar.upload' :
$query = 'AND '.$db->quoteName('actor').' = '.$db->quote($id);
break;
case 'events.avatar.upload' :
$query = 'AND '.$db->quoteName('eventid').' = '.$db->quote($id);
break;
case 'groups.avatar.upload' :
$query = 'AND '.$db->quoteName('groupid').' = '.$db->quote($id);
break;
case 'pages.avatar.upload' :
$query = 'AND '.$db->quoteName('pageid').' = '.$db->quote($id);
break;
}
$query = 'DELETE FROM ' . $db->quoteName('#__community_activities') . ' '
. 'WHERE ' . $db->quoteName('app') . '=' . $db->Quote($app) . $query;
$db->setQuery($query);
try {
$status = $db->execute();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
return $status;
}
public function removeActivity($app, $uniqueId)
{
$db = $this->getDBO();
/*
* @todo add in additional info if needed
* when removing photo app, we need to remove the likes and comments as well
*/
$additionalQuery = '';
switch ($app) {
case 'photos' :
//before we remove anything, lets check if this photo is included in the params of activity
// that might be more than one photo
$db->setQuery(
"SELECT albumid FROM ".$db->quoteName('#__community_photos')." WHERE id=".$db->quote($uniqueId)
);
$albumId = $db->loadResult();
$db->setQuery(
"SELECT id, params FROM ".$db->quoteName('#__community_activities'). " WHERE "
.$db->quoteName('app') . '=' . $db->Quote($app)." AND "
.$db->quoteName('cid') . '=' . $db->Quote($albumId)
);
$activities = $db->loadObjectList();
if(count($activities) == 0){
return;
}
//search through the parameters of the activities
foreach($activities as $activity){
$params = new CParameter($activity->params);
$photoIds = $params->get('photosId');
$photoIds = explode(',',$photoIds);
if(in_array($uniqueId, $photoIds)){
if(count($photoIds) > 1){
//do not delete this activities as there is another photo associated with this activity
if(($key = array_search($uniqueId, $photoIds)) !== false) {
unset($photoIds[$key]);
}
$params->set('photosId',implode(',',$photoIds));
$params->set('batchcount', count($photoIds));
$params->set('count', count($photoIds));
$activityTable = JTable::getInstance('Activity', 'CTable');
$activityTable->load($activity->id);
//just update the activity will do
$activityTable->params = $params->toString();
$activityTable->store();
}else{
// just delete the activity
$db->setQuery(
"DELETE FROM ".$db->quoteName('#__community_activities')." WHERE "
.$db->quoteName('id').' = '.$db->quote($activity->id)
);
$db->execute();
}
}
}
return;//return as the additional steps are not needed
//we should remove the likes and comments
$additionalQuery = '(' . $db->quoteName('app') . '=' . $db->Quote($app) .
' OR ' . $db->quoteName('app') . '=' . $db->Quote('photos.comment') .
' OR ' . $db->quoteName('app') . '=' . $db->Quote('album.like') .
' OR ' . $db->quoteName('app') . '=' . $db->Quote('profile.avatar.upload') .
' OR ' . $db->quoteName('app') . '=' . $db->Quote('photo.like') . ')';
break;
case 'videos' :
$additionalQuery = '(' . $db->quoteName('app') . '=' . $db->Quote($app) .
' OR ' . $db->quoteName('app') . '=' . $db->Quote('videos.linking') .
' OR ' . $db->quoteName('app') . '=' . $db->Quote('videos.comment') .
' OR ' . $db->quoteName('app') . '=' . $db->Quote('videos.like') . ')';
break;
case 'albums':
$additionalQuery = $db->quoteName('app') . ' like' . $db->Quote('%photos%');
break;
default :
// this is the default state
$additionalQuery = $db->quoteName('app') . '=' . $db->Quote($app);
}
$query = 'DELETE FROM ' . $db->quoteName('#__community_activities') . ' '
. 'WHERE ' .$additionalQuery . ' '
. 'AND ' . $db->quoteName('cid') . '=' . $db->Quote($uniqueId);
$db->setQuery($query);
try {
$status = $db->execute();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
return $status;
}
/**
* Remove an activity by ID
* @param type $activityId
* @return boolean
*/
public function removeActivityById($activityId)
{
$db = $this->getDBO();
$query = 'DELETE FROM ' . $db->quoteName('#__community_activities') . ' '
. 'WHERE ' . $db->quoteName('id') . '=' . $db->quote($activityId) . ' ';
$db->setQuery($query);
try {
$status = $db->execute();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
return $status;
}
/**
* Remove an activity by ID
* @param type $activityId
* @return boolean
*/
public function hideActivityById($activityId)
{
$table = JTable::getInstance('Activity', 'CTable');
$table->load($activityId);
$archived = 1;
$message = JText::_('COM_COMMUNITY_WALL_REMOVED');
if ($table->archived == 1) {
$archived = 0;
$message = JText::_('COM_COMMUNITY_WALL_RESTORED');
}
$db = $this->getDBO();
$query = 'UPDATE ' . $db->quoteName('#__community_activities') . ' SET ' . $db->quoteName('archived') . ' = ' . $db->Quote($archived)
. ' WHERE ' . $db->quoteName('id') . '=' . $db->quote($activityId) . ' ';
$db->setQuery($query);
try {
$status = $db->execute();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
return $message;
}
public function removePageActivity($ids)
{
$db = $this->getDBO();
$app = '"pages","pages.bulletin","pages.discussion","pages.wall"';
$query = 'DELETE FROM ' . $db->quoteName('#__community_activities') . ' '
. 'WHERE ' . $db->quoteName('app') . 'IN (' . $app . ') '
. 'AND ' . $db->quoteName('cid') . 'IN (' . $ids . ')';
$db->setQuery($query);
try {
$status = $db->execute();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
return $status;
}
public function removeGroupActivity($ids)
{
$db = $this->getDBO();
$app = '"groups","groups.bulletin","groups.discussion","groups.wall"';
$query = 'DELETE FROM ' . $db->quoteName('#__community_activities') . ' '
. 'WHERE ' . $db->quoteName('app') . 'IN (' . $app . ') '
. 'AND ' . $db->quoteName('cid') . 'IN (' . $ids . ')';
$db->setQuery($query);
try {
$status = $db->execute();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
return $status;
}
/**
* Return the actor id by a given activity id
* @todo Should we remove this and use getActivity()->id instead
* @param type $uniqueId
* @return type
*/
public function getActivityOwner($uniqueId)
{
$db = $this->getDBO();
$sql = 'SELECT ' . $db->quoteName('actor')
. ' FROM ' . $db->quoteName('#__community_activities')
. ' WHERE ' . $db->quoteName('id') . '=' . $db->Quote($uniqueId);
$db->setQuery($sql);
try {
$result = $db->loadResult();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
// @todo: write a plugin that return the html part of the whole system
return $result;
}
/**
* Return the number of total activity by a given user
*/
public function getActivityCount($userid)
{
$db = $this->getDBO();
$sql = 'SELECT SUM(' . $db->quoteName('points')
. ') FROM ' . $db->quoteName('#__community_activities')
. ' WHERE ' . $db->quoteName('actor') . '=' . $db->Quote($userid);
$db->setQuery($sql);
try {
$result = $db->loadResult();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
// @todo: write a plugin that return the html part of the whole system
return $result;
}
/**
* Retrieves total number of activities throughout the site.
*
* @return int $total Total number of activities.
* */
public function getTotalActivities($filter = array())
{
static $activities;
if (!isset($activities)) {
$db = JFactory::getDBO();
$andWhere[] = ' 1 ';
if (isset($filter['apps']) && is_array($filter['apps']) && count($filter['apps']) > 0 ) {
/**
* @link http://stackoverflow.com/questions/4172195/mysql-like-multiple-values
*/
$andWhere[] = ' ( ' . $db->quoteName('app') . ' REGEXP \'' . implode("'|",
$filter['apps']) . '\' ) ';
}
/**
* Hashtag filtering
*/
if (isset($filter['hashtag']) && !empty($filter['hashtag'])) {
$hashtagModel = CFactory::getModel('hashtags');
$activityIds = $hashtagModel->getActivityIds($filter['hashtag']);
if ($activityIds) {
return count($activityIds);
}
}
$whereAnd = implode(' AND ', $andWhere);
$query = 'SELECT COUNT(1) FROM ' . $db->quoteName('#__community_activities') . ' WHERE ' . $whereAnd;
$db->setQuery($query);
$activities = $db->loadResult();
}
return $activities;
}
/**
* Update acitivy stream access
*
* @param <type> $access
* @param <type> $previousAccess
* @param <type> $actorId
* @param <type> $app
* @param <type> $cid
* @return <type>
*
*/
public function updatePermission($access, $previousAccess, $actorId, $app = '', $cid = '')
{
$db = $this->getDBO();
$query = 'UPDATE ' . $db->quoteName('#__community_activities') . ' SET ' . $db->quoteName('access') . ' = ' . $db->Quote($access);
$query .= ' WHERE ' . $db->quoteName('actor') . ' = ' . $db->Quote($actorId);
if ($previousAccess != null && $previousAccess > $access) {
$query .= ' AND ' . $db->quoteName('access') . ' <' . $db->Quote($access);
}
if (!empty($app)) {
$query .= ' AND ' . $db->quoteName('app') . ' = ' . $db->Quote($app);
}
if (!empty($cid)) {
$query .= ' AND ' . $db->quoteName('cid') . ' = ' . $db->Quote($cid);
}
$db->setQuery($query);
try {
$db->execute();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
return $this;
}
public function updatePermissionByCid($access, $previousAccess = null, $cid = 0, $app = '')
{
// if (is_array($cid)) {}
$db = $this->getDBO();
$query = 'UPDATE ' . $db->quoteName('#__community_activities') . ' SET ' . $db->quoteName('access') . ' = ' . $db->Quote($access);
$query .= ' WHERE ' . $db->quoteName('cid') . ' IN (' . $db->Quote($cid) . ')';
$query .= ' AND ' . $db->quoteName('app') . ' = ' . $db->Quote($app);
if ($previousAccess != null && $previousAccess > $access) {
$query .= ' AND ' . $db->quoteName('access') . ' <' . $db->Quote($access);
}
$db->setQuery($query);
try {
$db->execute();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
return $this;
}
/**
* Generic activity update code
*
* @param array $condition
* @param array $update
* @return CommunityModelActivities
*/
public function update($condition, $update)
{
$db = $this->getDBO();
$where = array();
foreach ($condition as $key => $val) {
$where[] = $db->quoteName($key) . '=' . $db->Quote($val);
}
$where = implode(' AND ', $where);
$set = array();
foreach ($update as $key => $val) {
$set[] = ' ' . $db->quoteName($key) . '=' . $db->Quote($val);
}
$set = implode(', ', $set);
$query = 'UPDATE ' . $db->quoteName('#__community_activities') . ' SET ' . $set . ' WHERE ' . $where;
$db->setQuery($query);
try {
$db->execute();
} catch (Exception $e) {
JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error');
}
return $this;
}
/**
* Get activities with inputed location within 30 days.
* We'll use that for smart location auto complete
* @since 3.2
* @param type $userId
* @return type
*/
public function getUserVisitedLocation($userId)
{
$db = $this->getDbo();
$query = ' SELECT '
. $db->quoteName('latitude') . ' , '
. $db->quoteName('longitude') . ' , '
. $db->quoteName('location') . ' , '
. $db->quoteName('params');
$query .= ' FROM ' . $db->quoteName('#__community_activities');
$query .= ' WHERE ' . $db->quoteName('actor') . ' = ' . $db->quote($userId);
/* Must have location */
$query .= ' AND ' . $db->quoteName('latitude') . ' <> ' . $db->quote('255.000000');
$query .= ' AND ' . $db->quoteName('longitude') . ' <> ' . $db->quote('255.000000');
$query .= ' AND ' . $db->quoteName('created') . ' BETWEEN NOW() - INTERVAL 30 DAY AND NOW() ';
$db->setQuery($query);
return $db->loadObjectList();
}
/**
* Since 3.3
* Accept a basic filter and get one int result for activity id (single) if exists
* @param $filter
* @return bool
*/
public function getActivityId($filter){
$db = $this->getDbo();
if(count($filter) == 0){
return false;
}
$andQuery = ' 1';
foreach($filter as $key=>$val){
$andQuery .= ' AND '.$db->quoteName($key). ' LIKE '. $db->quote($val);
}
$query = "SELECT id FROM ".$db->quoteName('#__community_activities').' WHERE '.$andQuery.' ORDER BY id DESC';
$db->setQuery($query);
$activityId = $db->loadResult();
return ($activityId) ? $activityId : false;
}
/**
* Since 4.0
* Accept a basic filter and get all results
* returns result in array(id1,id2,id3,...)
*/
public function getActivitiesId($filter){
$db = $this->getDbo();
if(count($filter) == 0){
return false;
}
$andQuery = ' 1';
foreach($filter as $key=>$val){
$andQuery .= ' AND '.$db->quoteName($key). ' LIKE '. $db->quote($val);
}
$query = "SELECT id FROM ".$db->quoteName('#__community_activities').' WHERE '.$andQuery.' ORDER BY id DESC';
$db->setQuery($query);
$activityIds = $db->loadColumn();
return (count($activityIds)) ? $activityIds : false;
}
}
}