Spaces:
No application file
No application file
File size: 3,729 Bytes
d2897cd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
<?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();
}
}
|