TYPO3 TCA тип "выберите" проблема производительности

Есть ли возможность использовать тип поля TCA "select" для таблицы, в которой есть тысячи записей?

Поле выбора с записями не должно отображаться (иначе запись загружается минутами или вы получаете ограничение памяти или максимальное время выполнения), но что-то вроде поля поиска (например, существующий мастер "предложить") или браузера записей (например, ТСА типа "группа" имеет).

4 ответа

Решение

Это возможно с типом TCA "group" и (очень важно!) Установкой 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: это свойство на самом деле не существует для полей группового типа. Это необходимо в качестве обходного пути для ограничения Extbase. Он используется для разрешения зависимостей во время сохранения Extbase. Он должен содержать те же значения, что и свойство позволено. Обратите внимание, что здесь разрешено только одно имя таблицы, в отличие от самого свойства.

Я использую старый тип поля TCA 'group', который решает это поведение также в 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 с internal_type установлен в db в качестве альтернативы select тип; который делает именно то, что вам нужно здесь. Это единственный тип поля, который позволяет использовать ваш конкретный вариант использования.

Альтернативы включают использование input введите поле и добавьте его с помощью мастеров, затем настройте мастер таким образом, чтобы он заменял исходное поле и отображался только мастер.

Не забудьте проверить свои ключи SQL для таблицы, которую вы перечисляете. Если в вашем листинге используется неиндексированный столбец, вы можете максимально сократить время, просто добавив индекс SQL для столбцов, которые вы используете.

Один из вариантов - установить поле "только для чтения". Конечно, тогда нельзя редактировать это поле в 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
],
Другие вопросы по тегам