添加 'installer/Migration/V5_4_0_cn/LangStringHelper.php'

This commit is contained in:
zhongjin 2023-05-05 23:13:05 +08:00
parent 41ac2d298e
commit 7e2d1faba8

View File

@ -0,0 +1,253 @@
<?php
/**
* OrangeHRM is a comprehensive Human Resource Management (HRM) System that captures
* all the essential functionalities required for any enterprise.
* Copyright (C) 2006 OrangeHRM Inc., http://www.orangehrm.com
*
* OrangeHRM is free software; you can redistribute it and/or modify it under the terms of
* the GNU General Public License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* OrangeHRM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program;
* if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA
*/
namespace OrangeHRM\Installer\Migration\V5_4_0_cn;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Query\QueryBuilder;
use OrangeHRM\Installer\Util\V1\Dto\LangString;
use OrangeHRM\Installer\Util\V1\LanguageHelper;
class LangStringHelper
{
private Connection $connection;
private ?LanguageHelper $languageHelper = null;
/**
* @param Connection $connection
*/
public function __construct(Connection $connection)
{
$this->connection = $connection;
}
/**
* @return Connection
*/
protected function getConnection(): Connection
{
return $this->connection;
}
/**
* @return QueryBuilder
*/
protected function createQueryBuilder(): QueryBuilder
{
return $this->getConnection()->createQueryBuilder();
}
/**
* @return LanguageHelper
*/
public function getLangHelper(): LanguageHelper
{
if (!$this->languageHelper instanceof LanguageHelper) {
$this->languageHelper = new LanguageHelper($this->getConnection());
}
return $this->languageHelper;
}
/**
* @param string $moduleName
* @return int
*/
public function getGroupId(string $moduleName): int
{
$q = $this->createQueryBuilder();
$q->select('module.id')
->from('ohrm_i18n_group', 'module')
->where('module.name = :group')
->setParameter('group', $moduleName);
return $q->executeQuery()->fetchOne();
}
/**
* @param string $groupName
* @return void
*/
public function deleteNonCustomizedLangStrings(string $groupName): void
{
$groupId = $this->getLangHelper()->getGroupIdByName($groupName);
$langStringIds = $this->getLangStringIdsForGroup($groupId);
$qb = $this->createQueryBuilder()
->delete('ohrm_i18n_translate')
->where('ohrm_i18n_translate.customized != 1');
$qb->andWhere($qb->expr()->in('ohrm_i18n_translate.lang_string_id', ':langStringIds'))
->setParameter('langStringIds', $langStringIds, Connection::PARAM_INT_ARRAY)
->executeQuery();
$deleteStrings = $this->getNonCustomizedLangStringIds($groupId);
$qb = $this->createQueryBuilder()
->delete('ohrm_i18n_lang_string');
$qb->andWhere($qb->expr()->in('ohrm_i18n_lang_string.id', ':deleteIds'))
->setParameter('deleteIds', $deleteStrings, Connection::PARAM_INT_ARRAY)
->executeQuery();
}
/**
* @param int $groupId
* @return array
*/
private function getLangStringIdsForGroup(int $groupId): array
{
$q = $this->createQueryBuilder();
$q->select('langString.id')
->from('ohrm_i18n_lang_string', 'langString')
->where('langString.group_id = :module')
->setParameter('module', $groupId);
$results = $q->executeQuery()->fetchAllAssociative();
return array_column($results, 'id');
}
/**
* @param int $groupId
* @return array
*/
private function getNonCustomizedLangStringIds(int $groupId): array
{
$q = $this->createQueryBuilder()
->select('translate.lang_string_id')
->from('ohrm_i18n_lang_string', 'langString')
->leftJoin('langString', 'ohrm_i18n_translate', 'translate', 'langString.id = translate.lang_string_id')
->where('langString.group_id = :module')
->andWhere('translate.customized = 1')
->setParameter('module', $groupId);
$results = $q->executeQuery()->fetchAllAssociative();
$customStrings = array_column($results, 'lang_string_id');
if ($customStrings == null) {
return $this->getLangStringIdsForGroup($groupId);
}
$qb = $this->createQueryBuilder()
->select('langString.id')
->from('ohrm_i18n_lang_string', 'langString');
$qb->andWhere($qb->expr()->notIn('langString.id', ':customStrings'))
->andWhere('langString.group_id = :module')
->setParameter('customStrings', $customStrings, Connection::PARAM_INT_ARRAY)
->setParameter('module', $groupId);
$results = $qb->executeQuery()->fetchAllAssociative();
return array_column($results, 'id');
}
/**
* @param string $groupName
* @return void
*/
public function insertOrUpdateLangStrings(string $groupName)
{
$langStringArray = $this->getLangHelper()->readLangStrings(
realpath(__DIR__ . "/lang-string/$groupName.yaml"),
$groupName
);
foreach ($langStringArray as $langString) {
$langStringId = $this->getLangStringIdByValueAndGroup($langString->getValue());
if (is_null($langStringId)) {
$this->saveLangString($langString);
} else {
$this->updateLangString($langStringId, $langString);
}
}
}
/**
* @param string $langStringValue
* @param int|null $groupId
* @return int|null
*/
public function getLangStringIdByValueAndGroup(string $langStringValue, ?int $groupId = null): ?int
{
$q = $this->createQueryBuilder()
->select('langString.id')
->from('ohrm_i18n_lang_string', 'langString')
->where('langString.value = :source')
->setParameter('source', $langStringValue);
if (!is_null($groupId)) {
$q->andWhere('langString.group_id = :module')
->setParameter('module', $groupId);
}
if (false != $result = $q->executeQuery()->fetchOne()) {
return $result;
}
return null;
}
/**
* @param string $langStringValue
* @param int $groupId
* @return int|null
*/
public function getLangStringIdByUnitIdAndGroup(string $langStringUnitId, int $groupId): ?int
{
$q = $this->createQueryBuilder()
->select('langString.id')
->from('ohrm_i18n_lang_string', 'langString')
->where('langString.unit_id = :unitId')
->andWhere('langString.group_id = :group')
->setParameter('unitId', $langStringUnitId)
->setParameter('group', $groupId);
if (false != $result = $q->executeQuery()->fetchOne()) {
return $result;
}
return null;
}
/**
* @param LangString $langString
* @return void
*/
private function saveLangString(LangString $langString): void
{
$this->createQueryBuilder()
->insert('ohrm_i18n_lang_string')
->values([
'value' => ':string',
'group_id' => ':module',
'unit_id' => ':unitId',
'version' => ':version',
'note' => ':note'
])
->setParameter('string', $langString->getValue())
->setParameter('module', $langString->getGroupId())
->setParameter('unitId', $langString->getUnitId())
->setParameter('version', $langString->getVersion())
->setParameter('note', $langString->getNote())
->executeQuery();
}
/**
* @param int $langStringId
* @param LangString $langString
* @return void
*/
private function updateLangString(int $langStringId, LangString $langString): void
{
// TODO:: have to look into `version` and `note`
$this->createQueryBuilder()
->update('ohrm_i18n_lang_string')
->set('ohrm_i18n_lang_string.unit_id', ':key')
->set('ohrm_i18n_lang_string.group_id', ':groupId')
->where('ohrm_i18n_lang_string.id = :id')
->setParameter('key', $langString->getUnitId())
->setParameter('groupId', $langString->getGroupId())
->setParameter('id', $langStringId)
->executeQuery();
}
}