Пример #1
0
/**
 * Page handler for 'messages'
 * @param array $page An array of URL segments
 * @return boolean Outputs a page or returns false on failure
 */
function hj_inbox_page_handler($page)
{
    gatekeeper();
    elgg_load_css('inbox.base.css');
    // Due to varying segmentation in earlier version of messages plugin, let's iterate through segments and find the page owner
    foreach ($page as $segment) {
        $current_user = get_user_by_username($segment);
        if (elgg_instanceof($current_user, 'user')) {
            break;
        }
    }
    if (elgg_instanceof($current_user, 'user') && !$current_user->canEdit()) {
        forward("messages/{$current_user->username}");
    } else {
        $current_user = elgg_get_logged_in_user_entity();
    }
    elgg_set_page_owner_guid($current_user->guid);
    elgg_push_breadcrumb(elgg_echo("hj:inbox"), "messages/{$current_user->username}");
    switch ($page[0]) {
        default:
        case 'inbox':
        case 'incoming':
            hj_inbox_title_menu_setup();
            elgg_load_js('inbox.user.js');
            $message_type = get_input('message_type', HYPEINBOX_PRIVATE);
            elgg_push_breadcrumb(elgg_echo("hj:inbox"), "messages/inbox/{$current_user->username}");
            elgg_push_breadcrumb(elgg_echo("item:object:message:{$message_type}:plural"));
            $params = array('message_type' => $message_type);
            $title = elgg_echo("hj:inbox:inbox");
            $content = elgg_view("framework/inbox/inbox", $params);
            $filter = elgg_view("framework/inbox/filters/inbox", $params);
            $sidebar = elgg_view('framework/inbox/sidebar', $params);
            break;
        case 'outbox':
        case 'outgoing':
        case 'sent':
            hj_inbox_title_menu_setup();
            elgg_load_js('inbox.user.js');
            $message_type = get_input('message_type', HYPEINBOX_PRIVATE);
            elgg_push_breadcrumb(elgg_echo("hj:inbox:sent"), "messages/sent/{$current_user->username}");
            elgg_push_breadcrumb(elgg_echo("item:object:message:{$message_type}:plural"));
            $params = array('message_type' => $message_type);
            $title = elgg_echo("hj:inbox:sent");
            $content = elgg_view("framework/inbox/sent", $params);
            $filter = elgg_view("framework/inbox/filters/sent", $params);
            $sidebar = elgg_view('framework/inbox/sidebar', $params);
            break;
        case 'read':
        case 'view':
        case 'reply':
            $entity = get_entity($page[1]);
            hj_inbox_title_menu_setup($entity);
            if (!elgg_instanceof($entity, 'object', 'messages')) {
                $title = elgg_echo('hj:inbox:message_not_found');
                $content = elgg_view('framework/inbox/notfound');
            } else {
                elgg_push_breadcrumb(elgg_echo("hj:inbox:inbox"), "messages/inbox/{$current_user->username}");
                elgg_push_breadcrumb(elgg_echo("item:object:message:{$entity->msgType}:plural"), "messages/inbox/{$current_user->username}?message_type={$entity->msgType}");
                elgg_push_breadcrumb($entity->title);
                $title = elgg_echo('hj:inbox:message', array($entity->title));
                $content = elgg_view('framework/inbox/thread', array('entity' => $entity));
            }
            $filter = false;
            $sidebar = elgg_view('framework/inbox/sidebar', array('entity' => $entity, 'message_type' => $entity->msgType));
            break;
        case 'thread':
            $hash = elgg_extract(1, $page, false);
            if (!$hash) {
                return false;
            }
            $entities = elgg_get_entities_from_metadata(array('owner_guid' => $current_user->guid, 'metadata_name_value_pairs' => array('name' => 'msgHash', 'value' => $hash), 'order_by' => 'e.time_created ASC', 'limit' => 1));
            $entity = $entities[0];
            hj_inbox_title_menu_setup($entity);
            if (!elgg_instanceof($entity, 'object', 'messages')) {
                $title = elgg_echo('hj:inbox:message_not_found');
                $content = elgg_view('framework/inbox/notfound');
            } else {
                elgg_push_breadcrumb(elgg_echo("hj:inbox:inbox"), "messages/inbox/{$current_user->username}");
                elgg_push_breadcrumb(elgg_echo("item:object:message:{$entity->msgType}:plural"), "messages/inbox/{$current_user->username}?message_type={$entity->msgType}");
                elgg_push_breadcrumb($entity->title);
                $title = elgg_echo('hj:inbox:message', array($entity->title));
                $content = elgg_view('framework/inbox/thread', array('entity' => $entity, 'message_hash' => $hash));
            }
            $filter = false;
            $sidebar = elgg_view('framework/inbox/sidebar', array('entity' => $entity, 'message_type' => $entity->msgType));
            break;
        case 'compose':
        case 'add':
            $message_type = get_input('message_type', HYPEINBOX_PRIVATE);
            $entity = get_entity($page[1]);
            $title = elgg_echo("hj:inbox:compose", array("item:object:message:{$message_type}:singular"));
            elgg_push_breadcrumb(elgg_echo("item:object:message:{$message_type}:plural"));
            elgg_push_breadcrumb($title);
            $params = hj_inbox_prepare_form_vars((int) get_input('send_to'), $message_type, $entity);
            $content = elgg_view("framework/inbox/compose", $params);
            $filter = false;
            $sidebar = elgg_view('framework/inbox/sidebar', $params);
            break;
        case 'userpicker':
            $sender = elgg_get_logged_in_user_entity();
            $message_type = get_input('message_type', HYPEINBOX_PRIVATE);
            $letter = get_input('letter', false);
            $output = array('counters' => array(), 'items' => array());
            $getter_options = hj_inbox_get_userpicker_options($message_type, $sender);
            $dbprefix = elgg_get_config('dbprefix');
            if ($letter) {
                $options = $getter_options;
                $options['limit'] = 0;
                $options['joins'][] = "JOIN {$dbprefix}users_entity ue_query ON e.guid = ue_query.guid";
                $options['wheres'][] = "LOWER(ue_query.name) LIKE '{$letter}%'";
                $options['order_by'] = "ue_query.name ASC";
                $items = new ElggBatch('elgg_get_entities', $options);
                if ($items) {
                    foreach ($items as $item) {
                        $output['items'][] = elgg_view('input/messages/userpicker/item', array('entity' => $item, 'name' => get_input('name'), 'multiple' => get_input('multiple', false), 'checked' => in_array($item->guid, get_input('value', array()))), false, false, 'default');
                    }
                }
            } else {
                foreach (range('a', 'z') as $letter) {
                    $letters[] = "'{$letter}'";
                    $letter = sanitize_string($letter);
                    $options = $getter_options;
                    $options['joins'][] = "JOIN {$dbprefix}users_entity ue_query ON e.guid = ue_query.guid";
                    $options['wheres'][] = "LOWER(ue_query.name) LIKE '{$letter}%'";
                    $options['order_by'] = "ue_query.name ASC";
                    $options['count'] = true;
                    $count = elgg_get_entities($options);
                    $output['counters'][$letter] = (int) $count;
                }
                $letters_in = implode(',', $letters);
                $options = $getter_options;
                $options['joins'][] = "JOIN {$dbprefix}users_entity ue_query ON e.guid = ue_query.guid";
                $options['wheres'][] = "LOWER(LEFT(ue_query.name,1)) NOT IN ({$letters_in})";
                $options['order_by'] = "ue_query.name ASC";
                $options['count'] = true;
                $count = elgg_get_entities($options);
                $output['counters']['*'] = (int) $count;
            }
            header("Content-type: application/json");
            echo json_encode($output);
            exit;
            break;
    }
    $params = array('title' => $title, 'filter' => $filter, 'content' => $content, 'sidebar' => $sidebar, 'class' => 'inbox-layout');
    if (elgg_is_xhr()) {
        print json_encode($params);
        forward();
    } else {
        $layout = elgg_view_layout('content', $params);
        echo elgg_view_page($title, $layout);
    }
    return true;
}
Пример #2
0
/**
 * Get message types the user can send
 * @param ElggUser $user
 * @return array An array of message types
 */
function hj_inbox_get_outgoing_message_types($user = null)
{
    $return = array();
    if (!elgg_instanceof($user)) {
        $user = elgg_get_logged_in_user_entity();
        if (!$user) {
            return $return;
        }
    }
    $message_types = elgg_get_config('inbox_message_types');
    $user_types = elgg_get_config('inbox_user_types');
    foreach ($message_types as $type => $options) {
        $policies = $options['policy'];
        if (!$policies) {
            if ($type != HYPEINBOX_NOTIFICATION) {
                $return[] = $type;
            }
            continue;
        }
        $getter_options = hj_inbox_get_userpicker_options($type, $user);
        $getter_options['count'] = true;
        $valid_recipients_count = elgg_get_entities($getter_options);
        foreach ($policies as $policy) {
            $sender_type = $policy['sender'];
            if ($sender_type == 'all' && $valid_recipients_count) {
                $return[] = $type;
                break;
            }
            $validator = $user_types[$sender_type]['validator'];
            if ($validator && is_callable($validator) && call_user_func($validator, $user, $sender_type) && $valid_recipients_count) {
                $return[] = $type;
                break;
            }
        }
    }
    return $return;
}