231 lines
8.0 KiB
PHP
231 lines
8.0 KiB
PHP
<?php
|
|
|
|
namespace Drupal\materio_migrate\Plugin\migrate\source;
|
|
|
|
use Drupal\migrate\Row;
|
|
use Drupal\migrate_drupal\Plugin\migrate\source\d7\FieldableEntity;
|
|
use Symfony\Component\DependencyInjection\ContainerInterface;
|
|
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
|
|
use Drupal\migrate\Plugin\MigrationInterface;
|
|
use Drupal\Core\State\StateInterface;
|
|
use Drupal\Core\Entity\EntityManagerInterface;
|
|
use Drupal\Core\Locale\CountryManagerInterface;
|
|
use libphonenumber\PhoneNumber;
|
|
use libphonenumber\PhoneNumberUtil;
|
|
use libphonenumber\PhoneNumberFormat;
|
|
|
|
/**
|
|
* Taxonomy term source from database.
|
|
*
|
|
* @MigrateSource(
|
|
* id = "d7_taxonomy_term_company",
|
|
* source_module = "taxonomy"
|
|
* )
|
|
*/
|
|
class D7TaxonomyTermCompany extends FieldableEntity implements ContainerFactoryPluginInterface{
|
|
|
|
/**
|
|
* Phone Number util.
|
|
*
|
|
* @var \libphonenumber\PhoneNumberUtil
|
|
*/
|
|
public $phoneUtils;
|
|
|
|
/**
|
|
* Country Manager service.
|
|
*
|
|
* @var \Drupal\Core\Locale\CountryManagerInterface
|
|
*/
|
|
public $countryManager;
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, StateInterface $state, EntityManagerInterface $entity_manager, CountryManagerInterface $country_manager) {
|
|
parent::__construct($configuration, $plugin_id, $plugin_definition, $migration, $state, $entity_manager);
|
|
$this->phoneUtils = PhoneNumberUtil::getInstance();
|
|
$this->countryManager = $country_manager;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) {
|
|
return new static(
|
|
$configuration,
|
|
$plugin_id,
|
|
$plugin_definition,
|
|
$migration,
|
|
$container->get('state'),
|
|
$container->get('entity.manager'),
|
|
$container->get('country_manager')
|
|
);
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function query() {
|
|
$query = $this->select('taxonomy_term_data', 'td')
|
|
->fields('td')
|
|
->orderBy('tid');
|
|
|
|
$query->leftJoin('taxonomy_vocabulary', 'tv', 'td.vid = tv.vid');
|
|
$query->addField('tv', 'machine_name');
|
|
|
|
if (isset($this->configuration['bundle'])) {
|
|
$query->condition('tv.machine_name', (array) $this->configuration['bundle'], 'IN');
|
|
}
|
|
|
|
return $query;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function fields() {
|
|
$fields = [
|
|
'tid' => $this->t('The term ID.'),
|
|
'vid' => $this->t('Existing term VID'),
|
|
'machine_name' => $this->t('Vocabulary machine name'),
|
|
'name' => $this->t('The name of the term.'),
|
|
'description' => $this->t('The term description.'),
|
|
'weight' => $this->t('Weight'),
|
|
'parent' => $this->t("The Drupal term IDs of the term's parents."),
|
|
'format' => $this->t("Format of the term description."),
|
|
'revision_id' => $this->t('Revision ID'),
|
|
'language' => $this->t('Term translation language'),
|
|
'source' => $this->t('Term translation source language'),
|
|
'public_phone' => $this->t('Public phone converted to new format (with libphonenumber)')
|
|
];
|
|
return $fields;
|
|
}
|
|
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function prepareRow(Row $row) {
|
|
$language = $row->getSourceProperty('language');
|
|
$tid = $row->getSourceProperty('tid');
|
|
// drush_print('-- '.$language."\t".$tid."\t".$row->getSourceProperty('name'));
|
|
|
|
// vocabulary machine name
|
|
$machine_name = $row->getSourceProperty('machine_name');
|
|
$revid = $row->getSourceProperty('revision_id');
|
|
|
|
// Get Field API field values.
|
|
foreach ($this->getFields('taxonomy_term', $machine_name) as $field_name => $field) {
|
|
// Ensure we're using the right language if the entity is translatable.
|
|
$field_language = $field['translatable'] ? $language : NULL;
|
|
$row->setSourceProperty($field_name, $this->getFieldValues('taxonomy_term', $field_name, $tid, $revid, $field_language));
|
|
}
|
|
|
|
// Find parents for this row.
|
|
$parents = $this->select('taxonomy_term_hierarchy', 'th')
|
|
->fields('th', ['parent', 'tid'])
|
|
->condition('tid', $row->getSourceProperty('tid'))
|
|
->execute()
|
|
->fetchCol();
|
|
$row->setSourceProperty('parent', $parents);
|
|
|
|
// If the node title was replaced by a real field using the Drupal 7 Title
|
|
// module, use the field value instead of the node title.
|
|
if ($this->moduleExists('title')) {
|
|
$name_field = $row->getSourceProperty('name_field');
|
|
if (isset($name_field[0]['value'])) {
|
|
$row->setSourceProperty('name', $name_field[0]['value']);
|
|
}
|
|
}
|
|
|
|
// get the tode nid
|
|
$tode_nid = $this->select('field_data_field_tode_company', 'tode')
|
|
->condition('entity_type', 'node')
|
|
->condition('field_tode_company_tid', $tid)
|
|
->fields('tode', ['entity_id'])
|
|
->execute()->fetchField();
|
|
// drush_print('tode_nid: '.$tode_nid);
|
|
|
|
// drush_print('tode_nid: ');
|
|
// print_r($tode_nid);
|
|
// drush_print(' ');
|
|
// TODO: [error] Drupal\Core\Entity\EntityStorageException: Route "entity.workflow_state.canonical" does not exist. in Drupal\Core\Entity\Sql\SqlContentEntityStorage->save() (line 846 of /var/www/html/d8.materio.com/public_html/web/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php).
|
|
|
|
if($tode_nid){
|
|
// get the tode fields
|
|
foreach ($this->getFields('node', 'company') as $field_name => $field) {
|
|
// Ensure we're using the right language if the entity is translatable.
|
|
$field_language = $field['translatable'] ? $language : NULL;
|
|
$field_values = $this->getFieldValues('node', $field_name, $tode_nid, null, $field_language);
|
|
|
|
$row->setSourceProperty($field_name, $field_values);
|
|
}
|
|
|
|
// make sure that field_website url is absolute
|
|
$field_website = $row->getSourceProperty('field_website');
|
|
if(isset($field_website[0]['url'])){
|
|
$url = $field_website[0]['url'];
|
|
if(!strpos($url, 'http://')){
|
|
$field_website[0]['url'] = 'http://'.$url;
|
|
$row->setSourceProperty('field_website', $field_website);
|
|
}
|
|
}
|
|
|
|
// convert phone field with libphonenumber
|
|
$field_phone = $row->getSourceProperty('field_public_phone');
|
|
if(isset($field_phone[0]['number']) && !empty($field_phone[0]['number'])){
|
|
$national_number = $field_phone[0]['number'];
|
|
$region = strtoupper($field_phone[0]['country_codes']);
|
|
// isValidRegionCode($regionCode)
|
|
if($this->phoneUtils->isPossibleNumber($national_number, $region)){
|
|
$number = $this->phoneUtils->parse($national_number, $region);
|
|
$row->setSourceProperty('public_phone', $this->phoneUtils->format($number, PhoneNumberFormat::E164));
|
|
}else{
|
|
// add bad phone number to memo field
|
|
$memo .= "#migration : invalid phone number: ".$national_number.' region: '.$region."\n";
|
|
drush_print('WARNING: phone number invalide; number: '.$national_number.' region: '.$region);
|
|
}
|
|
}
|
|
|
|
// TODO: attachment files
|
|
// no needs as there is no attachment field used for companies
|
|
|
|
// workflow
|
|
$query = $this->select('workflow_node', 'wn');
|
|
$query->fields('wn', ['sid']);
|
|
$query->condition('wn.nid', $tode_nid);
|
|
$results = $query->execute()->fetchField();
|
|
if(!$results){
|
|
$results = 2;
|
|
// add bad workflow to memo field
|
|
$memo .= "#migration : invalid workflow\n";
|
|
drush_print('WARNING: no workflow');
|
|
}
|
|
$row->setSourceProperty('workflow', $results);
|
|
|
|
}else{
|
|
// if no tode set workflow to hidden
|
|
$row->setSourceProperty('workflow', 2);
|
|
$memo .= "#migration : missing data from tode\n";
|
|
drush_print('WARNING: no tode');
|
|
}
|
|
// record migration errors in field_memo
|
|
if(isset($memo)){
|
|
$field_memo = $row->getSourceProperty('field_memo');
|
|
$field_memo[0]['value'] .= "\n".$memo;
|
|
$row->setSourceProperty('field_memo', $field_memo);
|
|
}
|
|
|
|
return parent::prepareRow($row);
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function getIds() {
|
|
$ids['tid']['type'] = 'integer';
|
|
return $ids;
|
|
}
|
|
|
|
}
|