<?php
/* mooSocial - Social Network Software
* @website: http://www.moosocial.com
*/
class ShareController extends AppController {
public function beforeFilter() {
parent::beforeFilter();
$cuid = MooCore::getInstance()->getViewer(true);
// require login user
if (empty($cuid)) {
echo json_encode(array('nonLogin' => '1'));
exit;
}
}
public function index() {
}
// display share form for select type share
public function ajax_share($param = null) {
$this->layout = 'default_simple';
$object_id = isset($this->request->named['id']) ? $this->request->named['id'] : null;
$type = isset($this->request->named['type']) ? $this->request->named['type'] : null;
$activity = array();
$plugin = '';
$object = null;
$social_link_share = FULL_BASE_URL . $this->request->webroot;
if (!empty($param)) {
list($plugin, $name) = mooPluginSplit($param);
if (!empty($object_id)) {
$object = MooCore::getInstance()->getItemByType($param, $object_id);
}
if (!empty($plugin)){
$social_link_share = FULL_BASE_URL . $object[key($object)]['moo_href'];
}
}
if (!empty($object_id) && empty($param)) {
$this->loadModel('Activity');
$activity = $this->Activity->findById($object_id);
}
$this->set(compact('activity', 'cuid', 'param', 'plugin', 'type', 'object', 'object_id', 'social_link_share'));
}
public function do_share() {
$this->autoRender = false;
$messageText = (!isset($this->request->data['message']) && isset($this->request->data['messageText']) )? $this->request->data['messageText'] :$this->request->data['message'];
$share_type = isset($this->request->data['share_type']) ? $this->request->data['share_type'] : '';
$action = isset($this->request->data['action']) ? $this->request->data['action'] : '';
$param = isset($this->request->data['param']) ? $this->request->data['param'] : '';
$object_id = isset($this->request->data['object_id']) ? $this->request->data['object_id'] : '';
$userTagging = isset($this->request->data['userTagging']) ? $this->request->data['userTagging'] : '';
$friendSuggestion = isset($this->request->data['friendSuggestion']) ? $this->request->data['friendSuggestion'] : '';
$tagsUid = array();
if (!empty($friendSuggestion)) {
$tagsUid = explode(',', $friendSuggestion);
}
$groupSuggestion = isset($this->request->data['groupSuggestion']) ? $this->request->data['groupSuggestion'] : '';
$groupIds = array();
if (!empty($groupSuggestion)) {
$groupIds = explode(',', $groupSuggestion);
}
$email = isset($this->request->data['email']) ? $this->request->data['email'] : '';
$emailList = array();
if (!empty($email)) {
$emailList = explode(',', $email);
}
$uid = $this->Auth->user('id');
$sender = MooCore::getInstance()->getViewer();
$userModel = MooCore::getInstance()->getModel('User');
// $share_type : me, friend, group, msg, email
$this->loadModel('Activity');
$result = array(
'success' => false,
'msg' => __('Error while sharing feed. Please try again later.')
);
// check activity_id, make sure it is number
if (!empty($object_id) && is_numeric($object_id)) {
$data = array();
$data['content'] = $messageText;
$data['message'] = $messageText;
$data['messageText'] = $messageText;
$data['user_id'] = $uid;
$data['share'] = true;
if (strstr($action, "_share")){
$data['action'] = $action;
}
else{
$data['action'] = $action . "_share";
}
$owner_id = null;
if (empty($param)) { // share activity feed
// find activity by activity_id
$activity = $this->Activity->findById($object_id);
$data['parent_id'] = $activity['Activity']['id'];
$data['item_type'] = $activity['Activity']['item_type'];
// $data['item_id'] = $activity['Activity']['item_id'];
$data['plugin'] = $activity['Activity']['plugin'];
$data['items'] = $activity['Activity']['items'];
$data['privacy'] = $activity['Activity']['privacy'];
$data['params'] = $activity['Activity']['params'];
$data['type'] = 'User';
$owner_id = $activity['Activity']['user_id'];
$shared_link = Router::url(array(
'plugin' => false,
'controller' => 'users',
'action' => 'view',
$activity['Activity']['user_id'],
'activity_id' => $activity['Activity']['id']
), true);
} else { // share item detail
list($plugin, $name) = mooPluginSplit($param);
$object = MooCore::getInstance()->getItemByType($param, $object_id);
$data['parent_id'] = $object[key($object)]['id'];
//$data['item_id'] = $object[key($object)]['id'];
if (isset($object[key($object)]['moo_privacy'])){
$data['privacy'] = $object[key($object)]['moo_privacy'];
}
$data['type'] = 'User';
$data['item_type'] = $param;
$data['plugin'] = $plugin;
$shared_link = FULL_BASE_URL . $object[key($object)]['moo_href'];
$owner_id = $object[key($object)]['user_id'];
}
$share_activity = null;
if (!empty($data)) {
// do share
switch ($share_type) {
case '#me': // share my wall
$share_activity = $this->_shareToMyWall($data);
$activity_id = isset($share_activity['Activity']['id']) ? $share_activity['Activity']['id'] : 0;
//notification for user mention
$url = '/users/view/' . $uid . '/activity_id:' . $activity_id;
$this->_sendNotificationToMentionUser($messageText,$url,'mention_user');
// tagging
if (!empty($userTagging)){
$this->loadModel('UserTagging');
$this->UserTagging->save(array('item_id' => $activity_id,
'item_table' => 'activities',
'users_taggings' => $userTagging,
'created' => date("Y-m-d H:i:s"),
));
}
break;
case '#email': // share via email
foreach ($emailList as $email) {
if (Validation::email(trim($email))) {
$this->_shareViaEmail(array(
'email' => $email,
'shared_user' => $email,
'user_shared' => $sender['User']['name'],
'shared_link' => $shared_link,
'shared_content' => $messageText,
));
}
}
break;
case '#friend': // share to friend wall
$activity_id = null;
foreach ($tagsUid as $user_id) {
$data['target_id'] = $user_id;
$share_activity = $this->_shareToFriendWall($data);
$activity_id = isset($share_activity['Activity']['id']) ? $share_activity['Activity']['id'] : 0;
// tagging
if (!empty($userTagging)){
$this->loadModel('UserTagging');
$this->UserTagging->save(array('item_id' => $activity_id,
'item_table' => 'activities',
'users_taggings' => $userTagging,
'created' => date("Y-m-d H:i:s"),
));
}
}
//notification for user mention
$url = '/users/view/' . $uid . '/activity_id:' . $activity_id;
$this->_sendNotificationToMentionUser($messageText,$url,'mention_user');
break;
case '#group': // share to group wall
$activity_id = null;
foreach ($groupIds as $group_id) {
$data['target_id'] = $group_id;
$data['type'] = 'Group_Group';
// disable re-share for item shared in restrict and private group
$this->loadModel('Group.Group');
$group = $this->Group->findById($group_id);
if (!empty($group)){
if ($group['Group']['type'] == PRIVACY_RESTRICTED || $group['Group']['type'] == PRIVACY_PRIVATE){
$data['share'] = false;
}
}
$share_activity = $this->_shareToGroupWall($data);
$activity_id = isset($share_activity['Activity']['id']) ? $share_activity['Activity']['id'] : 0;
// tagging
if (!empty($userTagging)){
$this->loadModel('UserTagging');
$this->UserTagging->save(array('item_id' => $activity_id,
'item_table' => 'activities',
'users_taggings' => $userTagging,
'created' => date("Y-m-d H:i:s"),
));
}
}
//notification for user mention
$url = '/users/view/' . $uid . '/activity_id:' . $activity_id;
$this->_sendNotificationToMentionUser($messageText,$url,'mention_user');
break;
case '#msg': // share via private message
foreach ($tagsUid as $user_id) {
$receiver = $userModel->findById($user_id);
$message = "Hi " . $receiver['User']['name'] . ", \r\n " . $sender['User']['name'] . " " . __("shared you a link") . " " . $shared_link . " \r\n " . $messageText;
$subject = __("%s shared you a link", $sender['User']['name']);
$this->_shareViaMsg(array(
'subject' => $subject,
'message' => $message,
'friends' => $friendSuggestion
));
}
default :
break;
}
// notification
$this->loadModel('Notification');
if ($owner_id != $uid && !empty($share_activity)){ // not notify owner item if owner shared
$sharedLink = Router::url(array(
'plugin' => false,
'controller' => 'users',
'action' => 'view',
$share_activity['Activity']['user_id'],
'activity_id' => $share_activity['Activity']['id']
), true);
$this->Notification->record(array('recipients' => $owner_id,
'sender_id' => $uid,
'action' => 'shared_your_post',
'url' => $sharedLink
));
}
// event
$cakeEvent = new CakeEvent('Controller.Share.afterShare', $this, array('data' => $data));
$this->getEventManager()->dispatch($cakeEvent);
$result['success'] = true;
$result['msg'] = __('Shared Successfully');
}
}
echo json_encode($result);
}
private function _shareToMyWall($options = array()) {
$this->loadModel('Activity');
$options['created'] = null;
$options['modified'] = null;
unset($options['id']);
$this->Activity->clear();
$this->Activity->create();
$this->Activity->set($options);
$this->Activity->save();
return $this->Activity->read();
}
private function _shareToFriendWall($options = array()) {
$this->loadModel('Activity');
$options['created'] = null;
$options['modified'] = null;
unset($options['id']);
$this->Activity->clear();
$this->Activity->create();
$this->Activity->set($options);
$this->Activity->save();
// notification
$this->loadModel('Notification');
$this->Notification->record(array('recipients' => $options['target_id'],
'sender_id' => $options['user_id'],
'action' => 'shared_to_friend_wall',
'url' => '/users/view/' . $options['user_id'] . '/activity_id:' . $this->Activity->id
));
return $this->Activity->read();
}
private function _shareToGroupWall($options = array()) {
$this->loadModel('Activity');
$options['created'] = null;
$options['modified'] = null;
unset($options['id']);
$this->Activity->clear();
$this->Activity->create();
$this->Activity->set($options);
$this->Activity->save();
return $this->Activity->read();
}
private function _shareViaEmail($options = array()) {
$ssl_mode = Configure::read('core.ssl_mode');
$http = (!empty($ssl_mode)) ? 'https' : 'http';
$this->MooMail->send(trim($options['email']), 'shared_item', array(
'email' => trim($options['email']),
'shared_user' => $options['shared_user'],
'user_shared' => $options['user_shared'],
'shared_content' => $options['shared_content'],
'shared_link' => $options['shared_link']
)
);
}
private function _shareViaMsg($options = array()) {
$uid = $this->Auth->user('id');
$data = array();
$data['user_id'] = $uid;
$data['lastposter_id'] = $uid;
$data['subject'] = $options['subject'];
$data['message'] = $options['message'];
$friends = $options['friends'];
$this->loadModel('Conversation');
$this->Conversation->set($data);
$this->_validateData($this->Conversation);
if (!empty($friends)) {
$recipients = explode(',', $friends);
if ($this->Conversation->save()) { // successfully saved
$participants = array();
foreach ($recipients as $participant) {
$participants[] = array('conversation_id' => $this->Conversation->id, 'user_id' => $participant);
}
// add sender to convo users array
$participants[] = array('conversation_id' => $this->Conversation->id, 'user_id' => $uid, 'unread' => 0);
$this->loadModel('ConversationUser');
$this->ConversationUser->saveAll($participants);
$this->loadModel('Notification');
$this->Notification->record(array('recipients' => $recipients,
'sender_id' => $uid,
'action' => 'message_send',
'url' => '/conversations/view/' . $this->Conversation->id
));
}
}
}
}