Drupal → Пример миграции материалов из Drupal 5 в Drupal 7 с помощью модуля Migrate

21.12.2011

Пример класса для Migrate, для переноса материалов типа product с дополнительным CCK полем field_price:

class NodeProductMigration extends Migration {
  public function __construct($arguments) {
    parent::__construct($arguments);
    
    // Source
    $query = Database::getConnection('default', 'drupal5')->select('node', 'n');
    $query->fields('n', array('nid', 'title', 'uid', 'status', 'created', 'changed', 'promote', 'sticky'));
    $query->fields('nr', array('body', 'teaser', 'format'));
    $query->fields('ctp', array('field_price_value'));
    $query->fields('ua', array('dst'));
    $query->leftJoin('node_revisions', 'nr', 'n.nid = nr.nid');
    $query->leftJoin('content_type_product', 'ctp', 'ctp.nid = n.nid AND ctp.vid = n.vid');
    $query->leftJoin('url_alias', 'ua', "ua.src = CONCAT('node/', n.nid)");
    $query->condition('n.type', 'product');
    $this->source = new MigrateSourceSQL($query, array(), NULL, array('map_joinable' => FALSE));
    
    // Destination
    $this->destination = new MigrateDestinationNode('product');
    
    // Key schema
    $this->map = new MigrateSQLMap(
      $this->machineName,
      MigrateDestinationNode::getKeySchema(),
      MigrateDestinationNode::getKeySchema()
    );

    // Mapping
    $this->addSimpleMappings(array('nid', 'title', 'body', 'uid', 'created', 'changed', 'status', 'promote', 'sticky'));
    $this->addFieldMapping('body:summary', 'teaser');
    $this->addFieldMapping('body:format', 'format');
    $this->addFieldMapping('field_price', 'field_price_value');
    $this->addFieldMapping('path', 'dst');
    $this->addFieldMapping('is_new')->defaultValue(TRUE);
  }
}

Таблица url_alias не имеет связи по ключу с таблицей node, поэтому приходится делать такой хитрый джойн с помощью CONCAT().

Когда поля в источнике и назначении имеют одинаковые имена, можно вместо $this->addFieldMapping('fieldname', 'fieldname') использовать $this->addSimpleMappings(array('fieldname')).

Метод $this->addFieldMapping(...)->defaultValue(...) позволяет указать дефолтное значение для поля если в источнике будет NULL.

Ещё пример миграции из Drupal 5 в Drupal 7.

Написанное актуально для
Migrate 7.x-2.8
Похожие записи

Добавить комментарий