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
一种方法很简单:
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>
您现在将获得父记录
我有一个扩展(让我们称之为 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
一种方法很简单:
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>
您现在将获得父记录