xandeadx.ru Блог музицирующего веб-девелопера

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

Опубликовано в

Пример класса для 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
Похожие записи

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании