TYPO3:在 TCA 中使用 ###PAGE_TSCONFIG_ID### 和 addRecord

TYPO3: Using ###PAGE_TSCONFIG_ID### with addRecord in TCA

手头的问题与 TCA 及其 addRecord 选项有关,它应该将新记录保存到由 ###PAGE_TSCONFIG_ID### 配置的特定 pid。 (TYPO3 8.7.24, php 7.2)

websites 扩展有一个 tx_rwfm_domain_model_websitecategory 和一个 tx_rwfm_domain_model_website table,通过 m:m table 关联。这个想法是创建网站类别,然后收集分配给类别的网站。在 BE 中,类别 (pid=24) 和网站 (pid=12) 在站点树中都有自己的文件夹。 websitecategory 有一个 multiSelectField 可以轻松 select 网站并将它们分配到相关类别。 "website" 还有一个用于类别的 multiSelectField,可以轻松地将网站分配给多个类别。

到目前为止一切正常。

现在我遇到了这种情况:

要点是:新网站必须在其自己的文件夹页面 (pid=12) 中创建,而不是在网站类别页面 (pid=24) 中创建。为此,有 属性 ###PAGE_TSCONFIG_ID###,我尝试这样配置:

// TCA of websitecategory

return [
  [...],
  'columns' => [
    'websites' => [
      'config' => [
        'type' => 'select',
        'renderType' => 'selectMultipleSideBySide',
        'enableMultiSelectFilterTextfield' => true,
        'foreign_table' => 'tx_rwfm_domain_model_website',
        'foreign_table_where' => 'AND tx_rwfm_domain_model_website.sys_language_uid IN (-1,0) ORDER BY tx_rwfm_domain_model_website.title ASC',
        'MM' => 'tx_rwfm_domain_model_website_websitecategory_mm',
        'MM_opposite_field' => 'categories',
        'fieldControl' => [
          'editPopup' => [...],
          'addRecord' => [
            'disabled' => false,
            'options' => [
              'setValue' => 'prepend',
              'title' => 'Create a new website record',
              'table' => 'tx_rwfm_domain_model_website',
              'pid' => '###PAGE_TSCONFIG_ID###',
            ],
          ],
        ]
      ]
    ]
    [...]
]

按照文档 https://docs.typo3.org/typo3cms/TSconfigReference/8.7/PageTsconfig/TCEform/Index.html?highlight=page_tsconfig_id 我将其添加到我的页面 TSconfig:

// TSconfig

TCEFORM {
    tx_rwfm_domain_model_website {
        pid.PAGE_TSCONFIG_ID = 12
    }
    tx_rwfm_domain_model_websitecategory {
        pid.PAGE_TSCONFIG_ID = 28
    }
}

不幸的是,这不起作用。相反,TYPO3 尝试将其添加到 [root_level] 0, where the table is not allowed。 但是,如果我将 TCA -> addRecord 中的 ###PAGE_TSCONFIG_ID### 替换为 pid 的硬编码值 12,该网站确实保存在正确的页面文件夹中pid 12.

如何配置 TSconfig 才能使保存过程正常工作?

据我阅读源代码,这仅适用于 foreign_table_where.

中定义的值

经过相当长的时间(实际上是几年!),我终于清楚了,您需要将 PID_TSCONFIG_ID 分配给的字段必须是充当枢轴的字段到 m:m 关系。或:反场。更令人困惑的是,根据定义,相反的字段只能在关系的一侧定义。因此,对于 "other side",您需要查看相关 table 的名称并使用该名称。

在上面的示例中,这意味着必须使用 categories 而不是 pid:

// TSconfig

TCEFORM {
  tx_rwfm_domain_model_website {
    categories.PAGE_TSCONFIG_ID = 12
  }
  tx_rwfm_domain_model_websitecategory {
    websites.PAGE_TSCONFIG_ID = 28
  }
}

这样,记录就会保存到给定的页面 ID。谢谢 TYPO3,提供关于该主题的如此神秘的文档! :-( 会尽快在这方面改进文档。

在常量 PAGE_TSCONFIG_ID 之前使用 pid 作为 table 引用很可能是您要处理的错误字段。所以这个:

TCEFORM {
    tx_rwfm_domain_model_website {
        pid.PAGE_TSCONFIG_ID = 12
    }
    tx_rwfm_domain_model_websitecategory {
        pid.PAGE_TSCONFIG_ID = 28
    }
}

应该变成这样:

TCEFORM {
    tx_rwfm_domain_model_website {
        [field_of_related_table].PAGE_TSCONFIG_ID = 12
    }
    tx_rwfm_domain_model_websitecategory {
        [field_of_related_table].PAGE_TSCONFIG_ID = 28
    }
}