<?php
declare(strict_types=1);
namespace vonRotenberg\MemberfilesBundle\Migration;
use Contao\CoreBundle\Migration\AbstractMigration;
use Contao\CoreBundle\Migration\MigrationResult;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Schema\Schema;
class MemberfilesConfigMigration extends AbstractMigration
{
private Connection $connection;
public function __construct(Connection $connection)
{
$this->connection = $connection;
}
public function shouldRun(): bool
{
$schemaManager = $this->connection->createSchemaManager();
// Prüfen ob die Quelltabelle existiert
if (!$schemaManager->tablesExist(['tl_page'])) {
return false;
}
// Prüfen ob die notwendige Spalte in tl_page existiert
$columns = $schemaManager->listTableColumns('tl_page');
if (!isset($columns['securedownloadsenabled'])) {
return false;
}
// Prüfen ob es Einträge gibt, die migriert werden müssen
$result = $this->connection->fetchOne(
"SELECT COUNT(*) FROM tl_page WHERE secureDownloadsEnabled='1'"
);
return $result > 0;
}
public function run(): MigrationResult
{
$schemaManager = $this->connection->createSchemaManager();
// Erstelle die Zieltabelle, falls sie nicht existiert
if (!$schemaManager->tablesExist(['tl_memberfiles_config'])) {
$this->createMemberfilesConfigTable();
}
$pages = $this->connection->fetchAllAssociative(
"SELECT id, title, secureDownloadsSRC, secureDownloadsTarget, " .
"secureDownloadsRegExp, secureDownloadsFields, sd_nc_enable, sd_nc_notification " .
"FROM tl_page WHERE secureDownloadsEnabled='1'"
);
foreach ($pages as $page) {
$this->connection->insert('tl_memberfiles_config', [
'tstamp' => time(),
'title' => $page['title'] . ' (migriert von Seite ID ' . $page['id'] . ')',
'source' => $page['secureDownloadsSRC'],
'target' => $page['secureDownloadsTarget'],
'`regexp`' => $page['secureDownloadsRegExp'],
'fields' => $page['secureDownloadsFields'],
'hasNotification' => $page['sd_nc_enable'],
'notification' => $page['sd_nc_notification'],
'enabled' => '1'
]);
$this->connection->update('tl_page', ['secureDownloadsEnabled' => ''], ['id' => $page['id']]);
}
return new MigrationResult(
true,
sprintf('Erfolgreich %d Secure Downloads Konfigurationen von tl_page nach tl_memberfiles_config migriert.', count($pages))
);
}
private function createMemberfilesConfigTable(): void
{
$schema = new Schema();
$table = $schema->createTable('tl_memberfiles_config');
// Pflichtfelder
$table->addColumn('id', 'integer', ['unsigned' => true, 'autoincrement' => true]);
$table->addColumn('tstamp', 'integer', ['unsigned' => true, 'default' => 0]);
$table->addColumn('title', 'string', ['length' => 255, 'default' => '']);
$table->addColumn('source', 'binary', ['length' => 16, 'fixed' => true, 'notnull' => false]);
$table->addColumn('target', 'binary', ['length' => 16, 'fixed' => true, 'notnull' => false]);
$table->addColumn('regexp', 'string', ['length' => 64, 'notnull' => true, 'default' => '']);
$table->addColumn('fields', 'blob', ['notnull' => false]);
$table->addColumn('hasNotification', 'string', ['length' => 1, 'fixed' => true, 'default' => '']);
$table->addColumn('notification', 'integer', ['unsigned' => true, 'default' => 0]);
$table->addColumn('enabled', 'string', ['length' => 1, 'fixed' => true, 'default' => '']);
// Primary Key
$table->setPrimaryKey(['id']);
// Schema anwenden
$queries = $schema->toSql($this->connection->getDatabasePlatform());
foreach ($queries as $query) {
$this->connection->executeStatement($query);
}
}
}