TYPO3 9 LTS:如何通过PHP API获取内容元素的翻译UID?
当然有合适的TYPO3 PHP API能帮你搞定这个需求!我之前在处理多语言内容批量更新的任务时,正好用过类似的逻辑,分享两种实用方案给你:
方法1:使用TYPO3官方的LocalizationRepository(推荐,符合架构规范)
TYPO3提供了专门处理本地化关联的LocalizationRepository,可以直接用它查询翻译后的内容元素:
use TYPO3\CMS\Core\Domain\Repository\LocalizationRepository; use TYPO3\CMS\Core\Utility\GeneralUtility; // 初始化Repository实例 $localizationRepository = GeneralUtility::makeInstance(LocalizationRepository::class); // 你的业务参数 $originalContentElementUidDe = 1234; $languageIdEn = 1; // 查询目标语言的翻译记录 $translatedRecords = $localizationRepository->findLocalizedRecord( 'tt_content', // 内容元素对应的数据库表名 $originalContentElementUidDe, $languageIdEn ); // 提取翻译元素的UID(关联模式下通常只有一条匹配记录) $translatedContentElementUidEn = !empty($translatedRecords) ? (int)reset($translatedRecords)['uid'] : null;
这个方法是TYPO3官方推荐的面向对象方式,会自动处理本地化的关联逻辑,不用自己拼接复杂的查询条件。
方法2:直接数据库查询(高效适合批处理场景)
如果你的脚本需要处理大量内容元素,直接用数据库查询会更高效。利用TYPO3的ConnectionPool操作数据库:
use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; // 你的业务参数 $originalContentElementUidDe = 1234; $languageIdEn = 1; // 获取tt_content表的数据库连接 $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tt_content'); // 查询翻译元素UID $translatedUid = $connection->select( ['uid'], 'tt_content', [ 'l10n_parent' => $originalContentElementUidDe, // 关联原始元素的UID 'sys_language_uid' => $languageIdEn, // 目标语言ID 'deleted' => 0, // 排除已删除的记录 'hidden' => 0 // 可选:如果只需要未隐藏的有效内容 ] )->fetchOne(); $translatedContentElementUidEn = $translatedUid ? (int)$translatedUid : null;
这种方式跳过了Repository的封装层,性能更优,非常适合批量处理的场景。
封装成工具类(匹配你的示例代码)
你可以把查询逻辑封装成工具类,方便在CommandController里复用:
namespace Your\Extension\Utility; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; class ContentElementTranslationUtil { /** * 通过原始内容元素UID获取对应语言的翻译元素UID * * @param int $originalUid 原始内容元素UID(德语) * @param int $targetLanguageId 目标语言ID(英语) * @return int|null 翻译后的UID,不存在则返回null */ public static function getTranslatedContentElementUid(int $originalUid, int $targetLanguageId): ?int { $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('tt_content'); $translatedUid = $connection->select( ['uid'], 'tt_content', [ 'l10n_parent' => $originalUid, 'sys_language_uid' => $targetLanguageId, 'deleted' => 0 ] )->fetchOne(); return $translatedUid ? (int)$translatedUid : null; } }
之后就可以像你示例里那样直接调用:
$languageIdDe = 0; $languageIdEn = 1; $originalContentElementUidDe = 1234; $translatedContentElementUidEn = \Your\Extension\Utility\ContentElementTranslationUtil::getTranslatedContentElementUid($originalContentElementUidDe, $languageIdEn);
注意事项
- 因为你的实例是关联模式,翻译元素的
l10n_parent字段会直接指向原始元素的UID,所以上述两种方法都有效;如果是自由模式,逻辑会有所不同。 - 记得处理
$translatedContentElementUidEn为null的情况(比如原始元素没有对应翻译),避免后续DataHandler操作报错。
内容的提问来源于stack exchange,提问作者Abdull
相关产品推荐
相关产品推荐

