123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- <?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;
- }
- }
|