TYPO3 Extbase TCA MM关系过滤器结果由站点定义的常量“ newRecordStoragePid”

时间:2018-12-20 10:40:29

标签: typo3 extbase

TLDR: 我有两个带有MM关系的模型,这些模型具有通过模板中的Constants定义的不同StoragePid。 在查询有关我的相关模型的已配置storagePid的数据时,我不知道如何过滤结果。

长版: 在我的多站点TYPO3安装中,我有两个模型“ Person”和“ PersonalInformation”。这些模型具有通过TCA定义的MM关系。 “人员”包含所有常规数据,存储在全局RecordStore中。 “个人信息”包含可编辑的数据,即每个站点分别可编辑的图像。这些数据存储在每个站点下的单独RecordStore中。

这意味着在每个site-template-> Constants中,我定义了extension-storagePid,即:$ plugin.tx_myext.persistence.storagePid = 1 此配置在所有站点上都相同,以便能够从每个站点访问相同的RecordStore。

每个站点的“ PersonalInformation”的RecordStore应该不同。所以我的扩展程序的setup.txt看起来像:

   persistence {
        storagePid = {$plugin.tx_myext.persistence.storagePid},
                     {$plugin.tx_tx_myext.persistence.personalInformationStoragePid}
        classes {
          TYPO3\T3myext\Domain\Model\PersonalInformation {
            newRecordStoragePid = {$plugin.tx_myext.persistence.personalInformationStoragePid}
          }
        }
    }

在我的根站点模板的“常量”下,我分别为每个站点定义了plugin.tx_myext.persistence.personalInformationStoragePid。

为PersonalInformation定义的我的TCA MM关系:

   'person' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:myext/Resources/Private/Language/locallang_db.xlf:tx_myext_domain_model_person',
        'config' => array(
            'type' => 'select',
            'renderType' => 'selectMultipleSideBySide',
            'foreign_table' => 'tx_myext_domain_model_person',
            'foreign_table_where' => 'AND 1=1 ORDER BY last_name ASC',
            'MM' => 'tx_myext_person_personalinformation_mm',
            'size' => 10,
            'autoSizeMax' => 30,
            'maxitems' => 1,
            'minitems' => 0,
            'multiple' => 0,
        ),
    ),

为Person定义的我的TCA MM关系:

    'personalinformation' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:myext/Resources/Private/Language/locallang_db.xlf:tx_myext_domain_model_person.personalinformation',
        'config' => array(
            'type' => 'none',
            'readonly' => 1,
            'foreign_table' => 'tx_myext_domain_model_personalinformation',
            'MM_opposite_field' => 'personalinformation',
            'MM' => 'tx_myext_person_personalinformation_mm',
            'foreign_table_where' => 'AND tx_myext_domain_model_personalinformation.pid=###The-PID-defined-in-my-site-Const-for-personalInformationStoragePid###'
        ),
    ),

如果我在前端var_dump我的Person,则显示所有RecordStores的所有Person.PersonaInformation。但是我该只显示当前站点的PersonalInformation记录。

1 个答案:

答案 0 :(得分:0)

模型中的字段将始终返回所有关系,而与存储pid无关。 TCA中的foreign_table_where仅用于后端,因此对前端没有任何作用。

如果只想从某个pid获取关系,则有几种解决方案:

  1. 在模板,模型或控制器中自行过滤。只需遍历关系并检查pid。此选项最简单,但是如果您有很多关系,则会很慢。
  2. 使用带有PersonalInformationRepository功能的findByPerson在控制器中分别选择PersonalInformation记录。这将遵守TypoScript中设置的storagePid。如果您只需要1个人的信息,这将很好用。如果您需要一页上多个人使用它(例如在列表视图中),则可以在getPersonalInformation模型中的自定义Person函数中执行此操作。如果未缓存,则列表的速度也会变慢(取决于记录的数量)。
  3. 通过QueryBuilder(https://docs.typo3.org/typo3cms/CoreApiReference/latest/ApiOverview/Database/QueryBuilder/Index.html)使用完全自定义的查询。这样,您可以在1个带有联接的查询中做到这一点。

最佳解决方案是什么,取决于您的实际情况和记录的数量。