Files
kupshop/bundles/External/ZNZBundle/Resources/script/ImportTemplatesTextScript.php
2025-08-02 16:30:27 +02:00

158 lines
4.9 KiB
PHP

<?php
declare(strict_types=1);
namespace External\ZNZBundle\Resources\script;
use Doctrine\DBAL\Connection;
use External\ZNZBundle\Util\ZNZApi;
use KupShop\AdminBundle\Util\Script\Script;
use KupShop\ContentBundle\Util\Block;
use KupShop\I18nBundle\Entity\Language;
use KupShop\KupShopBundle\Context\LanguageContext;
use KupShop\KupShopBundle\Util\Compat\ServiceContainer;
use KupShop\KupShopBundle\Util\Contexts;
use Query\Operator;
use Texy\Texy;
class ImportTemplatesTextScript extends Script
{
protected static $name = '[ZNZ] Import templates texts';
protected function run(array $arguments)
{
$znzApi = ServiceContainer::getService(ZNZApi::class);
$languages = array_map(fn (Language $language) => mb_strtolower($language->getLocale()), $this->getLanguageContext()->getSupported());
$qb = $znzApi->getConnection()
->getQueryBuilder()
->select('*')
->from('wpj.ZnackaRadaPopisPuvodni')
->where('IdLanguage IN (:languages)')
->orderBy('(CASE IdLanguage WHEN \'cs_cz\' THEN 1 ELSE 99 END)')
->setParameter('languages', $languages, Connection::PARAM_INT_ARRAY);
foreach ($qb->execute() as $item) {
$templateId = sqlQueryBuilder()
->select('id')
->from('templates')
->where(Operator::equals(['JSON_VALUE(data, "$.znzOptionId")' => $item['IdZnackaRada']]))
->execute()->fetchOne();
if (!$templateId) {
continue;
}
$this->updateTemplateDescription($templateId, $item['PopisRady'], $this->getLanguageByLocale($item['IdLanguage']));
}
}
private function updateTemplateDescription(int $templateId, string $text, string $language)
{
static $texy;
static $block;
if (!$texy) {
$texy = new Texy();
$texy->allowedTags['font'] = true;
}
if (!$block) {
$block = ServiceContainer::getService(Block::class);
}
$html = '';
if (!empty($text)) {
$html = $texy->process($text);
}
$rootBlockId = sqlQueryBuilder()
->select('id_block')
->from('templates')
->where(Operator::equals(['id' => $templateId]))
->execute()->fetchOne();
$contentBlockData = null;
$contentBlockId = null;
if ($rootBlockId) {
$contentBlock = sqlQueryBuilder()
->select('id, json_content')
->from('blocks')
->where(Operator::equals(['id_parent' => $rootBlockId]))
->orderBy('id, position')
->setMaxResults(1)
->execute()->fetchAssociative();
$contentBlockId = $contentBlock['id'] ?? null;
$contentBlockData = json_decode($contentBlock['json_content'] ?? '', true) ?: [];
}
if ($language !== 'cs') {
if ($contentBlockId) {
$translatedData = null;
if (!empty($contentBlockData[0]) && $contentBlockData[0]['type'] === 'legacy') {
$contentBlockData[0]['settings']['html'] = $html;
$translatedData = json_encode($contentBlockData);
}
$block->translateBlock(
$language,
$contentBlockId,
[
'position' => 0,
'content' => $html,
'json_content' => $translatedData ?: $block->createLegacyBlockJsonContent($html),
],
false
);
}
return;
}
// aktualizace popisku ve vychozim jazyce
if ($rootBlockId && !$contentBlockId) {
sqlQueryBuilder()
->insert('blocks')
->directValues(
[
'id_parent' => $rootBlockId,
'id_root' => $rootBlockId,
'content' => $html,
'json_content' => $block->createLegacyBlockJsonContent($html),
]
)
->execute();
return;
}
$block->insertFirstBlock('templates', $templateId, $html);
}
private function getLanguageByLocale(string $locale): string
{
foreach ($this->getLanguageContext()->getSupported() as $language) {
if (mb_strtolower($locale) === mb_strtolower($language->getLocale())) {
return $language->getId();
}
}
return $this->getLanguageContext()->getDefaultId();
}
private function getLanguageContext(): LanguageContext
{
static $languageContext;
if (!$languageContext) {
$languageContext = Contexts::get(LanguageContext::class);
}
return $languageContext;
}
}
return ImportTemplatesTextScript::class;