在后端模块中获取记录本地化

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 记录的本地化版本。