You are here

messaging.destination.inc in Messaging 7

Drupal Messaging Framework - Default class file

File

messaging.destination.inc
View source
<?php

/**
 * @file
 * Drupal Messaging Framework - Default class file
 */

/**
 * Message destination class
 * 
 * A destination can be mapped to a sending address (mail, mail@example.com), though optionally it can be linked
 * to an user id. When adding a destination to a message it may have a sending method too. 
 */
class Messaging_Destination extends Messaging_Object {

  // Destination status
  const STATUS_PENDING = 0;
  const STATUS_ACTIVE = 1;

  // Object unique id
  public $mdid = 0;

  // Destination type (mail, xmpp, etc..)
  public $type;

  // User id.
  public $uid;

  // Address for this sending method
  public $address;

  // User name, not saved to db
  public $name;

  // Date sent
  public $sent = 0;

  // Status
  public $status = 0;

  /**
   * Get address type name for display
   */
  function get_title() {
    return $this
      ->address_info('name', t('Address'));
  }

  /**
   * Get address name (will be user name if available)
   */
  function get_name() {
    if (isset($this->name)) {
      return $this->name;
    }
    else {
      return $this
        ->get_user()->name;
    }
  }

  /**
   * Get address for sending
   */
  function get_address() {
    return isset($this->address) ? $this->address : NULL;
  }

  /**
   * Get user account
   */
  function get_user() {
    $user = isset($this->uid) ? user_load($this->uid) : NULL;
    if (!$user) {
      $user = drupal_anonymous_user();
      $user->name = t('User');
    }
    return $user;
  }

  /**
   * Set user for this destination
   */
  function set_user($user) {
    $this->uid = $user->uid;
    $this->name = $user->name;
    if (!isset($this->address)) {
      $this->address = $this
        ->get_address_from_user($user);
    }
    return $this;
  }

  /**
   * Get user from address
   */
  public static function get_user_from_address($address) {
    return NULL;
  }

  /**
   * Get address from user
   */
  public static function get_address_from_user($user) {
    return NULL;
  }

  /**
   * Get from db using conditions
   */
  public static function get($params) {
    $dest = self::load_multiple(array(), $params);
    return reset($dest);
  }

  /**
   * Build destination object
   */
  public static function build($type, $address = NULL, $uid = NULL, $validate = FALSE) {
    if (!$validate || self::validate_address($address, $type)) {
      return self::build_type($type, array(
        'address' => $address,
        'uid' => $uid,
      ));
    }
  }

  /**
   * Build destination from db object
   */
  public static function build_object($template) {
    return self::build_type($template->type, $template);
  }

  /**
   * Build from address type
   */
  public static function build_type($type, $template = NULL) {
    $class = messaging_address_info($type, 'class', 'Messaging_Destination');
    $destination = new $class($template);
    $destination->type = $type;
    return $destination;
  }

  /**
   * Build from method, address, user
   */
  public static function build_method($method, $address = NULL, $account = NULL) {
    $type = messaging_send_method($method)
      ->address_type();
    $uid = $account ? $account->uid : 0;
    if ($type && $address) {
      return self::build($type, $address, $uid);
    }
    elseif ($type && $account) {
      return self::build_user($type, $account);
    }
    elseif ($account) {
      return messaging_send_method($method)
        ->user_destination($account);
    }
  }

  /**
   * Build from address
   */
  public static function build_address($type, $address, $validate = FALSE) {
    return self::build($type, $address, NULL, $validate);
  }

  /**
   * Build from user account
   */
  public static function build_user($type, $user) {
    $destination = self::build_type($type);
    $destination
      ->set_user($user);
    return $destination;
  }

  /**
   * Load object from database
   */
  public static function load($mdid) {
    $dest = entity_load('messaging_destination', array(
      $mdid,
    ));
    return $dest ? $dest[$mdid] : FALSE;
  }

  /**
   * Load multiple events
   */
  public static function load_multiple($mdids = array(), $conditions = array()) {
    return entity_load('messaging_destination', $mdids, $conditions);
  }

  /**
   * Validate values to create a destination
   *
   * @param $method
   *   Send method
   * @param $address
   *   Address value
   * @param $account
   *   Optional user id or account object the destination is intended for
   */
  public static function validate_method($method, $address, $account = NULL) {

    // First validate address and check permission
    $send_method = messaging_send_method($method);
    if (!$send_method || !$send_method
      ->address_validate($address)) {
      return FALSE;
    }
    if (isset($account)) {
      $account = messaging_user_object($account);
      if (!$account || !$send_method
        ->user_access($account)) {
        return FALSE;
      }
    }
    if ($type = messaging_method_info($method, 'address_type')) {
      return self::validate_type($type, $address, $account);
    }
  }

  /**
   * Validate values to create a destination
   *
   * @param $type
   *   Address type
   * @param $address
   *   Address value
   * @param $account
   *   Optional user id or account object
   */
  public static function validate_type($type, $address, $account = NULL) {

    // First try validate callback for this address type
    if (!self::validate_address($type, $address)) {
      return FALSE;
    }
    elseif (isset($account)) {
      $uid = messaging_user_uid($account);
      if ($existing = self::get_by_address($type, $address)) {

        // There's already a destination with these parameters, check user
        // It will be ok if users match or it was anonymous before
        return !isset($account) || !$existing->uid || $existing->uid == $uid;
      }
      elseif ($address_uid = self::address2uid($type, $address)) {

        // Ok if this address belongs to the same user or to no user
        return !$address_uid || $address_uid == $uid;
      }
    }
    return TRUE;
  }

  /**
   * Validate address format
   *
   * @param $address
   *   Destination address
   * @param $type
   *   Optional address type, for static calls
   */
  public static function validate_address($address, $type = NULL) {
    if ($type) {
      return self::static_invoke($type, 'validate_address', $address);
    }
    else {
      return !empty($address);
    }
  }

  /**
   * Create from array data
   */
  public static function create($data) {

    // If no more clues, we create it for anonymous user
    $data += array(
      'uid' => 0,
      'method' => NULL,
      'type' => NULL,
      'address' => NULL,
    );
    if ($data['type'] && $data['address']) {
      return self::create_type($data['type'], $data['address'], $data['uid']);
    }
    else {
      return self::create_method($data['method'], $data['address'], $data['uid']);
    }
  }

  /**
   * Create for sending method
   */
  public static function create_method($send_method, $address, $uid) {
    if ($type = messaging_method_info($send_method, 'address_type')) {
      return self::create_type($type, $address, $uid);
    }
  }

  /**
   * Create with parameters
   */
  public static function create_type($type, $address, $uid) {
    if ($existing = self::get_by_address($type, $address)) {
      if ($existing->uid != $uid) {
        $existing->uid = $uid;
        $existing
          ->save();
      }
      return $existing;
    }
    elseif ($uid && ($existing = self::get(array(
      'uid' => $uid,
      'type' => $type,
      'address' => '',
    )))) {
      $existing->address = $address;
      $existing
        ->save();
      return $existing;
    }
    else {
      $destination = self::build(array(
        'type' => $type,
        'address' => $address,
        'uid' => $uid,
      ));
      $destination
        ->save();
      return $destination;
    }
  }

  /**
   * Get destination by method and address. This allows advanced caching.
   */
  public static function get_by_address($type, $address) {
    $cached = self::cache_by_address($type, $address);
    if (isset($cached)) {
      return $cached;
    }
    else {
      return self::get(array(
        'type' => $type,
        'address' => $address,
      ));
    }
  }

  /**
   * Get unique index for this destination
   */
  function index() {
    return $this->type . ':' . $this->address;
  }

  /**
   * Get address type information
   */
  function address_info($property = NULL, $default = NULL) {
    if (!empty($this->type)) {
      return messaging_address_info($this->type, $property, $default);
    }
  }

  /**
   * Format destination
   */
  function format($type = 'short', $format = MESSAGING_FORMAT_PLAIN) {
    $address = $this
      ->get_address();
    switch ($type) {
      case 'short':
        return $this
          ->format_address($address, $format);
      case 'long':
        return $this
          ->get_name() . ': ' . $this
          ->format_address($address, $format);
    }
  }

  /**
   * Format address.
   *
   * @param $address
   *   Destination address
   * @param $type
   *   Optional address type, for static calls
   */
  public static function format_address($address, $format = MESSAGING_FORMAT_PLAIN, $type = NULL) {
    if ($type) {
      return self::static_invoke($type, 'format_address', $address, $format);
    }
    else {
      return isset($address) ? check_plain($address) : t('none');
    }
  }

  /**
   * Delete messaging destination object/s
   */
  public static function delete_multiple($params) {
    $query = db_delete('messaging_destination');
    foreach ($params as $field => $value) {
      $query
        ->condition($field, $value);
    }
    return $query
      ->execute();
  }

  // Magic function, format as string
  public function __toString() {
    return 'Destination: ' . $this
      ->index();
  }

  /**
   * Save object to cache
   */
  public function cache_save() {
    $this
      ->cache_by_address($this->type, $this->address, $this);
  }

  /**
   * Save object to cache
   */
  public function cache_delete() {
    parent::cache_delete();
    $this
      ->cache_by_address($this->type, $this->address, FALSE);
  }

  // Store into address cache
  public static function cache_set($key, $object) {
    $cache =& drupal_static('messaging_destination_address');
    return $cache[$key] = $object;
  }

  // Get from address cache
  public static function cache_get($key) {
    $cache =& drupal_static('messaging_destination_address');
    return isset($cache[$key]) ? $cache[$key] : NULL;
  }

  /**
   * Cache get/set by method and address
   */
  public static function cache_by_address($type, $address, $object = NULL) {
    if (isset($object)) {
      return self::cache_set("{$type}:{$address}", $object);
    }
    else {
      return self::cache_get("{$type}:{$address}");
    }
  }

  /**
   * Run module_invoke_all('notifications_subscription') with this object
   */
  protected function invoke_all($op, $param = NULL) {
    return module_invoke_all('messaging_destination', $op, $this, $param);
  }

  /**
   * Invoke static method on address type.
   *
   * @param $type
   *   Address type
   * @param $method
   *   Method name
   * @param $arg1, $arg2...
   */
  protected static function static_invoke() {
    $args = func_get_args();
    $type = array_shift($args);
    $function = array_shift($args);
    $class = messaging_address_info($type, 'class', 'Messaging_Destination');
    return call_user_func_array(array(
      $class,
      $function,
    ), $args);
  }

}

/**
 * Destination is a system user
 */
class Messaging_User_Destination extends Messaging_Destination {
  public $type = 'user';
  public $address = '';

  /**
   * Get name for display
   */
  function address_name() {
    return t('User');
  }

  /**
   * Get address for sending
   */
  function get_address() {
    return $this
      ->get_user();
  }

  /**
   * Set user for this destination
   */
  function set_user($user) {
    $this->uid = $user->uid;
  }

  /**
   * Get unique index for this destination
   */
  function index() {
    return 'user:' . $this->uid;
  }

  /**
   * Get user from address
   */
  public static function get_user_from_address($address) {
    return $address;
  }

  /**
   * Get address from user
   */
  public static function get_address_from_user($user) {
    return $user;
  }

  /**
   * Check address is valid
   */
  public static function validate_address($address, $type = NULL) {
    return is_object($address) ? !empty($address->uid) : FALSE;
  }

  /**
   * Format address
   */
  public static function format_address($user, $format = MESSAGING_FORMAT_PLAIN, $type = NULL) {
    return $format & MESSAGING_FORMAT_HTML ? theme('username', array(
      'account' => $user,
    )) : check_plain($user->name);
  }

}

Classes

Namesort descending Description
Messaging_Destination Message destination class
Messaging_User_Destination Destination is a system user