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
],