перенос ссылок узлов

Я работаю над проектом по переносу веб-сайта с asp.net на архитектуру drupal. Но содержимое сайта очень иерархично и имеет множество ссылок между сущностями.

Например: каждый контент относится к категории, а каждая категория относится к другому разделу категорий. Теперь может быть даже другой уровень иерархии.

Я планирую использовать модуль миграции для переноса содержимого базы данных и связывания перенесенных узлов через поле ссылки на узел.

Но я застрял с модулем миграции, так как не могу найти способ куда-либо перенести поле ссылки на узел...

может ли кто-нибудь помочь мне с этим...


person Piyuesh Kumar    schedule 03.02.2011    source источник


Ответы (5)


Насколько я знаю, вы не сможете сделать это полностью в модуле миграции. Вам нужно будет выполнить несколько запросов непосредственно в MySQL.

По сути, вам придется создать дополнительное поле в каждом типе контента для размещения их устаревших идентификаторов и дополнительное поле для каждой устаревшей ссылки (в дополнение к фактическому полю ссылки узла). Загрузите все данные в типы контента (поле nodereference оставьте пустым). Затем, когда все объекты загружены, вы запускаете запросы mysql для заполнения полей nodereference на основе устаревших идентификаторов и устаревших полей ссылок. Как только это будет сделано, вы можете безопасно удалить эти устаревшие поля.

Не самое элегантное решение, но я использовал его много раз.

Предостережения: * Это для Drupal 6; Реализация полей Drupal 7 совершенно другая, насколько мне известно. * Для очень больших миграций вы можете захотеть выполнить удаление устаревших полей через MySQL.

Удачи. Миграция — грязное дело.

person timgeek    schedule 03.02.2011

На самом деле, кажется, это не так уж сложно… в 2012 году. Да, вам нужно отслеживать идентификаторы источников и идентификаторы импорта, но модуль миграции сделает это за вас в аккуратной маленькой таблице. Вы можете присоединиться к этой таблице в своем исходном запросе и обновить поле ссылки на узел с помощью nid узла .., на который указывает ссылка. Конечно, указанные узлы уже должны быть импортированы. Если их не было, вы можете запустить «обновление» позже, и ссылочные nids также будут введены на основе последнего импорта. На практике:

$query = Database::getConnection(
    'default', 'mysourcedb'
)->select(
    'mysourcetable','source'
)->fields('source', array(
        'id',
        'title',
        'whatever'
        'rel_rec_id'
    )
);

$query->leftJoin('migrate_map_relimport','relmap','relmap.sourceid1=source.rel_rec_id');
$query->addField('relmap','destid1','rel_node_id');

Приведенный выше код предполагает, что у вас есть «mysourcedb» с «mysourcetable» в нем, который ссылается на «rel_rec_id», и есть еще один импорт, называемый RelImport, который импортирует таблицу rel, на которую ссылается rel_rec_id; он уже должен быть запущен (или будет запущен до того, как вы запустите дополнительное обновление). После получения класса RelImport выполните команду migrate-status, чтобы убедиться, что таблица существует.

Чтобы иметь возможность выполнять соединения с таблицей «migrate_map_relimport», убедитесь, что таблицы карты записаны в исходную базу данных, а не в базу данных drupal. Это не всегда нужно, но вот:

$this->map = new MigrateSQLMap(
    $this->machineName,
        array(
            'id' => array(
                'type' => 'int',
                'unsigned' => true,
                'not null' => true,
                'alias' => 'source' 
              )
        ),
        MigrateDestinationNode::getKeySchema(),
        'mysourcedb' // connection to use to write map tables
);

и, наконец, назначьте полученный rel_node_id ссылке на ваш узел:

$this->addFieldMapping( 'field_rel_node', 'rel_node_id' );

Yay, это ракетостроение .. YMMV

*-щука

person commonpike    schedule 12.10.2012
comment
Отличный ответ, Пайк, можно ли это использовать, если исходной БД является MSSQL? - person Vic; 30.01.2013
comment
Я действительно не знаю. Пока вы можете заставить drupal записывать таблицы миграции в исходную базу данных, теоретически разницы быть не должно. - person commonpike; 31.01.2013

Вы также можете ознакомиться с кодом модуля Content Migrate (дополнительная информация по адресу https://drupal.org/node/1144136). Он предназначен для переноса контента D6 Content Construction Kit (CCK) в D7 Fields и интегрирован с модулем References.

Он не будет делать то, что вам нужно из коробки, поскольку вы переходите с сайта ASP.net, а не с сайта D6, но он может дать некоторые подсказки.

person fureigh    schedule 20.04.2012

Вот ссылка, которая может быть интересна: http://www.lullabot.com/articles/drupal-data-imports-migrate-and-table-wizard#comment-6974.

person Berdir    schedule 03.02.2011

Не совсем то, о чем вы спрашиваете, но мне это было полезно: http://drupal.org/node/1013506

person Joel    schedule 12.03.2013