Upgrade Your Drupal Skills
We trained 1,000+ Drupal Developers over the last decade.
See Advanced Courses NAH, I know EnoughMigrate Locations Content From Drupal 6 To Drupal 8
Recently i had a problem where i need to migrate locations added by “Location” module in Drupal 6 site to Drupal 8 site. Currently “Location” module does not provide Drupal 8 version, so i used “Address” module in Drupal 8, but still i need to get all contents.
To solve this, i have created a custom module in Drupal 8. Steps to update locations:
- Create a folder /modules/custom/MODULENAME
- Create “MODULENAME.info.yml” file inside MODULENAME folder with following details:
name: MODULE NAME (This can be anything you want)
Description: MODULE DESCRIPTION
Package: Custom
type: module
core: 8.x
dependencies:
- address:address
More info on creating modules .info.yml file can be found here.
3. Now, as i need to migrate data on cron run, i created “MODULENAME.module” file and implemented hook_cron.
<?php
/**
* @file
* File to migrate contents
*/
function MODULENAME_cron() {
Write code here…..
}
We need to connect to Drupal 6 database for exporting its content. Add the following code in /sites/default/settings.php along with the default database connection:
$databases['external']['default'] = array (
'database' => ‘DATABASENAME’,
'username' => ‘USERNAME’,
'password' => ‘PASSWORD’,
'prefix' => '',
'host' => 'localhost',
'port' => ‘PORT’,
'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
'driver' => 'mysql',
);
We have used “External” for connecting to Drupal 6 database. “Default” is used for Drupal 8 database connection. So now there will be 2 database connections in settings.php
Code to switch to Drupal 6 database connection:
// Switch to external database
\Drupal\Core\Database\Database::setActiveConnection('external');
// Get a connection going
$db = \Drupal\Core\Database\Database::getConnection();
Database Query to fetch locations from Drupal 6 database:
// Query to fetch all locations
$query = $db->select('location', 'l');
$query->join('location_instance', 'li', 'l.lid = li.lid');
$query->fields('l', array('name', 'street', 'additional', 'city', 'province', 'postal_code', 'country', 'latitude', 'longitude'));
$query->fields('li', array('nid', 'vid'));
$location = $query->execute()->fetchAll();
Switch back to Drupal 8 database connection:
// Switch back
\Drupal\Core\Database\Database::setActiveConnection();
Code to update locations in Drupal 8 database:
// Query to import locations
$last_location = count($location);
foreach ($location as $key => $value) {
// UK code is changed to GB in Drupal 8
if ($value->country == 'uk') {
$value->country = 'GB';
}
$node = node_load($value->nid);
db_merge('node__field_location')
->key(array('entity_id' => $value->nid))
->fields(array(
'bundle' => $node->getType(),
'deleted' => '0',
'entity_id' => $value->nid,
'revision_id' => $value->vid,
'langcode' => 'en',
'delta' => '0',
'field_location_address_line1' => $value->name,
'field_location_address_line2' => $value->street,
'field_location_locality' => $value->city,
'field_location_postal_code' => $value->postal_code,
'field_location_country_code' => strtoupper($value->country),
))
->execute();
db_merge('node_revision__field_location')
->key(array('entity_id' => $value->nid))
->fields(array(
'bundle' => $node->getType(),
'deleted' => '0',
'entity_id' => $value->nid,
'revision_id' => $value->vid,
'langcode' => 'en',
'delta' => '0',
'field_location_address_line1' => $value->name,
'field_location_address_line2' => $value->street,
'field_location_locality' => $value->city,
'field_location_postal_code' => $value->postal_code,
'field_location_country_code' => strtoupper($value->country),
))
->execute();
// Show a message on screen once all the locations are updated.
if ($key == ($last_location - 1)) {
drupal_set_message('Migrated locations');
}
}
Note: I had same nids on drupal 6 & drupal 8 site as i used drupal 8 core migration.
4. Run Cron to import all locations.
Here is the full code written in hook_cron():
function MODULENAME_cron() {
// Switch to external database
\Drupal\Core\Database\Database::setActiveConnection('external');
// Get a connection going
$db = \Drupal\Core\Database\Database::getConnection();
// Query to fetch all locations
$query = $db->select('location', 'l');
$query->join('location_instance', 'li', 'l.lid = li.lid');
$query->fields('l', array('name', 'street', 'additional', 'city', 'province', 'postal_code', 'country', 'latitude', 'longitude'));
$query->fields('li', array('nid', 'vid'));
$location = $query->execute()->fetchAll();
// Switch back
\Drupal\Core\Database\Database::setActiveConnection();
// Query to import locations
$last_location = count($location);
foreach ($location as $key => $value) {
// UK code is changed to GB in Drupal 8
if ($value->country == 'uk') {
$value->country = 'GB';
}
$node = node_load($value->nid);
db_merge('node__field_location')
->key(array('entity_id' => $value->nid))
->fields(array(
'bundle' => $node->getType(),
'deleted' => '0',
'entity_id' => $value->nid,
'revision_id' => $value->vid,
'langcode' => 'en',
'delta' => '0',
'field_location_address_line1' => $value->name,
'field_location_address_line2' => $value->street,
'field_location_locality' => $value->city,
'field_location_postal_code' => $value->postal_code,
'field_location_country_code' => strtoupper($value->country),
))
->execute();
db_merge('node_revision__field_location')
->key(array('entity_id' => $value->nid))
->fields(array(
'bundle' => $node->getType(),
'deleted' => '0',
'entity_id' => $value->nid,
'revision_id' => $value->vid,
'langcode' => 'en',
'delta' => '0',
'field_location_address_line1' => $value->name,
'field_location_address_line2' => $value->street,
'field_location_locality' => $value->city,
'field_location_postal_code' => $value->postal_code,
'field_location_country_code' => strtoupper($value->country),
))
->execute();
// Show a message on screen once all the locations are updated.
if ($key == ($last_location - 1)) {
drupal_set_message('Migrated locations');
}
}
}
Hope this code helps you to make things work..!!! Need more assistance regarding web development service...!
About Drupal Sun
Drupal Sun is an Evolving Web project. It allows you to:
- Do full-text search on all the articles in Drupal Planet (thanks to Apache Solr)
- Facet based on tags, author, or feed
- Flip through articles quickly (with j/k or arrow keys) to find what you're interested in
- View the entire article text inline, or in the context of the site where it was created
See the blog post at Evolving Web