['blocks', 'blocks_translations'],
'fix' => false,
];
protected function run(array $arguments)
{
$tables = $arguments['tables'] ?? [];
foreach ($tables as $table) {
$this->fixBlocks($table, $arguments['fix'] ?? false);
}
}
protected function fixBlocks($table, $fix)
{
$this->log("Table `{$table}`: ");
$qb = sqlQueryBuilder()
->select('b.id, b.json_content')
->from($table, 'b')
->andWhere(Operator::like(['b.json_content' => '%"type":"legacy"%']))
->andWhere(Operator::orX(
Operator::like(['b.json_content' => '%"html":""%']),
Operator::like(['b.json_content' => '%"html":null%'])
))->execute();
$this->log('Total content blocks: '.$qb->rowCount());
$deleted = 0;
foreach ($qb as $item) {
$json_content = json_decode($item['json_content'], true);
$message = $item['id'].': blocks total = '.count($json_content);
$block_types = array_column($json_content, 'type');
$legacy_blocks = array_count_values($block_types)['legacy'] ?? 0;
$message .= "; legacy blocks = {$legacy_blocks}; ";
$fixed = $this->fixJSONContent($json_content);
if ($fixed) {
echo $message.'
';
if ($fix) {
$json_content = empty($json_content) ? null : json_encode(array_values($json_content));
sqlQueryBuilder()->update($table)
->directValues(['json_content' => $json_content])
->where(Operator::equals(['id' => $item['id']]))
->execute();
}
$deleted += $fixed;
}
}
$this->log('Legacy blocks: '.$deleted);
if ($fix) {
$c = sqlQuery('UPDATE '.$table.' SET content = REPLACE(content, \'