Пример миграции контента из vBulletin 3 в Drupal 7: пользователи

Пример класса для Migrate, для переноса пользователей из vBulletin 3.8.x в Drupal 7.x

class UsersMigration extends Migration {
  // vbulletin_group => drupal_role
  private $rolesMap = array(
    6 => 4,
    7 => 5,
    8 => 6,
  );
 
  public function __construct() {
    parent::__construct();
 
    // Source
    $query = Database::getConnection('default', 'vbulletin')->select('user', 'u');
    $query->leftJoin('avatar', 'a', 'a.avatarid = u.avatarid');
    $query->leftJoin('customavatar', 'c', 'c.userid = u.userid');
    $query->fields('u', array('userid', 'username', 'password', 'email', 'usertitle', 'joindate', 'lastvisit', 'lastactivity', 'avatarrevision', 'usergroupid'));
    $query->fields('a', array('avatarpath'));
    $query->fields('c', array('filename'));
    $query->condition('u.userid', 1, '!=');
    $query->orderBy('u.userid');
    $this->source = new MigrateSourceSQL($query, drupal_map_assoc(array('picture')), NULL, array('map_joinable' => FALSE));
 
    // Destination
    $this->destination = new MigrateDestinationUser();
 
    // Key schema
    $source_key_schema = array('userid' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE));
    $this->map = new MigrateSQLMap($this->machineName, $source_key_schema, MigrateDestinationUser::getKeySchema());
 
    // Mapping
    $this->addFieldMapping('uid', 'userid');
    $this->addFieldMapping('is_new')->defaultValue(TRUE);
    $this->addFieldMapping('name', 'username')->dedupe('users', 'name');
    $this->addFieldMapping('pass', 'password');
    $this->addFieldMapping('mail', 'email');
    $this->addFieldMapping('signature', 'usertitle');
    $this->addFieldMapping('signature_format')->defaultValue('filtered_html');
    $this->addFieldMapping('created', 'joindate');
    $this->addFieldMapping('access', 'lastactivity');
    $this->addFieldMapping('login', 'lastvisit');
    $this->addFieldMapping('status')->defaultValue(1);
    $this->addFieldMapping('init', 'email');
    $this->addFieldMapping('picture', 'picture');
  }
 
  public function prepareRow($row) {
    // Role
    if ($row->usergroupid && isset($this->rolesMap[$row->usergroupid])) {
      $row->usergroupid = $this->rolesMap[$row->usergroupid];
    }
 
    // Picture
    if ($row->avatarpath || $row->filename) {
      if ($row->avatarpath) {
        $picture_path = $row->avatarpath;
      }
      else {
        $picture_path = 'customavatars/avatar' . $row->userid . '_' . $row->avatarrevision . '.gif';
      }
      $picture_path = '/path/to/vbulletin/' . $picture_path;
      $picture = (object)array(
        'uri' => $picture_path,
        'filename' => basename($picture_path),
        'filemime' => file_get_mimetype($picture_path),
        'status' => FILE_STATUS_PERMANENT,
      );
      $picture = file_copy($picture, 'public://pictures', FILE_EXISTS_REPLACE);
      if ($picture) {
        $row->picture = $picture->fid;
      }
    }
  }
}

Аватар пользователя не является полем, поэтому приходится вручную копировать файлы (на d.org кстати предлагают писать для аватаров отдельный класс).

Пароли, естественно, переносу не поддаются.

Написанное актуально для
Migrate 7.x-2.4
Теги:
migrate, vbulletin, импорт, работа с профилем
Добавлено: 30 Июля 2018 07:23:11 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...