From 97a151aff5c3645a330359be7cd967f0ab3983e3 Mon Sep 17 00:00:00 2001 From: Sami Mokaddem Date: Thu, 16 Feb 2023 13:35:38 +0100 Subject: [PATCH] new: [metaTemplate:metaFieldMigration] Added support of force migrate Remove conflicting meta-fields and migrate non-conflicting ones --- src/Controller/MetaTemplatesController.php | 4 +- src/Model/Table/MetaTemplatesTable.php | 24 +++++-- .../migrate_metafields_to_newest_template.php | 64 ++++++++++++++++--- 3 files changed, 76 insertions(+), 16 deletions(-) diff --git a/src/Controller/MetaTemplatesController.php b/src/Controller/MetaTemplatesController.php index 4328961..0c59120 100644 --- a/src/Controller/MetaTemplatesController.php +++ b/src/Controller/MetaTemplatesController.php @@ -247,7 +247,7 @@ class MetaTemplatesController extends AppController $this->set('movedMetaTemplateFields', $movedMetaTemplateFields); } - public function migrateMetafieldsToNewestTemplate(int $template_id) + public function migrateMetafieldsToNewestTemplate(int $template_id, $forceMigration=false) { $oldMetaTemplate = $this->MetaTemplates->find()->where([ 'id' => $template_id @@ -262,7 +262,7 @@ class MetaTemplatesController extends AppController } if ($this->request->is('post')) { - $result = $this->MetaTemplates->migrateMetafieldsToNewestTemplate($oldMetaTemplate, $newestMetaTemplate); + $result = $this->MetaTemplates->migrateMetafieldsToNewestTemplate($oldMetaTemplate, $newestMetaTemplate, !empty($forceMigration)); if ($this->ParamHandler->isRest()) { return $this->RestResponse->viewData($result, 'json'); } else { diff --git a/src/Model/Table/MetaTemplatesTable.php b/src/Model/Table/MetaTemplatesTable.php index 40a2a1b..815ac07 100644 --- a/src/Model/Table/MetaTemplatesTable.php +++ b/src/Model/Table/MetaTemplatesTable.php @@ -937,7 +937,7 @@ class MetaTemplatesTable extends AppTable return true; } - public function migrateMetafieldsToNewestTemplate(\App\Model\Entity\MetaTemplate $oldMetaTemplate, \App\Model\Entity\MetaTemplate $newestMetaTemplate): array + public function migrateMetafieldsToNewestTemplate(\App\Model\Entity\MetaTemplate $oldMetaTemplate, \App\Model\Entity\MetaTemplate $newestMetaTemplate, bool $forceMigration): array { $result = [ 'success' => true, @@ -958,14 +958,26 @@ class MetaTemplatesTable extends AppTable $conflicts = $this->getMetaFieldsConflictsUnderTemplate($entity->meta_fields, $newestMetaTemplate); if (!empty($conflicts)) { $conflictingEntities[] = $entity->id; - } else { - $success = $this->supersedeMetaFieldsWithMetaTemplateField($entity->meta_fields, $newestMetaTemplate); - if ($success) { - $successfullyMigratedEntities += 1; + if (!$forceMigration) { + continue; } else { - $migrationErrors += 1; + $conflictingMetafieldIDs = Hash::extract($conflicts, '{n}.id'); + $metaFieldsToDelete = []; + foreach ($entity->meta_fields as $i => $metaField) { + if (in_array($metaField->id, $conflictingMetafieldIDs)) { + $metaFieldsToDelete[] = $metaField; + unset($entity->meta_fields[$i]); + } + } + $this->MetaTemplateFields->MetaFields->unlink($entity, $metaFieldsToDelete); // FIXME } } + $success = $this->supersedeMetaFieldsWithMetaTemplateField($entity->meta_fields, $newestMetaTemplate); + if ($success) { + $successfullyMigratedEntities += 1; + } else { + $migrationErrors += 1; + } } $result['success'] = $migrationErrors == 0; diff --git a/templates/MetaTemplates/migrate_metafields_to_newest_template.php b/templates/MetaTemplates/migrate_metafields_to_newest_template.php index bf25363..2eb0bd7 100644 --- a/templates/MetaTemplates/migrate_metafields_to_newest_template.php +++ b/templates/MetaTemplates/migrate_metafields_to_newest_template.php @@ -14,8 +14,6 @@ $bodyHtml .= sprintf('
%s: %s%s: %s
', __('Newest version'), $urlNewestMetaTemplate, h($newestMetaTemplate->version)); $bodyHtml .= sprintf('

%s

', __('{0} Entities with meta-fields for the meta-template version {1}', h($entityCount), h($oldMetaTemplate->version))); -// debug($conflictingEntities); - if (empty($conflictingEntities)) { $bodyHtml .= $this->Bootstrap->alert([ 'text' => __('All entities can updated automatically', count($conflictingEntities)), @@ -65,6 +63,19 @@ $form = sprintf( $this->Form->end() ); $bodyHtml .= $form; +$form = sprintf( + '
%s%s
', + $this->Form->create(null, [ + 'url' => [ + 'controller' => 'MetaTemplates', + 'action' => 'migrateMetafieldsToNewestTemplate', + $oldMetaTemplate->id, + 1, + ] + ]), + $this->Form->end() +); +$bodyHtml .= $form; $title = __('{0} has a new meta-template and meta-fields to be updated', sprintf('%s', h($oldMetaTemplate->name))); if (!empty($ajax)) { @@ -72,16 +83,35 @@ if (!empty($ajax)) { 'titleHtml' => $title, 'bodyHtml' => $bodyHtml, 'size' => 'lg', - 'type' => 'confirm', - 'confirmButton' => [ - 'text' => __('Migrate meta-fields'), - 'variant' => 'success', + 'type' => 'custom', + 'footerButtons' => [ + [ + 'text' => __('Cancel'), + 'variant' => 'secondary', + ], + [ + 'text' => __('Force Migrate meta-fields'), + 'title' => __('Any meta-field having conflict will be deleted.'), + 'variant' => 'danger', + 'clickFunction' => 'forceMigrateMetafieldsToNewestTemplate', + ], + [ + 'text' => __('Migrate meta-fields'), + 'variant' => 'success', + 'clickFunction' => 'migrateMetafieldsToNewestTemplate', + ], ], - 'confirmFunction' => 'migrateMetafieldsToNewestTemplate', ]); } else { echo $this->Bootstrap->node('h1', [], $title); echo $bodyHtml; + echo $this->Bootstrap->button([ + 'text' => __('Force Migrate meta-fields'), + 'title' => __('Any meta-field having conflict will be deleted.'), + 'variant' => 'danger', + 'class' => ['me-2'], + 'onclick' => '$(".hidden-form-force-container form").submit()', + ]); echo $this->Bootstrap->button([ 'text' => __('Migrate meta-fields'), 'variant' => 'success', @@ -92,7 +122,25 @@ if (!empty($ajax)) {