From 6edb82755b0acffce90229b51c44bdc72d09dc0c Mon Sep 17 00:00:00 2001 From: bach Date: Thu, 15 Apr 2021 23:21:04 +0200 Subject: [PATCH] popsu_migrate: d7_node_programme title, text intro, paragraphe texts, files OK --- ...grate_plus.migration.d7_node_programme.yml | 36 +++- ...igration.d7_paragraphe_texts_programme.yml | 38 ++++ .../Plugin/migrate/source/D7NodeProgramme.php | 121 +++++++++++- .../source/D7PargrapheTextsProgramme.php | 172 ++++++++++++++++++ 4 files changed, 360 insertions(+), 7 deletions(-) create mode 100644 web/modules/custom/popsu_migrate/config/install/migrate_plus.migration.d7_paragraphe_texts_programme.yml create mode 100644 web/modules/custom/popsu_migrate/src/Plugin/migrate/source/D7PargrapheTextsProgramme.php diff --git a/web/modules/custom/popsu_migrate/config/install/migrate_plus.migration.d7_node_programme.yml b/web/modules/custom/popsu_migrate/config/install/migrate_plus.migration.d7_node_programme.yml index fc75e9be..c1733fa5 100644 --- a/web/modules/custom/popsu_migrate/config/install/migrate_plus.migration.d7_node_programme.yml +++ b/web/modules/custom/popsu_migrate/config/install/migrate_plus.migration.d7_node_programme.yml @@ -39,12 +39,40 @@ process: plugin: default_value default_value: 'wysiwyg' - # field_textes (PARAGRAPH) - # 'field_texte/value': text - # 'field_texte/summary': text_summary - # field_titre: title + # https://understanddrupal.com/articles/introduction-paragraphs-migrations-drupal + pseudo_field_textes: + plugin: migration_lookup + migration: d7_paragraphe_texts_programme + source: text_paragraphe_id + field_textes: + plugin: sub_process + source: + - '@pseudo_field_textes' + process: + target_id: '0' + target_revision_id: '1' + + # field_popsu_special_insert_intro + # field_popsu_special_insert + # field_fichier: + # plugin: migration_lookup + # migration: d7_allpublicfiles + # source: fichiers + + field_fichier: + plugin: sub_process + source: fichiers + process: + target_id: + plugin: migration_lookup + migration: d7_allpublicfiles + source: fid + no_stub: true + display: display + description: description migration_dependencies: required: - d7_allpublicfiles - d7_users + - d7_paragraphe_texts_programme diff --git a/web/modules/custom/popsu_migrate/config/install/migrate_plus.migration.d7_paragraphe_texts_programme.yml b/web/modules/custom/popsu_migrate/config/install/migrate_plus.migration.d7_paragraphe_texts_programme.yml new file mode 100644 index 00000000..ed3ab168 --- /dev/null +++ b/web/modules/custom/popsu_migrate/config/install/migrate_plus.migration.d7_paragraphe_texts_programme.yml @@ -0,0 +1,38 @@ +id: d7_paragraphe_texts_programme +label: Paragraphe texts Programme +migration_group: popsu +audit: true +migration_tags: + - Drupal 7 + - Content + - Popsu + +source: + plugin: d7_paragraphe_texts_programme + node_type: popsu_special + batch_size: 500 + ids: + nid: + type: integer + +destination: + plugin: 'entity_reference_revisions:paragraph' + default_bundle: textes + +process: + # created: created + # changed: changed + + uid: + plugin: default_value + default_value: 34 + + 'field_texte/value': text + 'field_texte/summary': text_summary + + field_titre: title + +migration_dependencies: + required: + - d7_allpublicfiles + - d7_users diff --git a/web/modules/custom/popsu_migrate/src/Plugin/migrate/source/D7NodeProgramme.php b/web/modules/custom/popsu_migrate/src/Plugin/migrate/source/D7NodeProgramme.php index b5fe6675..6a2ad0c1 100644 --- a/web/modules/custom/popsu_migrate/src/Plugin/migrate/source/D7NodeProgramme.php +++ b/web/modules/custom/popsu_migrate/src/Plugin/migrate/source/D7NodeProgramme.php @@ -100,7 +100,7 @@ class D7NodeProgramme extends FieldableEntity { $query->condition('n.type', $this->configuration['node_type']); } - // field_popsu_special_typetaxo 31 + // field_popsu_special_typetaxo 31 (Acueile) $query->leftJoin('field_revision_field_popsu_special_typetaxo', 'ff', 'ff.revision_id = n.vid'); $query->fields('ff', [ 'field_popsu_special_typetaxo_tid' @@ -130,12 +130,12 @@ class D7NodeProgramme extends FieldableEntity { // title from taxo term $field_popsu_special_popsu_tid = $row->getSourceProperty('field_popsu_special_popsu')[0]['tid']; - Drush::output()->writeln('tid:' . $field_popsu_special_popsu_tid); + // Drush::output()->writeln('tid:' . $field_popsu_special_popsu_tid); $q = $this->select('taxonomy_term_data', 'ttd') ->fields('ttd', ['tid','name']) ->condition('tid', $field_popsu_special_popsu_tid); $term = $q->execute()->fetchAll(); - Drush::output()->writeln(dump($term)); + // Drush::output()->writeln(dump($term)); $row->setSourceProperty('term_title', $term[0]['name']); // text intro @@ -144,10 +144,56 @@ class D7NodeProgramme extends FieldableEntity { $row->setSourceProperty('body_summary', $body[0]['summary']); // texts + $row->setSourceProperty('text_paragraphe_id', $nid); // $text = $row->getSourceProperty('field_popsu_special_text') // $row->setSourceProperty('text', $text[0]['value']); // $row->setSourceProperty('text_summary', $text[0]['summary']); + // // colloques + // $colloques = $this->getAssociatedSpecial(28, $field_popsu_special_popsu_tid); + // Drush::output()->writeln(dump($colloques)); + // + // // Publications + // $publications = $this->getAssociatedSpecial(29, $field_popsu_special_popsu_tid); + // Drush::output()->writeln(dump($publications)); + // + // // Partenaires + // $partenaires = $this->getAssociatedSpecial(30, $field_popsu_special_popsu_tid); + // Drush::output()->writeln(dump($partenaires)); + + // associateds + $associateds = $this->getAssociatedSpecial($field_popsu_special_popsu_tid); + Drush::output()->writeln(dump($associateds)); + + // fichiers + # field_popsu_special_insert_intro + # field_popsu_special_insert + $fichiers = array(); + foreach ($row->getSourceProperty('field_popsu_special_insert') as $value) { + $fichiers[] = $value; + } + foreach ($row->getSourceProperty('field_popsu_special_insert_intro') as $value) { + $fichiers[] = $value; + } + // files from associated nodes (colloques, publications, partenaires) + foreach ( ['colloques', 'publications'] as $name) { + foreach ($associateds[$name] as $key => $asso) { + foreach ($asso['field_popsu_special_insert'] as $value) { + $fichiers[] = $value; + } + foreach ($asso['field_popsu_special_insert_intro'] as $value) { + $fichiers[] = $value; + } + // tried with array merge but it failed + // and foreach is faster than array_merge + // array_merge( + // $fichiers, + // $asso['field_popsu_special_insert_intro'], + // $asso['field_popsu_special_insert'] + // ); + } + } + $row->setSourceProperty('fichiers', $fichiers); return parent::prepareRow($row); } @@ -184,4 +230,73 @@ class D7NodeProgramme extends FieldableEntity { return $ids; } + private function getAssociatedSpecial($filter_tid) { + $asso_tids = array( + "colloques" => 28, + "publications" => 29, + "partenaires" => 30 + ); + + $associateds = array(); + + foreach ($asso_tids as $name => $type_tid) { + + $query = $this->select('node_revision', 'nr') + ->fields('n', [ + 'nid', + 'type', + 'uid', + 'language', + 'status', + 'created', + 'changed', + ]) + ->fields('nr', [ + 'vid', + 'title', + 'log', + 'timestamp', + ]) + ->orderBy('changed'); + + $query->addField('n', 'uid', 'node_uid'); + $query->addField('nr', 'uid', 'revision_uid'); + $query->innerJoin('node', 'n', static::JOIN); + + if (isset($this->configuration['node_type'])) { + $query->condition('n.type', $this->configuration['node_type']); + } + + // field_popsu_special_typetaxo + // filter to get the right special type (colloques, publication, etc) + $query->leftJoin('field_revision_field_popsu_special_typetaxo', 'ff', 'ff.revision_id = n.vid'); + $query->fields('ff', [ + 'field_popsu_special_typetaxo_tid' + ]); + $query->condition('ff.field_popsu_special_typetaxo_tid', $type_tid); + + // field_popsu_special_popsu + // filter to get right popsu (popsu 1, popsu europe, etc) + $query->leftJoin('field_revision_field_popsu_special_popsu', 'sp', 'sp.revision_id = n.vid'); + $query->fields('sp', [ + 'field_popsu_special_popsu_tid' + ]); + $query->condition('sp.field_popsu_special_popsu_tid', $filter_tid); + + $assos = $query->execute()->fetchAll(); + // get the fields + foreach ($assos as $key => $asso) { + // Get Field API field values. + foreach ($this->getFields('node', $asso['type']) as $field_name => $field) { + $assos[$key][$field_name] = $this->getFieldValues('node', $field_name, $asso['nid'], $asso['vid'], NULL); + } + } + if (count($assos)) { + // $associateds[$name] = array(); + $associateds[$name] = $assos; + } + } + return $associateds; + } + } diff --git a/web/modules/custom/popsu_migrate/src/Plugin/migrate/source/D7PargrapheTextsProgramme.php b/web/modules/custom/popsu_migrate/src/Plugin/migrate/source/D7PargrapheTextsProgramme.php new file mode 100644 index 00000000..76d81bbd --- /dev/null +++ b/web/modules/custom/popsu_migrate/src/Plugin/migrate/source/D7PargrapheTextsProgramme.php @@ -0,0 +1,172 @@ +moduleHandler = $module_handler; + $this->logger = $loggerFactory->get('popsu_migration'); + } + + /** + * {@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_type.manager'), + $container->get('module_handler'), + $container->get('logger.factory') + ); + } + + /** + * The join options between the node and the node_revisions table. + */ + const JOIN = 'n.vid = nr.vid'; + + /** + * {@inheritdoc} + */ + public function query() { + // Select node in its last revision. + $query = $this->select('node_revision', 'nr') + ->fields('n', [ + 'nid', + 'type', + 'uid', + 'language', + 'status', + 'created', + 'changed', + ]) + ->fields('nr', [ + 'vid', + 'title', + 'log', + 'timestamp', + ]) + ->orderBy('changed'); + + $query->addField('n', 'uid', 'node_uid'); + $query->addField('nr', 'uid', 'revision_uid'); + $query->innerJoin('node', 'n', static::JOIN); + + if (isset($this->configuration['node_type'])) { + $query->condition('n.type', $this->configuration['node_type']); + } + + // field_popsu_special_typetaxo 31 + $query->leftJoin('field_revision_field_popsu_special_typetaxo', 'ff', 'ff.revision_id = n.vid'); + $query->fields('ff', [ + 'field_popsu_special_typetaxo_tid' + ]); + $query->condition('ff.field_popsu_special_typetaxo_tid', 31); + + return $query; + } + + /** + * {@inheritdoc} + */ + public function prepareRow(Row $row) { + $nid = $row->getSourceProperty('nid'); + $vid = $row->getSourceProperty('vid'); + $type = $row->getSourceProperty('type'); + // $title = $row->getSourceProperty('title'); + // drush_print('-- '.$nid."\t".$title); + + // Get Field API field values. + foreach ($this->getFields('node', $type) as $field_name => $field) { + // Ensure we're using the right language if the entity and the field are + // translatable. + // $field_language = $entity_translatable && $field['translatable'] ? $language : NULL; + $row->setSourceProperty($field_name, $this->getFieldValues('node', $field_name, $nid, $vid, NULL)); + } + + // texts + $text = $row->getSourceProperty('field_popsu_special_text'); + $row->setSourceProperty('text', $text[0]['value']); + $row->setSourceProperty('text_summary', $text[0]['summary']); + + + return parent::prepareRow($row); + } + + /** + * {@inheritdoc} + */ + public function fields() { + $fields = [ + 'nid' => $this->t('Node ID'), + 'type' => $this->t('Type'), + 'title' => $this->t('Title'), + 'node_uid' => $this->t('Node authored by (uid)'), + 'revision_uid' => $this->t('Revision authored by (uid)'), + 'created' => $this->t('Created timestamp'), + 'changed' => $this->t('Modified timestamp'), + 'status' => $this->t('Published'), + 'promote' => $this->t('Promoted to front page'), + 'sticky' => $this->t('Sticky at top of lists'), + 'revision' => $this->t('Create new revision'), + 'language' => $this->t('Language (fr, en, ...)'), + 'tnid' => $this->t('The translation set id for this node'), + 'timestamp' => $this->t('The timestamp the latest revision of this node was created.'), + ]; + return $fields; + } + + /** + * {@inheritdoc} + */ + public function getIds() { + $ids['nid']['type'] = 'integer'; + $ids['nid']['alias'] = 'n'; + return $ids; + } + +}