Spaces:
No application file
No application file
| 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(); | |
| } | |
| } | |