diff --git a/composer.json b/composer.json index 9acb6b76..4a78a17a 100755 --- a/composer.json +++ b/composer.json @@ -35,7 +35,7 @@ }, "require": { "php": "^8.2", - "pimcore/pimcore": "^11.0", + "pimcore/pimcore": "^12.0", "symfony/form": "^6.4", "symfony/intl": "^6.4", "doctrine/orm": "^2.7 || ^3.0" diff --git a/config/doctrine/model/DoubleOptInSession.orm.xml b/config/doctrine/model/DoubleOptInSession.orm.xml index 102e535e..181c0447 100644 --- a/config/doctrine/model/DoubleOptInSession.orm.xml +++ b/config/doctrine/model/DoubleOptInSession.orm.xml @@ -11,7 +11,7 @@ - + diff --git a/config/doctrine/model/FormDefinition.orm.xml b/config/doctrine/model/FormDefinition.orm.xml index 387884d3..87a99ffc 100644 --- a/config/doctrine/model/FormDefinition.orm.xml +++ b/config/doctrine/model/FormDefinition.orm.xml @@ -12,8 +12,8 @@ - - + + diff --git a/config/doctrine/model/OutputWorkflow.orm.xml b/config/doctrine/model/OutputWorkflow.orm.xml index fb1cc614..6cabdab0 100644 --- a/config/doctrine/model/OutputWorkflow.orm.xml +++ b/config/doctrine/model/OutputWorkflow.orm.xml @@ -11,7 +11,7 @@ - + diff --git a/config/doctrine/model/OutputWorkflowChannel.orm.xml b/config/doctrine/model/OutputWorkflowChannel.orm.xml index 0df61746..5ad71956 100644 --- a/config/doctrine/model/OutputWorkflowChannel.orm.xml +++ b/config/doctrine/model/OutputWorkflowChannel.orm.xml @@ -11,8 +11,8 @@ - - + + diff --git a/src/Form/Type/SnippetType.php b/src/Form/Type/SnippetType.php index ad810e0e..3b642ca6 100644 --- a/src/Form/Type/SnippetType.php +++ b/src/Form/Type/SnippetType.php @@ -56,7 +56,7 @@ public function buildView(FormView $view, FormInterface $form, array $options): $view->vars = $vars; } - private function getSnippetId(array $data): ?string + private function getSnippetId(array $data): ?int { $locale = $this->requestStack->getMainRequest()->getLocale(); diff --git a/src/Migrations/Version20250911163105.php b/src/Migrations/Version20250911163105.php new file mode 100644 index 00000000..e63d3fab --- /dev/null +++ b/src/Migrations/Version20250911163105.php @@ -0,0 +1,83 @@ +connection; + + $this->migrateTable($connection, 'formbuilder_forms', ['configuration', 'conditionalLogic'], 'id'); + $this->migrateTable($connection, 'formbuilder_output_workflow', ['success_management'], 'id'); + $this->migrateTable($connection, 'formbuilder_output_workflow_channel', ['configuration', 'funnel_actions'], 'id'); + $this->migrateTable($connection, 'formbuilder_double_opt_in_session', ['additional_data'], 'token'); + + // Change column types to JSON + $this->addSql('ALTER TABLE formbuilder_forms MODIFY COLUMN configuration JSON'); + $this->addSql('ALTER TABLE formbuilder_forms MODIFY COLUMN conditionalLogic JSON'); + $this->addSql('ALTER TABLE formbuilder_output_workflow MODIFY COLUMN success_management JSON'); + $this->addSql('ALTER TABLE formbuilder_output_workflow_channel MODIFY COLUMN configuration JSON'); + $this->addSql('ALTER TABLE formbuilder_output_workflow_channel MODIFY COLUMN funnel_actions JSON'); + $this->addSql('ALTER TABLE formbuilder_double_opt_in_session MODIFY COLUMN additional_data JSON'); + } + + private function migrateTable($connection, $tableName, $columns, $primaryKey = 'id'): void + { + $columnList = implode(', ', $columns); + $conditions = array_map(fn($col) => "$col IS NOT NULL", $columns); + $whereClause = implode(' OR ', $conditions); + + $result = $connection->executeQuery("SELECT $primaryKey, $columnList FROM $tableName WHERE $whereClause"); + + while ($row = $result->fetchAssociative()) { + $updates = []; + $values = []; + + foreach ($columns as $column) { + if (!empty($row[$column])) { + $unserialized = @unserialize($row[$column]); + if ($unserialized !== false) { + $updates[] = "$column = ?"; + $values[] = json_encode($unserialized); + } elseif ($row[$column] === '[]') { + $updates[] = "$column = ?"; + $values[] = '[]'; + } elseif ($row[$column] === '{}') { + $updates[] = "$column = ?"; + $values[] = '{}'; + } + } else { + $updates[] = "$column = ?"; + $values[] = null; + } + } + + if (!empty($updates)) { + $values[] = $row[$primaryKey]; + $connection->executeStatement( + "UPDATE $tableName SET " . implode(', ', $updates) . " WHERE $primaryKey = ?", + $values + ); + } + } + } + + public function down(Schema $schema): void + { + // This migration is not reversible because we are converting serialized data to JSON + $this->throwIrreversibleMigrationException(); + } +}