Files
2025-08-02 16:30:27 +02:00

200 lines
6.8 KiB
PHP

<?php
namespace KupShop\ContentBundle\Resources\upgrade;
use Doctrine\DBAL\Exception\TableNotFoundException;
use KupShop\ContentBundle\Exception\UnknownPageTypeException;
use KupShop\ContentBundle\Util\PageLocator;
use KupShop\KupShopBundle\Util\Compat\ServiceContainer;
use Query\Operator;
class PageUpgrade extends \UpgradeNew
{
protected $priority = -200;
public function check_PagesTable()
{
return $this->checkTableExists('pages');
}
/** Create 'pages' table */
public function upgrade_PagesTable()
{
sqlQuery('CREATE TABLE pages (
id INT(11) PRIMARY KEY AUTO_INCREMENT,
id_block INT(11) UNSIGNED NULL,
name VARCHAR(50) NULL,
code VARCHAR(50) NOT NULL UNIQUE,
type VARCHAR(20) NOT NULL,
url VARCHAR(50) DEFAULT NULL,
CONSTRAINT FK_id_block_pages
FOREIGN KEY (id_block) REFERENCES blocks (id)
ON UPDATE CASCADE ON DELETE SET NULL
)');
$this->upgradeOK();
}
public function check_UpdatedColumn()
{
return $this->checkColumnExists('pages', 'updated');
}
/** Add `updated` column to `pages` table */
public function upgrade_UpdatedColumn()
{
sqlQuery('ALTER TABLE `pages` ADD COLUMN `updated` TIMESTAMP NULL');
$this->upgradeOK();
}
public function check_TypeLength(): bool
{
return $this->checkColumnType('pages', 'type', 'VARCHAR(100)');
}
/** Modify type length */
public function upgrade_TypeLength(): void
{
sqlQuery('alter table pages modify type varchar(100) not null;');
$this->upgradeOK();
}
public function check_PagesDefaultContent()
{
if (isFunctionalTests()) {
return false;
}
$pages = sqlQueryBuilder()
->select('*')->from('pages')
->where('`updated` IS NULL')
->execute();
if ($pages->rowCount()) {
return true;
}
if (findModule(\Modules::TRANSLATIONS)) {
try {
$translations = sqlQueryBuilder()
->select('p.*')->from('pages', 'p')
->leftJoin('p', 'blocks', 'b', 'b.id_root=p.id_block')
->leftJoin('b', 'blocks_translations', 't', 't.id_block = b.id')
->where('t.updated IS NULL')
->groupBy('p.id')
->execute();
if ($translations->rowCount()) {
return true;
}
} catch (TableNotFoundException $e) {
// blocks_translations jeste nemusi existovat a nevim jestli by vadilo, kdybych dal tomuhle upgradu jinou prioritu, tak radsi takhle
return false;
}
}
return false;
}
/** update default Pages content */
public function upgrade_PagesDefaultContent()
{
$pages = sqlFetchAll(sqlQueryBuilder()
->select('*')->from('pages')->where('`updated` IS NULL')
->execute(),
'id');
if (findModule(\Modules::TRANSLATIONS)) {
$translations = sqlFetchAll(sqlQueryBuilder()
->select("p.*, NULLIF(CONCAT_WS('-', t.updated), '') concat_updated")->from('pages', 'p')
->leftJoin('p', 'blocks', 'b', 'b.id_root=p.id_block')
->leftJoin('b', 'blocks_translations', 't', 't.id_block = b.id')
->having('concat_updated IS NULL')
->groupBy('p.id')
->execute(),
'id');
if ($translations) {
$pages = $pages + $translations;
}
}
if ($pages) {
/** @var PageLocator $pageLocator */
$pageLocator = ServiceContainer::getService(PageLocator::class);
foreach ($pages as $row) {
try {
$page = $pageLocator->getPageService($row['type']);
} catch (UnknownPageTypeException $e) {
// pokud stranka existuje v DB, ale neexistuje k ni servisa, tak chybu ignoruju
// a stranku preskakuju - pravdepodobne je to smazana systemova stranka, ktera zustala jen v DB
continue;
}
if ($json_contents = $page->getDefaultJson()) {
$blocks = sqlQueryBuilder()->select('*')
->from('blocks')
->where('id_root=:id_root')->setParameter('id_root', $row['id_block'])
->orderBy('position')
->execute()->fetchAll();
$json_contents = json_decode($json_contents, true);
$areas = $json_contents['areas'] ?? [$json_contents];
$update = false;
for ($i = 0; $i < max(count($blocks), count($areas)); $i++) {
$area = $areas[$i] ?? null;
$block = $blocks[$i] ?? null;
if (!$area && $block) {
sqlQueryBuilder()->delete('blocks')->where(Operator::equals(['id' => $block['id']]))->execute();
} elseif ($area && !$block) {
sqlQueryBuilder()->insert('blocks')
->directValues(['id_parent' => $row['id_block'],
'id_root' => $row['id_block'],
'content' => '',
'json_content' => '', ])->execute();
$blocks[$i]['id'] = sqlInsertId();
$update = true;
} elseif ($row['updated'] || (md5($block['json_content']) !== md5(json_encode($area)))) {
$update = true;
}
}
if ($update) {
$page->generateDefaultContent(array_map(function ($val) {
return $val['id'];
}, $blocks));
}
}
}
}
}
public function check_PagesTypeVarcharLength30()
{
return !$this->checkColumnType('pages', 'type', 'varchar(20)')
&& $this->checkColumnType('pages', 'type', 'varchar(30)');
}
/** Increase pages type varchar length to 30 */
public function upgrade_PagesTypeVarcharLength30()
{
sqlQuery('
alter table pages
modify type varchar(30) not null;
');
}
public function check_PagesDataColumn()
{
return $this->checkColumnExists('pages', 'data');
}
/** Add data column to pages table */
public function upgrade_PagesDataColumn()
{
sqlQuery('ALTER TABLE pages ADD COLUMN data MEDIUMTEXT DEFAULT NULL');
}
}