如何将Drupal 6 的内容迁移到 Drupal 7

hooface 提交于 周四, 2016-06-30 - 20:52

Drupal 6

为了迁移,你应该已经创建了一些节点。如果没有,你可以你可以使用 devel generate 自动生成。我已经在 第一部分的谈论了它的使用。 d6.png Drupal 6 story 字段 d6p.png Drupal 6 page 没有自定义字段,但有一个 taxonomy 字段

Drupal 7

你应该在 第一部分,创建了一些必须的目标字段。 d7.png Drupal 7 目标节点类型—— article d72.png 从 github 获取代码并克隆到你的 Drupal 7 的 sites/all/modules/ 目录下: git clone --branch example4 https://github.com/steinmb/smb_migrate.git/ 或者,如果你已经在第1-3部分克隆了代码,只要简单地切换一下分支就可以了,如下: git checkout example4 注册你的类,并输出迁移状态(drush ms),应该可以看到下面这样的信息:
Group: content_migration  Total  Imported  Unprocessed  Status
User                      51     0         0            Idle
Article                   48     0         48           Idle
File                      1601   0         1601         Idle
Page                      52     0         52           Idle

Group: taxonomy           Total  Imported  Unprocessed  Status
Tags                      14     0         14           Idle
Tags2                     17     0         17           Idle
Tags3                     19     0         19           Idle
像这样迁移你的内容:drush mi Article 和 drush mi Page。输出的例子如下: Processed 52 (52 created, 0 updated, 0 failed, 0 ignored) in 0.5 sec (5798/min) - done with 'Page' 这实际上是开始迁移你需要的所有节点。请注意,在默认情况下并没有迁移我们的分类术语、文件和自定义文本字段。对这个工作您需要定义一个映射才行。指明被迁移字段的名称和存储字段的名称。我将在后续的文章(4-1)谈论这些。 代码分析 这里我只审查第 3 部分后添加/修改的代码。如果你已经看了这个系列,下面的代码看起来应该很熟悉了。 node.inc
/**
 * @file node.inc
 * Base class for migrating nodes into Drupal.
 */

/**
 * Common mappings for the Drupal 6 node migration.
 */
abstract class SMBNodeMigration extends DrupalNode6Migration {
  public function __construct(array $arguments) {
    parent::__construct($arguments);
  }
}
这个类用于存储所有设置,和所有节点常用的字段映射。 article.inc

/**
 * @file article.inc
 * Article node migration from drupal 6 story.
 */
class ArticleMigration extends SMBNodeMigration {
  public function __construct(array $arguments) {
    parent::__construct($arguments);
  }
}
page.inc
/**
 * @file page.inc
 * Page node migration from drupal 6 to 7.
 */
class PageMigration extends SMBNodeMigration {
  public function __construct(array $arguments) {
    parent::__construct($arguments);
  }
}
page.inc and article.inc contain the migration classes needed to import the two node content types (bundles) we have. Notice they both extends the SMBNodeMigration class that is our common node migration class. Try to keep each class in a file by it self. Good practice and you are conforming to PSR-1 coding standard. ### smb_migrate.migrate.inc
/**
* Node migrations - each has its own class derived from the migrate_d2d class,
* specifying its particular field mappings and transformations. source_type
* and destination_type are required arguments.
*/
$node_arguments = array(
'Page' => array(
  'class_name' => 'PageMigration',
  'description' => t('Migration of page nodes from Drupal 6'),
  'source_type' => 'page',
  'destination_type' => 'page',
),
'Article' => array(
  'class_name' => 'ArticleMigration',
  'description' => t('Migration of article nodes from Drupal 6'),
  'source_type' => 'story',
  'destination_type' => 'article',
),
);

/**
* Tell the node migrations where the users are coming from, so they can
* set up the dependency and resolve D6->D7 uids.
*/
$common_node_arguments = $common_arguments + array(
  'user_migration' => 'User'
);

foreach ($node_arguments as $migration_name => $arguments) {
$arguments = array_merge_recursive($arguments, $common_node_arguments);
$api['migrations'][$migration_name] = $arguments;
}
class_name - 为 article.inc 和 page.inc 中定义的类名。 source_type - Drupal 6 内容类型的机读名称。 destination_type - Drupal 7 内容类型的机读名称。 'user_migration' - 指明迁移节点的用户来源,这样他们就可以建立的依赖,并解决D 6> D7的 uids 对应问题。