Пример класса для 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