在后端模块中获取记录本地化
Get Record Localization within backend module
我正在为 TYPO3 l10n 和本地化记录的修改而苦苦挣扎。
小问题:
如何从我的 extbase 模型中获取本地化记录?
更详细:
我正在使用后端模块同时修改多条记录。目前它仅适用于原始记录。但是客户也想使用这个模块来编辑本地化记录。
这是我目前尝试的方法:
数组正在将原始 uid 传递到存储库 class。根据 SysLanguageUid,我正在做一个 findByUid,如果它是原始记录,如果 SysLanguageUid 高于 0,我将执行以下查询:
protected function findByUidAndSysLanguageUid($uid, $sysLanguageUid) {
$query = $this->createQuery();
$query->matching(
$query->equals('l10n_parent', $uid),
$query->equals('sys_language_uid', $sysLanguageUid)
);
return $query->execute();
}
此查询对第一条记录工作正常。但真正让我感到困惑的是,从第二个条目开始查询 returns 原始记录(即使查询中的 sys_language_uid 设置为 >0)。
任何想法如何处理这个?
PS:如果您需要更多信息,请告诉我。
更新:
到目前为止,我设法从上述约束中获取原始查询:
查询第一条记录:
SELECT tx_extkey_domain_model_mymodel.*
FROM tx_extkey_domain_model_mymodel
WHERE (tx_extkey_domain_model_mymodel.l10n_parent = '133' AND tx_extkey_domain_model_mymodel.sys_language_uid = '1') AND
(tx_extkey_domain_model_mymodel.sys_language_uid IN (1, -1) OR
(tx_extkey_domain_model_mymodel.sys_language_uid = 0 AND
tx_extkey_domain_model_mymodel.uid NOT IN (SELECT tx_extkey_domain_model_mymodel.l10n_parent
FROM tx_extkey_domain_model_mymodel
WHERE tx_extkey_domain_model_mymodel.l10n_parent > 0 AND
tx_extkey_domain_model_mymodel.sys_language_uid = 1 AND
tx_extkey_domain_model_mymodel.deleted = 0))) AND
tx_extkey_domain_model_mymodel.hidden = 0 AND (tx_extkey_domain_model_mymodel.starttime 1479390060) AND
tx_extkey_domain_model_mymodel.deleted = 0
ORDER BY tx_extkey_domain_model_mymodel.name ASC
LIMIT 1;
查询第二条记录:
SELECT tx_extkey_domain_model_mymodel.*
FROM tx_extkey_domain_model_mymodel
WHERE (tx_extkey_domain_model_mymodel.l10n_parent = '134' AND tx_extkey_domain_model_mymodel.sys_language_uid = '1') AND
(tx_extkey_domain_model_mymodel.sys_language_uid IN (1, -1) OR
(tx_extkey_domain_model_mymodel.sys_language_uid = 0 AND
tx_extkey_domain_model_mymodel.uid NOT IN (SELECT tx_extkey_domain_model_mymodel.l10n_parent
FROM tx_extkey_domain_model_mymodel
WHERE tx_extkey_domain_model_mymodel.l10n_parent > 0 AND
tx_extkey_domain_model_mymodel.sys_language_uid = 1 AND
tx_extkey_domain_model_mymodel.deleted = 0))) AND
tx_extkey_domain_model_mymodel.hidden = 0 AND (tx_extkey_domain_model_mymodel.starttime 1479390360) AND
tx_extkey_domain_model_mymodel.deleted = 0
ORDER BY tx_extkey_domain_model_mymodel.name ASC
LIMIT 1;
更新 2
现在这让我更加困惑......
我将两个 sql 查询手动放入 heidisql 和 运行 中。他们工作得很好!
看来查询本身没有问题
更新 3
这是控制器调用的存储库方法。
/**
* @param array $parentUidCollection
* @param int $L
*/
protected function updateByCollection(array $parentUidCollection, $L = 0) {
//$L is the language $_GET parameter. cant use TSFE because of inside of a backend module
if($L > 0) {
$this->setTempQuerySettings($L);
}
foreach ($parentUidCollection as $parentUid){
$myModel = $this->findTranslatedByParentId($parentUid)->getFirst();
$myModel->setDescription('foo');
$this->update($myModel);
}
}
如果实际语言不是默认语言,我的 defaultQuerySettings 会在第三行被覆盖。
/**
* @param $sysLanguageUid
*/
protected function setTempQuerySettings($sysLanguageUid) {
/** @var \TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings $tempQuerySettings */
$this->originalQuerySettings = $this->objectManager->get('TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings');
$tempQuerySettings = clone $this->originalQuerySettings;
$tempQuerySettings->setRespectStoragePage(false);
$tempQuerySettings->setRespectSysLanguage(true);
$tempQuerySettings->setLanguageUid($sysLanguageUid);
$tempQuerySettings->setLanguageMode(false);
$tempQuerySettings->setLanguageOverlayMode(false);
$this->setDefaultQuerySettings($tempQuerySettings);
}
现在使用 Toke Herkild 建议的功能,但内部没有查询设置。它们设置在上面的片段中。
/**
* @param int|string $parentUid
* @return array|\TYPO3\CMS\Extbase\Persistence\QueryResultInterface
*/
public function findTranslatedByParentId($parentUid)
{
$query = $this->createQuery();
$query->matching($query->equals('l10n_parent', $parentUid));
return $query->execute();
}
更新 4:
执行代码后数据库如下所示:
图中100个uid是原点,200个是本地化记录
注意:除了这个错误,下面的解决方案可以工作:
https://forge.typo3.org/issues/47192
也许只是让它变得简单,在你的 ModelRepository 中做一些像这样的事情:
public function findTranslatedByParentId($parentUid) {
$query = $this->createQuery()
$qrySettings = $query->getQuerySettings();
$qrySettings->setLanguageMode('ignore');
$qrySettings->setLanguageOverlay(FALSE);
$query->setDefaultQuerySettings($qrySettings);
return $query->matching($query->equals('l18n_parent', $parentUid))->execute();
}
您需要禁用持久层语言处理,或者它认为您尝试获取当前 sys_language 记录的本地化版本。
我正在为 TYPO3 l10n 和本地化记录的修改而苦苦挣扎。
小问题: 如何从我的 extbase 模型中获取本地化记录?
更详细: 我正在使用后端模块同时修改多条记录。目前它仅适用于原始记录。但是客户也想使用这个模块来编辑本地化记录。
这是我目前尝试的方法:
数组正在将原始 uid 传递到存储库 class。根据 SysLanguageUid,我正在做一个 findByUid,如果它是原始记录,如果 SysLanguageUid 高于 0,我将执行以下查询:
protected function findByUidAndSysLanguageUid($uid, $sysLanguageUid) {
$query = $this->createQuery();
$query->matching(
$query->equals('l10n_parent', $uid),
$query->equals('sys_language_uid', $sysLanguageUid)
);
return $query->execute();
}
此查询对第一条记录工作正常。但真正让我感到困惑的是,从第二个条目开始查询 returns 原始记录(即使查询中的 sys_language_uid 设置为 >0)。
任何想法如何处理这个?
PS:如果您需要更多信息,请告诉我。
更新: 到目前为止,我设法从上述约束中获取原始查询:
查询第一条记录:
SELECT tx_extkey_domain_model_mymodel.*
FROM tx_extkey_domain_model_mymodel
WHERE (tx_extkey_domain_model_mymodel.l10n_parent = '133' AND tx_extkey_domain_model_mymodel.sys_language_uid = '1') AND
(tx_extkey_domain_model_mymodel.sys_language_uid IN (1, -1) OR
(tx_extkey_domain_model_mymodel.sys_language_uid = 0 AND
tx_extkey_domain_model_mymodel.uid NOT IN (SELECT tx_extkey_domain_model_mymodel.l10n_parent
FROM tx_extkey_domain_model_mymodel
WHERE tx_extkey_domain_model_mymodel.l10n_parent > 0 AND
tx_extkey_domain_model_mymodel.sys_language_uid = 1 AND
tx_extkey_domain_model_mymodel.deleted = 0))) AND
tx_extkey_domain_model_mymodel.hidden = 0 AND (tx_extkey_domain_model_mymodel.starttime 1479390060) AND
tx_extkey_domain_model_mymodel.deleted = 0
ORDER BY tx_extkey_domain_model_mymodel.name ASC
LIMIT 1;
查询第二条记录:
SELECT tx_extkey_domain_model_mymodel.*
FROM tx_extkey_domain_model_mymodel
WHERE (tx_extkey_domain_model_mymodel.l10n_parent = '134' AND tx_extkey_domain_model_mymodel.sys_language_uid = '1') AND
(tx_extkey_domain_model_mymodel.sys_language_uid IN (1, -1) OR
(tx_extkey_domain_model_mymodel.sys_language_uid = 0 AND
tx_extkey_domain_model_mymodel.uid NOT IN (SELECT tx_extkey_domain_model_mymodel.l10n_parent
FROM tx_extkey_domain_model_mymodel
WHERE tx_extkey_domain_model_mymodel.l10n_parent > 0 AND
tx_extkey_domain_model_mymodel.sys_language_uid = 1 AND
tx_extkey_domain_model_mymodel.deleted = 0))) AND
tx_extkey_domain_model_mymodel.hidden = 0 AND (tx_extkey_domain_model_mymodel.starttime 1479390360) AND
tx_extkey_domain_model_mymodel.deleted = 0
ORDER BY tx_extkey_domain_model_mymodel.name ASC
LIMIT 1;
更新 2 现在这让我更加困惑...... 我将两个 sql 查询手动放入 heidisql 和 运行 中。他们工作得很好!
看来查询本身没有问题
更新 3
这是控制器调用的存储库方法。
/**
* @param array $parentUidCollection
* @param int $L
*/
protected function updateByCollection(array $parentUidCollection, $L = 0) {
//$L is the language $_GET parameter. cant use TSFE because of inside of a backend module
if($L > 0) {
$this->setTempQuerySettings($L);
}
foreach ($parentUidCollection as $parentUid){
$myModel = $this->findTranslatedByParentId($parentUid)->getFirst();
$myModel->setDescription('foo');
$this->update($myModel);
}
}
如果实际语言不是默认语言,我的 defaultQuerySettings 会在第三行被覆盖。
/**
* @param $sysLanguageUid
*/
protected function setTempQuerySettings($sysLanguageUid) {
/** @var \TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings $tempQuerySettings */
$this->originalQuerySettings = $this->objectManager->get('TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings');
$tempQuerySettings = clone $this->originalQuerySettings;
$tempQuerySettings->setRespectStoragePage(false);
$tempQuerySettings->setRespectSysLanguage(true);
$tempQuerySettings->setLanguageUid($sysLanguageUid);
$tempQuerySettings->setLanguageMode(false);
$tempQuerySettings->setLanguageOverlayMode(false);
$this->setDefaultQuerySettings($tempQuerySettings);
}
现在使用 Toke Herkild 建议的功能,但内部没有查询设置。它们设置在上面的片段中。
/**
* @param int|string $parentUid
* @return array|\TYPO3\CMS\Extbase\Persistence\QueryResultInterface
*/
public function findTranslatedByParentId($parentUid)
{
$query = $this->createQuery();
$query->matching($query->equals('l10n_parent', $parentUid));
return $query->execute();
}
更新 4:
执行代码后数据库如下所示:
图中100个uid是原点,200个是本地化记录
注意:除了这个错误,下面的解决方案可以工作: https://forge.typo3.org/issues/47192
也许只是让它变得简单,在你的 ModelRepository 中做一些像这样的事情:
public function findTranslatedByParentId($parentUid) {
$query = $this->createQuery()
$qrySettings = $query->getQuerySettings();
$qrySettings->setLanguageMode('ignore');
$qrySettings->setLanguageOverlay(FALSE);
$query->setDefaultQuerySettings($qrySettings);
return $query->matching($query->equals('l18n_parent', $parentUid))->execute();
}
您需要禁用持久层语言处理,或者它认为您尝试获取当前 sys_language 记录的本地化版本。