diff --git a/composer.json b/composer.json index 5cdc67f9..2be7d369 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,10 @@ "drupal/migrate_tools": "^4.0", "drupal/config_devel": "^1.2", "drupal/examples": "1.x-dev", - "drupal/synonyms": "1.x-dev" + "drupal/synonyms": "1.x-dev", + "drupal/address": "^1.4", + "drupal/telephone_validation": "^2.1", + "drupal/telephone_formatter": "^1.0@beta" }, "replace": { "drupal/core": "^8.6" diff --git a/composer.lock b/composer.lock index b570a9d6..f709f3e4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6d95526da61b6311251b823859c3edcc", + "content-hash": "108796aaf8d4f0d21b1f86729a2b07b8", "packages": [ { "name": "alchemy/zippy", @@ -167,6 +167,65 @@ "description": "Drupal code generator", "time": "2018-10-11T08:05:59+00:00" }, + { + "name": "commerceguys/addressing", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/commerceguys/addressing.git", + "reference": "f23ce2596ccfb47bcdaa9d14fbf9b4f699dc3d4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/commerceguys/addressing/zipball/f23ce2596ccfb47bcdaa9d14fbf9b4f699dc3d4b", + "reference": "f23ce2596ccfb47bcdaa9d14fbf9b4f699dc3d4b", + "shasum": "" + }, + "require": { + "doctrine/collections": "~1.0", + "php": ">=5.5.0" + }, + "require-dev": { + "mikey179/vfsstream": "1.*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "2.*", + "symfony/validator": ">=3.2" + }, + "suggest": { + "symfony/validator": "to validate addresses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "CommerceGuys\\Addressing\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bojan Zivanovic" + }, + { + "name": "Damien Tournoud" + } + ], + "description": "Addressing library powered by CLDR and Google's address data.", + "keywords": [ + "address", + "internationalization", + "localization", + "postal" + ], + "time": "2018-10-21T23:38:05+00:00" + }, { "name": "composer/installers", "version": "v1.6.0", @@ -1478,6 +1537,65 @@ "source": "http://cgit.drupalcode.org/views_bulk_operations" } }, + { + "name": "drupal/address", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://git.drupal.org/project/address", + "reference": "8.x-1.4" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/address-8.x-1.4.zip", + "reference": "8.x-1.4", + "shasum": "143e426be73418c719c6bddd5fb81c610604e860" + }, + "require": { + "commerceguys/addressing": "^1.0.0", + "drupal/core": "*" + }, + "require-dev": { + "drupal/token": "*" + }, + "type": "drupal-module", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + }, + "drupal": { + "version": "8.x-1.4", + "datestamp": "1527081784", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "bojanz", + "homepage": "https://www.drupal.org/user/86106" + }, + { + "name": "googletorp", + "homepage": "https://www.drupal.org/user/386230" + }, + { + "name": "rszrama", + "homepage": "https://www.drupal.org/user/49344" + } + ], + "description": "Provides functionality for storing, validating and displaying international postal addresses.", + "homepage": "http://drupal.org/project/address", + "support": { + "source": "http://cgit.drupalcode.org/address" + } + }, { "name": "drupal/admin_toolbar", "version": "1.24.0", @@ -5837,6 +5955,109 @@ }, "time": "2018-10-21T17:05:25+00:00" }, + { + "name": "drupal/telephone_formatter", + "version": "1.0.0-beta1", + "source": { + "type": "git", + "url": "https://git.drupal.org/project/telephone_formatter", + "reference": "8.x-1.0-beta1" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/telephone_formatter-8.x-1.0-beta1.zip", + "reference": "8.x-1.0-beta1", + "shasum": "6d606d98840d983ace3f642879cb49683f2c1711" + }, + "require": { + "drupal/core": "*", + "giggsey/libphonenumber-for-php": "^8.0" + }, + "suggest": { + "drupal/telephone_validation": "Unsure data quality" + }, + "type": "drupal-module", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + }, + "drupal": { + "version": "8.x-1.0-beta1", + "datestamp": "1492638542", + "security-coverage": { + "status": "not-covered", + "message": "Beta releases are not covered by Drupal security advisories." + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "Jakub Piasecki", + "homepage": "https://www.drupal.org/user/1532844", + "email": "jakub@piaseccy.pl" + } + ], + "description": "Additional formatters to Telephone field.", + "homepage": "https://www.drupal.org/project/telephone_formatter", + "support": { + "source": "http://cgit.drupalcode.org/telephone_formatter", + "issues": "http://drupal.org/project/issues/telephone_formatter" + } + }, + { + "name": "drupal/telephone_validation", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://git.drupal.org/project/telephone_validation", + "reference": "8.x-2.1" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/telephone_validation-8.x-2.1.zip", + "reference": "8.x-2.1", + "shasum": "fcdb0c3c5541b06e6dd469a7aacefd2d0a891b74" + }, + "require": { + "drupal/core": "^8.0", + "drupal/telephone": "*", + "giggsey/libphonenumber-for-php": "~8.0" + }, + "type": "drupal-module", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + }, + "drupal": { + "version": "8.x-2.1", + "datestamp": "1527165785", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "zaporylie", + "homepage": "https://www.drupal.org/user/1532844" + } + ], + "description": "Use 3rd party library to validate telephone field.", + "homepage": "http://drupal.org/project/telephone_validation", + "support": { + "source": "http://cgit.drupalcode.org/telephone_validation", + "issues": "http://drupal.org/project/issues/telephone_validation" + } + }, { "name": "drupal/token", "version": "1.5.0", @@ -6594,6 +6815,123 @@ "description": "Useful scripts for testing multiple sets of Composer dependencies.", "time": "2018-08-08T23:37:23+00:00" }, + { + "name": "giggsey/libphonenumber-for-php", + "version": "8.10.2", + "source": { + "type": "git", + "url": "https://github.com/giggsey/libphonenumber-for-php.git", + "reference": "a71f260c2efce10ded8af030a20fa13edfb0e9be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/a71f260c2efce10ded8af030a20fa13edfb0e9be", + "reference": "a71f260c2efce10ded8af030a20fa13edfb0e9be", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "giggsey/locale": "^1.2", + "php": ">=5.3.2" + }, + "require-dev": { + "pear/pear-core-minimal": "^1.9", + "pear/pear_exception": "^1.0", + "pear/versioncontrol_git": "^0.5", + "phing/phing": "^2.7", + "php-coveralls/php-coveralls": "^1.0|^2.0", + "phpunit/phpunit": "^4.8.36|^5.0", + "symfony/console": "^2.8|^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "libphonenumber\\": "src/" + }, + "exclude-from-classmap": [ + "/src/data/", + "/src/carrier/data/", + "/src/geocoding/data/", + "/src/timezone/data/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Joshua Gigg", + "email": "giggsey@gmail.com", + "homepage": "https://giggsey.com/" + } + ], + "description": "PHP Port of Google's libphonenumber", + "homepage": "https://github.com/giggsey/libphonenumber-for-php", + "keywords": [ + "geocoding", + "geolocation", + "libphonenumber", + "mobile", + "phonenumber", + "validation" + ], + "time": "2018-12-06T10:42:08+00:00" + }, + { + "name": "giggsey/locale", + "version": "1.6", + "source": { + "type": "git", + "url": "https://github.com/giggsey/Locale.git", + "reference": "da6845720b5d104d319d7e84576f54e44dd9e4f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/giggsey/Locale/zipball/da6845720b5d104d319d7e84576f54e44dd9e4f5", + "reference": "da6845720b5d104d319d7e84576f54e44dd9e4f5", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "pear/pear-core-minimal": "^1.9", + "pear/pear_exception": "^1.0", + "pear/versioncontrol_git": "^0.5", + "phing/phing": "~2.7", + "phpunit/phpunit": "^4.8|^5.0", + "satooshi/php-coveralls": "^1.0", + "symfony/console": "^2.8|^3.0|^4.0", + "symfony/filesystem": "^2.8|^3.0|^4.0", + "symfony/finder": "^2.8|^3.0|^4.0", + "symfony/process": "^2.8|^3.0|^4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Giggsey\\Locale\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joshua Gigg", + "email": "giggsey@gmail.com", + "homepage": "http://giggsey.com/" + } + ], + "description": "Locale functions required by libphonenumber-for-php", + "time": "2018-10-18T07:17:52+00:00" + }, { "name": "grasmash/expander", "version": "1.0.0", @@ -11762,6 +12100,7 @@ "stability-flags": { "drupal/examples": 20, "drupal/synonyms": 20, + "drupal/telephone_formatter": 10, "drupal/advanced_text_formatter": 10, "drupal/autocomplete_deluxe": 10, "drupal/better_exposed_filters": 15, diff --git a/modules/custom/materio_migrate/config/install/migrate_plus.migration.d7_taxonomy_term_company.yml b/modules/custom/materio_migrate/config/install/migrate_plus.migration.d7_taxonomy_term_company.yml index 3c3349ba..a87ab225 100644 --- a/modules/custom/materio_migrate/config/install/migrate_plus.migration.d7_taxonomy_term_company.yml +++ b/modules/custom/materio_migrate/config/install/migrate_plus.migration.d7_taxonomy_term_company.yml @@ -23,8 +23,6 @@ process: plugin: default_value default_value: company name: name - 'description/value': description - 'description/format': format weight: weight # Only attempt to stub real (non-zero) parents. parent_id: @@ -34,12 +32,40 @@ process: source: parent - plugin: migration_lookup - migration: d7_taxonomy_term_company + migration: d7_taxonomy_term_companie parent: plugin: default_value default_value: 0 source: '@parent_id' - forum_container: is_container changed: timestamp - # TODO: tode node company + # FROM TODE (linked tode node) + field_website: + plugin: iterator + source: field_website + process: + uri: url + title: title + options: attributes + field_memo: field_memo + field_public_phone: public_phone + # plugin: iterator + # source: field_public_phone + # process: + # value: number + # # ??: country_codes + # # ??: extension + + + field_public_email: field_public_email + field_departement: field_departement + field_description: body + # 'description/value': description + # 'description/format': format + field_infos_from_company: field_infos_from_company + field_public_address: field_public_address + + field_note: field_note + field_attachments: field_attachments + + # workflow ?? diff --git a/modules/custom/materio_migrate/materio_migrate.info.yml b/modules/custom/materio_migrate/materio_migrate.info.yml index 26e8aa5c..500ed18f 100644 --- a/modules/custom/materio_migrate/materio_migrate.info.yml +++ b/modules/custom/materio_migrate/materio_migrate.info.yml @@ -11,6 +11,7 @@ dependencies: - migrate_plus:migrate_plus - migrate_tools:migrate_tools # - drupal:field_group_migrate + - telephone_validation config_devel: install: diff --git a/modules/custom/materio_migrate/src/Plugin/migrate/source/D7TaxonomyTermCompany.php b/modules/custom/materio_migrate/src/Plugin/migrate/source/D7TaxonomyTermCompany.php index d2168fb9..0d0880d6 100644 --- a/modules/custom/materio_migrate/src/Plugin/migrate/source/D7TaxonomyTermCompany.php +++ b/modules/custom/materio_migrate/src/Plugin/migrate/source/D7TaxonomyTermCompany.php @@ -4,6 +4,15 @@ 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. @@ -13,7 +22,45 @@ use Drupal\migrate_drupal\Plugin\migrate\source\d7\FieldableEntity; * source_module = "taxonomy" * ) */ -class D7TaxonomyTermCompany extends FieldableEntity { +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} @@ -21,8 +68,8 @@ class D7TaxonomyTermCompany extends FieldableEntity { public function query() { $query = $this->select('taxonomy_term_data', 'td') ->fields('td') - ->distinct() ->orderBy('tid'); + $query->leftJoin('taxonomy_vocabulary', 'tv', 'td.vid = tv.vid'); $query->addField('tv', 'machine_name'); @@ -46,6 +93,10 @@ class D7TaxonomyTermCompany extends FieldableEntity { '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; } @@ -55,12 +106,19 @@ class D7TaxonomyTermCompany extends FieldableEntity { * {@inheritdoc} */ public function prepareRow(Row $row) { - print("\n".'-- prepareRow -- '.$row->getSourceProperty('tid')." -- ".$row->getSourceProperty('name')."\n"); + $language = $row->getSourceProperty('language'); + $tid = $row->getSourceProperty('tid'); + drush_print('-- '.$language.' -- '.$tid." -- ".$row->getSourceProperty('name')." -- ".$row->getSourceProperty('weight')); + + // vocabulary machine name + $machine_name = $row->getSourceProperty('machine_name'); + $revid = $row->getSourceProperty('revision_id'); // Get Field API field values. - foreach (array_keys($this->getFields('taxonomy_term', $row->getSourceProperty('machine_name'))) as $field) { - $tid = $row->getSourceProperty('tid'); - $row->setSourceProperty($field, $this->getFieldValues('taxonomy_term', $field, $tid)); + 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. @@ -70,25 +128,53 @@ class D7TaxonomyTermCompany extends FieldableEntity { ->execute() ->fetchCol(); $row->setSourceProperty('parent', $parents); - // print_r($parents); - // If the term name or term description were replaced by real fields using - // the Drupal 7 Title module, use the fields value instead of the term name - // or term description. - // TODO: translations + // 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'); - // print_r($name_field); if (isset($name_field[0]['value'])) { $row->setSourceProperty('name', $name_field[0]['value']); } - $description_field = $row->getSourceProperty('description_field'); - if (isset($description_field[0]['value'])) { - $row->setSourceProperty('description', $description_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); + + // 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); + drush_print($field_name.': '); + print_r($field_values); + $row->setSourceProperty($field_name, $field_values); + } + + // make sure that feild_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); } } - // TODO: tode node company + // 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']); + $number = $this->phoneUtils->parse($national_number, $region); + $row->setSourceProperty('public_phone', $this->phoneUtils->format($number, PhoneNumberFormat::E164)); + } + return parent::prepareRow($row); }