Drupal 7 | Миграция: как привязать теги таксономии к узлу по имени?

Некоторое время я пытался настроить свой модуль переноса, но безуспешно, чтобы связать таксономические термины с узлом.

Давайте сначала начнем с того, что не Миграция 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');
}
}

Затем я создаю узлы из другой таблицы, которые имеют поле 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 есть столбец «имя», который содержит название города, например, «Париж».

Как связать этот столбец (‘название‘) значение (‘Париж‘) со сроком таксономии? Следующее не работает:

$this->addFieldMapping('field_city', 'name')->sourceMigration('symfony_db_cities');

2

Решение

Во-первых, убедитесь, что ваше поле «field_city» принимает термины «города».

Затем убедитесь, что MigrateSymfonyCitiesMigration является зависимостью MigrateSymfonySightsMigration.

Согласно документации, миграция поля ссылки на термин имеет по умолчанию «source_type» имени термина. Убедитесь, что «ignore_case» установлен правильно.

Если все остальное терпит неудачу, тогда измените карту источника MigrateSymfonyCitiesMigration sourceid1 на «имя» вместо «id» и повторите попытку (придется перерегистрировать миграцию):

$this->map = new MigrateSQLMap($this->machineName,
array(
'name' => array(
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'description' => 'City Name',
),
),
MigrateDestinationTerm::getKeySchema()
);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]