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

时间:2016-11-16 16:01:52

标签: php mysql query-builder extbase typo3-7.6.x

我正在努力使用TYPO3 l10n并修改本地化记录。

简短问题: 如何从我的extbase模型中获取本地化记录?

更详细: 我正在使用后端模块同时修改多个记录。目前它只适用于原始记录。但客户也希望使用此模块来编辑本地化记录。

这是我到目前为止所尝试的内容:

数组正在将原始uid传递给存储库类。根据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();
}

此查询适用于第一条记录。但真正令我困惑的是,从第二个条目继续查询返回原始记录(即使查询中的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:

执行代码后,数据库如下所示:

database snipped

100 uid是原点,200是本图中的本地化记录。

1 个答案:

答案 0 :(得分:3)

注意:除了此错误之外,以下解决方案将有效: 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的记录的本地化版本。