| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 | <?php/** * @file * Privatemag module integration * * Limitations: *   - No updating of messages. *   - No threading *   - Messages are marked as deleted and not actually deleted. Thats the *       privatemsg API. *   - All these limitations can be helped by http://drupal.org/node/1184984. */class MigrateDestinationPrivateMsg extends MigrateDestinationEntity {  /**   * An array with content ids of imported messages. Not yet used.   */  var $importedIds = array();  static public function getKeySchema() {    return array(      'mid' => array(        'type' => 'int',        'unsigned' => TRUE,        'not null' => TRUE,      ),    );  }  /**   * Basic initialization   *   * @param array $options   *  Options applied to private messages.   */  public function __construct(array $options = array()) {    parent::__construct('privatemsg_message', 'privatemsg_message', $options);  }  /**   * Returns a list of fields available to be mapped/   *   * @return array   *  Keys: machine names of the fields (to be passed to addFieldMapping)   *  Values: Human-friendly descriptions of the fields.   */  public function fields() {    $fields = array(        // 'mid' => 'Message ID', // Updating not supported. See http://drupal.org/node/1184984.        'subject' => 'Subject',        'body' => 'Body',        'format' => 'Text format name for the Body',        'recipients' => 'User IDs of recipients',        'timestamp' => 'Timestamp',        'author' => 'User ID of author',        'is_new' => 'TRUE if unread by recipient, FALSE if read by recipient',    );    // Then add in anything provided by handlers    $fields += migrate_handler_invoke_all('Entity', 'fields', $this->entityType, $this->bundle);    $fields += migrate_handler_invoke_all('PrivateMsg', 'fields', $this->entityType, $this->bundle);    return $fields;  }  /**   * Mark provided message as deleted.   *   * @param $id   *  IDs to be deleted.   */  public function rollback(array $id) {    migrate_instrument_start(__METHOD__);    // Delete recipients of the message.    db_delete('pm_index')      ->condition('mid', reset($id))      ->execute();    // Delete message itself.    db_delete('pm_message')      ->condition('mid', reset($id))      ->execute();    migrate_instrument_stop(__METHOD__);  }  /**   * Import a single message.   *   * @param $entity   *  Object object to build. Prefilled with any fields mapped in the Migration.   * @param $row   *  Raw source data object - passed through to prepare/complete handlers.   * @return array   *  Array of key fields of the object that was saved if   *  successful. FALSE on failure.   */  public function import(stdClass $entity, stdClass $row) {    $this->prepare($entity, $row);    // The privatemsg API does not support updating. See http://drupal.org/node/1184984    // $message['mid'] = $entity->mid;    // The two user_load() calls here could by slow. If so, one could experiment    // with entity cache module - http://drupal.org/project/entitycache.    $options = array();    if (isset($entity->timestamp)) $options['timestamp'] = Migration::timestamp($entity->timestamp);    if (isset($entity->author)) $options['author'] = user_load($entity->author);    if (isset($entity->format)) $options['format'] = $entity->format;    if (!is_array($entity->recipients)) {      $entity->recipients = array($entity->recipients);    }    foreach ($entity->recipients as $uid) {      $entity->to[] = user_load($uid);    }    // FYI, API is at http://api.worldempire.ch/api/privatemsg/privatemsg.module/function/privatemsg_new_thread/7-2    $return = privatemsg_new_thread($entity->to, $entity->subject, $entity->body, $options);    if (!empty($return['success'])) {      $this->complete((object)$return, $row);      // Set the read status for the recipient (defaults to unread, so only need      // to set if read)      $mid = $return['message']->mid;      if (isset($entity->is_new) && $entity->is_new == PRIVATEMSG_READ) {        foreach ($entity->to as $account) {          privatemsg_message_change_status($mid, $entity->is_new, $account);        }      }      return array($mid);    }    else {      $migration = Migration::currentMigration();      $migration->saveMessage(reset($return['messages']['error']));      return FALSE;    }  }}
 |