extbase Repository:在其他语言中访问 defaultLang 的引用数据记录

extbase Repository: Access refference datarecord of defaultLang when in other lang

我有一个扩展(让我们称之为 Mystuff)引用另一个扩展(在 Mystuff 模型中):

/**
* shoeref
*
* @var \My\MyCollection\Domain\Model\MyCollection
*/
protected $shoeref;

在模板中,我只需使用 {mystuff.shoeref.image}

即可访问它

现在的问题是,MyCollection 并非在所有语言中都存在,而Mystuff 在所有语言中都存在。作为示例,假设我们使用的语言 L=1 不存在 MyCollection。在这种情况下 {mystuff.shoeref} 为 NULL。

我想做的是访问Default语言的MyCollection数据记录(不管这个语言有没有MyCollection记录,总是获取Default语言的数据记录就可以了)。但我不知道该怎么做。

有效的替代方法是为all语言(L=-1)创建数据记录。但我不喜欢这个解决方案,因为每个编辑者都可以编辑这个数据记录,它永远只是默认语言数据记录的副本。

这里的问题是 extbase 确实会使用 lang uid 1 获取所有子记录并忽略默认记录(lang uid 0)

您可以尝试设置 $querySettings->setRespectSysLanguage(FALSE); 但随后您将获得有关翻译设置的所有记录。

这仍然是 extbase 中的一个陷阱。

我会编写自己的查询语句,先获取父记录,然后根据需要获取子记录,而不依赖于 extbase 魔术获取机制。

一些信息:

https://wiki.typo3.org/Default_Orderings_and_Query_Settings_in_Repository

https://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/3-implement-individual-database-queries.html

一种方法很简单:

1st) 扩展模型 在模型中添加额外的 getter

public function getParentRecord() {
   return $this->_localizedUid;
}

这将return父记录的uid

2nd) 创建一个额外的viewhelper

创建文件 typo3conf/ext/<your-ext>/Classes/ViewHelpers/ObjectViewHelper:

<?php

namespace <YourVendor>\YourExtKey>\ViewHelpers;

class ObjectViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper {

    /**
     * @param int $id
     * @return mixed
     */
    public function render($id) {
        $rawRecord = $GLOBALS['TYPO3_DB']->exec_SELECTgetSingleRow('*', '<tx_extkey_domain_model_fo>', 'uid=' . (int)$id);

        $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
        /* @var $dataMapper \TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper */
        $dataMapper = $objectManager->get('TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper');

        $records = $dataMapper->map('YourVendor\YourExtKey\Domain\Model\YourModel', array($rawRecord));
        $record = array_shift($records);

        $this->templateVariableContainer->add('obj', $record);
        $output = $this->renderChildren();
        $this->templateVariableContainer->remove('obj');
        return $output;
    }
}

不要忘记采用供应商的所有位置、table 名称和型号!

3:采纳观点

现在更改您的模板并使用新的 ViewHelper

<f:if condition="{model.parentRecord} > 0">
  <c:object id="{model.parentRecord}">
    <f:debug>{obj}</f:debug>
  </c:object>
</f:if>

您现在将获得父记录