德鲁巴 7 |迁移:如何按名称将分类标签关联到节点?
Drupal 7 | Migrate: how to assoc taxonomy tags to node by name?
一段时间以来,我一直在尝试设置我的迁移模块,但未能成功地将分类术语与节点相关联。
首先说一下,它不是 D2D迁移,源是旧的symfony数据库!
首先,我成功导出了分类术语:
*-.migrate.inc:
...
'symfony_db_countries' => array(
'class_name' => 'MigrateSymfonyCountriesMigration',
'group_name' => 'symfony_db_loc',
),
'symfony_db_cities' => array(
'class_name' => 'MigrateSymfonyCitiesMigration',
'group_name' => 'symfony_db_loc',
'dependencies' => array('symfony_db_countries'),
),
'symfony_db_sights' => array(
'class_name' => 'MigrateSymfonySightsMigration',
'group_name' => 'symfony_db_loc',
),
...
Cities.inc:
class MigrateSymfonyCitiesMigration extends MigrateSymfonyCitiesMigrationBase {
const TABLE_NAME = 'ya_loc_city';
public function __construct($arguments = array()) {
parent::__construct($arguments);
$this->description = t('Migrate cities from Symfony DB.');
$query = Database::getConnection('symfony', 'default')->select('ya_loc_city', 'c');
$query->leftJoin('ya_loc_city_translation', 'ct', 'ct.id = c.id');
$query->fields('c', array());
$query->fields('ct', array());
$this->source = new MigrateSourceSQL($query, array(), NULL, array('map_joinable' => FALSE));
$this->destination = new MigrateDestinationTerm('cities');
$this->map = new MigrateSQLMap($this->machineName,
array(
'id' => array(
'type' => 'int',
'not null' => TRUE,
'description' => 'City ID',
),
),
MigrateDestinationTerm::getKeySchema()
);
$this->addFieldMapping('name', 'name');
$this->addFieldMapping('parent', 'country_id')->sourceMigration('symfony_db_countries');
}
}
然后我从另一个 table 创建节点,这些节点具有指向分类术语的 entityReference 字段 (field_city)。
<?php
class MigrateSymfonySightsMigration extends Migration {
public function prepareRow($row) {
parent::prepareRow($row);
$row->point = 'point (' . $row->longitude . ' ' . $row->latitude. ')';
}
public function __construct($arguments = array()) {
//entry is the name of a group.
parent::__construct($arguments);
$this->description = 'Migration sights';
/*************SOURCE DATA*************/
...
$this->source = new MigrateSourceSQL($query, array(), NULL,
array('map_joinable' => FALSE));
$this->destination = new MigrateDestinationNode('sight');
/*************MAPPING*************/
$this->addFieldMapping('field_city', 'name')->sourceMigration('symfony_db_cities');
$this->map = new MigrateSQLMap($this->machineName,
array(
'id' => array('type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
)
),
MigrateDestinationNode::getKeySchema()
);
}
}
来自 symfony table 有一个列 "name",其中包含像 "Paris".
这样的城市名称
如何将此列('名称')值('巴黎')与分类术语相关联?以下不起作用:
$this->addFieldMapping('field_city', 'name')->sourceMigration('symfony_db_cities');
首先,确保您的 "field_city" 字段接受 "cities" 个字词。
然后确保 MigrateSymfonyCitiesMigration 是 MigrateSymfonySightsMigration 的依赖项。
According to the documentation,术语引用字段迁移默认有一个"source_type"的术语名称。确保 "ignore_case" 设置正确。
如果所有其他方法均失败,则将 MigrateSymfonyCitiesMigration 映射 sourceid1 更改为 "name" 而不是 "id" 并重试(必须重新注册迁移):
$this->map = new MigrateSQLMap($this->machineName,
array(
'name' => array(
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'description' => 'City Name',
),
),
MigrateDestinationTerm::getKeySchema()
);
一段时间以来,我一直在尝试设置我的迁移模块,但未能成功地将分类术语与节点相关联。
首先说一下,它不是 D2D迁移,源是旧的symfony数据库!
首先,我成功导出了分类术语:
*-.migrate.inc:
...
'symfony_db_countries' => array(
'class_name' => 'MigrateSymfonyCountriesMigration',
'group_name' => 'symfony_db_loc',
),
'symfony_db_cities' => array(
'class_name' => 'MigrateSymfonyCitiesMigration',
'group_name' => 'symfony_db_loc',
'dependencies' => array('symfony_db_countries'),
),
'symfony_db_sights' => array(
'class_name' => 'MigrateSymfonySightsMigration',
'group_name' => 'symfony_db_loc',
),
...
Cities.inc:
class MigrateSymfonyCitiesMigration extends MigrateSymfonyCitiesMigrationBase {
const TABLE_NAME = 'ya_loc_city';
public function __construct($arguments = array()) {
parent::__construct($arguments);
$this->description = t('Migrate cities from Symfony DB.');
$query = Database::getConnection('symfony', 'default')->select('ya_loc_city', 'c');
$query->leftJoin('ya_loc_city_translation', 'ct', 'ct.id = c.id');
$query->fields('c', array());
$query->fields('ct', array());
$this->source = new MigrateSourceSQL($query, array(), NULL, array('map_joinable' => FALSE));
$this->destination = new MigrateDestinationTerm('cities');
$this->map = new MigrateSQLMap($this->machineName,
array(
'id' => array(
'type' => 'int',
'not null' => TRUE,
'description' => 'City ID',
),
),
MigrateDestinationTerm::getKeySchema()
);
$this->addFieldMapping('name', 'name');
$this->addFieldMapping('parent', 'country_id')->sourceMigration('symfony_db_countries');
}
}
然后我从另一个 table 创建节点,这些节点具有指向分类术语的 entityReference 字段 (field_city)。
<?php
class MigrateSymfonySightsMigration extends Migration {
public function prepareRow($row) {
parent::prepareRow($row);
$row->point = 'point (' . $row->longitude . ' ' . $row->latitude. ')';
}
public function __construct($arguments = array()) {
//entry is the name of a group.
parent::__construct($arguments);
$this->description = 'Migration sights';
/*************SOURCE DATA*************/
...
$this->source = new MigrateSourceSQL($query, array(), NULL,
array('map_joinable' => FALSE));
$this->destination = new MigrateDestinationNode('sight');
/*************MAPPING*************/
$this->addFieldMapping('field_city', 'name')->sourceMigration('symfony_db_cities');
$this->map = new MigrateSQLMap($this->machineName,
array(
'id' => array('type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
)
),
MigrateDestinationNode::getKeySchema()
);
}
}
来自 symfony table 有一个列 "name",其中包含像 "Paris".
这样的城市名称如何将此列('名称')值('巴黎')与分类术语相关联?以下不起作用:
$this->addFieldMapping('field_city', 'name')->sourceMigration('symfony_db_cities');
首先,确保您的 "field_city" 字段接受 "cities" 个字词。
然后确保 MigrateSymfonyCitiesMigration 是 MigrateSymfonySightsMigration 的依赖项。
According to the documentation,术语引用字段迁移默认有一个"source_type"的术语名称。确保 "ignore_case" 设置正确。
如果所有其他方法均失败,则将 MigrateSymfonyCitiesMigration 映射 sourceid1 更改为 "name" 而不是 "id" 并重试(必须重新注册迁移):
$this->map = new MigrateSQLMap($this->machineName,
array(
'name' => array(
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'description' => 'City Name',
),
),
MigrateDestinationTerm::getKeySchema()
);