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();
+ }
+}