【问题标题】:TYPO3 TCA type "select" performance issueTYPO3 TCA 类型“选择”性能问题
【发布时间】:2017-07-25 14:08:21
【问题描述】:

是否有可能对包含数千个条目的表使用 TCA 字段类型“选择”?

不应显示带有条目的选择框(否则记录会加载几分钟,或者您会遇到内存限制或最大执行时间错误),而是应该显示搜索字段(如现有向导“建议”)或记录浏览器(就像 TCA 类型“组”一样)。

【问题讨论】:

    标签: typo3 typo3-extensions typo3-tca


    【解决方案1】:

    可以使用 TCA 类型“组”和(非常重要!)设置 foreign_table:

    'config' => [
        'type' => 'group',
        'internal_type' => 'db',
        'allowed' => 'fe_users',
        'foreign_table' => 'fe_users'
    ],
    

    来自官方文档 (https://docs.typo3.org/typo3cms/TCAReference/ColumnsConfig/Type/Group.html#foreign-table):

    foreign_table:对于组类型字段,此属性实际上并不存在。需要它作为 Extbase 限制的解决方法。它用于解决 Extbase 持久性期间的依赖关系。它应该与允许的属性保持相同的值。请注意,与允许的属性本身相比,此处只允许一个表名。

    【讨论】:

      【解决方案2】:

      查找group 并将internal_type 设置为db 作为select 类型的替代;这正是您在这里需要的。这是唯一允许您的特定用例的字段类型。

      替代方法包括为字段使用input 类型并为其配备向导,然后配置向导以替换原始字段并仅显示向导。

      不要忘记检查您列出的表的 SQL 键。如果您的列表使用未编入索引的列,您可以通过简单地为您使用的列添加 SQL 索引来最大限度地减少时间。

      【讨论】:

      • 我担心它必须是“选择”或“内联”类型,因为 Extbase 存储库只能正确处理这些类型 - 对“子记录”的查询似乎只能使用这些类型。示例:$query->equals('mySelectField.uid', 123);
      • 听起来像是其他东西,可能是您的域模型注释,应该归咎于此。没有理由 Extbase 存储库不应该像处理任何其他(有效的 TCA)类型一样处理 group 类型字段。也许您没有声明allowed 表列表?
      • \TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapFactory::setRelations。如果你阅读了这个并调用了函数的主体,你就可以知道哪些 TCA 参数被用于这两种类型,以及哪些类型有资格被识别为适当的关系。
      • 如果我使用类型“组”,我会收到此错误:#1353170925:缺少类“...”的属性“...”的关系信息。还有很多其他人有这个问题:google.de/…他们中的许多人说“不要使用TCA类型组”。
      • 此错误表明关系的表名配置不正确,因此很可能您使用了不正确的 TCA 设置来声明目标表。请参阅github.com/TYPO3/TYPO3.CMS/blob/… - 这就是我链接到 DataMapFactory 的原因,因为它解释了作为表名的确切 TCA 设置。如果您需要进一步的帮助,可以粘贴您的实际 TCA ;) 编辑:看起来您找到了答案:foreign_table。
      【解决方案3】:

      我正在使用旧的 TCA 字段类型“组”,它也解决了 TYPO3 CMS 8 中的这种行为

      'my_select_field' => [
          'label' => 'My select field',
          'config' => [
              'type' => 'group',
              'internal_type' => 'db',
              'allowed' => 'my_foreign_table_name',
              'size' => 1,
              'minitems' => 0,
              'maxitems' => 1,
              'suggestOptions' => [
                  'default' => [
                      'pidList' => 0,
                      'searchCondition' => 'hidden=0',
                      'searchWholePhrase' => 1
                  ]
              ]
          ]
      ]
      

      【讨论】:

      • 正如我的问题中提到的,我知道输入“组”。但不幸的是,这种字段类型是不可能的,因为 group 可以包含来自多个表的记录,因此许多 Extbase 操作是不可能的。 Extbase 不支持许多事情的字段类型“组”,例如存储库中的数据库查询,例如 $query->equals('mySelectField.uid', 123);
      • 这是一个错误的断言。 group 类型支持单个表就好了 - 但您可以使用 allowed 设置来控制它,而不是 table 设置。
      • 可以,但 Extbase 存储库中的查询无法处理与 TCA 类型为“组”的其他表的关系,即使您在选项“允许”中仅命名一个表也是如此。
      【解决方案4】:

      一个选项是将字段设置为“只读”。当然,不能在 TYPO3 BE 中编辑此字段,但如果数据即将到来,例如从外部来源,这是我可以忍受的缺点。

      'config' => [
          'type' => 'select',
          'foreign_table' => 'fe_users',
          'size' => 1,
          'minitems' => 1,
          'maxitems' => 2, // it has to be > 1 because else a selectbox is rendered
          'readOnly' => 1, // readOnly because of performance issues
      ],
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-06
        • 2018-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多