尊重foreign_table_where中的Extbase存储pid

问题描述 投票:0回答:1

我编写了一个考虑到多语言和多域的扩展,但遇到了 TCA 字段的问题。

控制器和存储库根据为每个根页面定义的 persistence.storagePid 常量获取结果没有问题,但我还没有找到一种方法来为 selectMultipleSideBySide TCA 字段实现相同的效果:

'config' => [
 'type' => 'select',
 'renderType' => 'selectMultipleSideBySide',
 'MM' => 'tx_lmyext_domain_model_model1_mm',
 'foreign_table' => 'tx_myext_domain_model_model1',
 'foreign_table_where' => ' AND tx_myext_domain_model_model1.sys_language_uid IN (-1,###REC_FIELD_sys_language_uid###) ORDER BY tx_locationslist_domain_model_model1.title',
 'maxitems' => 1,
],

持久性设置似乎对查询没有影响,我在选择字段域的右侧看到数据库中存在的所有对象。

多选左列 多选右列
PID 200 的对象
PID 200 的对象
来自 PID 90 的对象 <- should not be there

选择 PID 90 中的对象时,由于存储库的查询设置,它不会显示在前端,但编辑器仍然可以在 TCA 字段中选择它。 有没有办法只显示特定 pid 中的项目,例如“AND tx_myext_domain_model_model1.pid IN (###STORAGE-PID###)”以及之前删除的标签###STORAGE-PID###?

到目前为止,我最接近的是“AND tx_myext_domain_model_model1.pid IN (###SITEROOT###)”,但这需要将所有对象保存在每个域的根页面内,我想将它们保存在文件夹中。

我无法直接在查询中定义 pid,因为它会根据页面树中所选的页面而变化。

我已经使用 PAGE_TSCONFIG_ID 标签进行了尝试,该标签似乎工作正常,但我希望每个域的配置仅与 TypoScript 常量一起使用,以使配置更容易。

我也尝试过使用组元素,但它的缺点是必须单独选择每个元素,并且仍然可以选择不在正确存储 pid 中的对象。

使用initializeObject()设置存储库内的存储pid也不会改变TCA内可用项目的任何内容。

typo3 extbase
1个回答
0
投票

自 TYPO3 v10.4 起,您可以在 SiteConfig 中为每个域/根页面定义存储 pid 为

setting.

,TYPO3 提供该值作为 TypoScript 常量和 pageTSConfig 常量。

注意:这意味着您只能定义每个 rootPage 的内容,而不能定义 rootPage/siteConfig 下树中的单个页面。

参见:

https://docs.typo3.org/c/typo3/cms-core/main/en-us/Changelog/10.4/Feature-91080-SiteSettingsAsTsConstantsAndInTsConfig.html

所以,不要在TypoScript/PageTS中直接定义存储页面值 在站点配置中定义它

对于 TYPO3 v10 和 v11:site-identifier/config.yml

settings: myStoragePid: 123

对于 TYPO3 v12 及更高版本:site-identifier/settings.yml

myStoragePid: 123

调整您的 PageTS/TypoScript 以使用常量来检索值:

{$myStoragePid}

完成后,您可以在 TCA 配置的 where 条件中使用占位符标记

'config' => [ 'type' => 'select', 'renderType' => 'selectMultipleSideBySide', 'MM' => 'tx_lmyext_domain_model_model1_mm', 'foreign_table' => 'tx_myext_domain_model_model1', 'foreign_table_where' => ' AND tx_myext_domain_model_model1.pid = ###SITE:settings.myStoragePid### AND tx_myext_domain_model_model1.sys_language_uid IN (-1,###REC_FIELD_sys_language_uid###) ORDER BY tx_locationslist_domain_model_model1.title', 'maxitems' => 1, ],

参见:
https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/SiteHandling/UseSiteInTCA.html

我已经使用 PAGE_TSCONFIG_ID 标签进行了尝试,该标签似乎工作正常,但我希望每个域的配置仅与 TypoScript 常量一起使用,以使配置更容易。

TypoScript 专门用于前端渲染配置。期望它对后端产生影响是一个狭隘的假设。因此,您可以通过
PAGE_TSCONFIG_ID

排除工作孤立。

另一种方法是使用定义存储 pid 的字段扩展 

pages

表,并将其用作简单的联接 - 但是,这不包括纯 sql 中的页面根线遍历 atm。

没有其他解决方案。

注意:这些类型的 TCA 值仅适用于存在正确站点/页面上下文的 Web 请求上下文。例如在 CLI 或“早期”中间件中使用它不起作用,因为 TYPO3 尚未设置正确的页面上下文(并且不能)。

© www.soinside.com 2019 - 2024. All rights reserved.