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;
- }
- }
- }
|