![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/mautic.corals.io/app/migrations/ |
<?php declare(strict_types=1); namespace Mautic\Migrations; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\Exception\SkipMigration; use Doctrine\ORM\EntityManagerInterface; use Mautic\CoreBundle\Doctrine\AbstractMauticMigration; use Mautic\CoreBundle\Helper\EmojiHelper; use Mautic\DynamicContentBundle\Entity\DynamicContent; use Mautic\EmailBundle\Entity\Copy; use Mautic\EmailBundle\Entity\Email; final class Version20201026101117 extends AbstractMauticMigration { /** * @throws SkipMigration */ public function preUp(Schema $schema): void { $table = $schema->getTable($this->prefix.'emails'); if ('utf8mb4' === $table->getColumn('subject')->getPlatformOption('charset')) { throw new SkipMigration('Schema includes this migration'); } } public function up(Schema $schema): void { // Note: all these columns are type of LONGTEXT. $tables = [ 'emails' => ['subject', 'custom_html', 'plain_text', 'name'], 'email_copies' => ['subject', 'body', 'body_text'], ]; foreach ($tables as $table => $columns) { foreach ($columns as $column) { $this->addSql("ALTER TABLE {$this->prefix}{$table} CHANGE {$column} {$column} LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"); } } } public function postUp(Schema $schema): void { $this->convertEmailsEmojies(); $this->convertEmailCopiesEmojies(); $this->convertDynamicContentEmojies(); } private function convertEmailsEmojies(): void { $this->iterateOverAllEntities( Email::class, function (Email $email) { $email->setName(EmojiHelper::toEmoji($email->getName(), 'short')); $email->setSubject(EmojiHelper::toEmoji($email->getSubject(), 'short')); $email->setCustomHtml(EmojiHelper::toEmoji($email->getCustomHtml(), 'short')); $email->setPlainText(EmojiHelper::toEmoji($email->getPlainText(), 'short')); } ); } private function convertEmailCopiesEmojies(): void { $this->iterateOverAllEntities( Copy::class, function (Copy $emailCopy) { $emailCopy->setSubject(EmojiHelper::toEmoji($emailCopy->getSubject(), 'short')); $emailCopy->setBody(EmojiHelper::toEmoji($emailCopy->getBody(), 'short')); $emailCopy->setBodyText(EmojiHelper::toEmoji($emailCopy->getBodyText(), 'short')); } ); } private function convertDynamicContentEmojies(): void { $this->iterateOverAllEntities( DynamicContent::class, function (DynamicContent $dynamicContent) { $dynamicContent->setDescription(EmojiHelper::toEmoji($dynamicContent->getDescription(), 'short')); } ); } private function iterateOverAllEntities(string $entityClass, callable $entityModifier): void { $entityManager = $this->container->get('doctrine.orm.entity_manager'); \assert($entityManager instanceof EntityManagerInterface); $batchSize = 50; $i = 1; $q = $entityManager->createQuery("SELECT t from {$entityClass} t"); $iterableResult = $q->toIterable(); foreach ($iterableResult as $row) { $entityModifier($row[0]); $entityManager->persist($row[0]); if (0 === ($i % $batchSize)) { $entityManager->flush(); $entityManager->clear(); } ++$i; } $entityManager->flush(); } }