直接从数据库中为 TYPO3 select 选项设置自定义图标

Setting custom icons for TYPO3 select options directly from database

我已经为带有 TCA 设置的数据库输入创建了一个表单。

其中一个是 select 字段,我需要为每个选项使用不同的图标。这些图标名称(核心图标)存储在数据库字段图标中(可以更改):

+-----+----------------+------------------+
| uid | title          | icon             |
+-----+----------------+------------------+
| 1   | Active         | overlay-approved |
| 2   | Inactive       | overlay-readonly |
| 3   | Old            | overlay-info     |
| 5   | Limited access | overlay-locked   |
+-----+----------------+------------------+

主要数据轻松加载:

'issuer_id' => [
    'exclude' => true,
    'label'   => 'LLL:EXT:lu_nas/Resources/Private/Language/locallang_db.xlf:document.status',
    'config'  => [
        'type'                => 'select',
        'eval'                => 'required',
        'minitems'            => 0,
        'maxitems'            => 1,
        'foreign_table'       => 'tx_lunas_domain_model_status',
        'foreign_table_where' => 'ORDER BY tx_lunas_domain_model_status.title ASC',
        'items'               => [['', '',]],
    ],
],

其中 TCA tx_lunas_domain_model_status.php 设置 ctrl 设置为使用标题 'label' => 'title' 作为名称。

我知道我还可以添加 'iconfile' => 'EXT:lu_nas/Resources/Public/Icons/Status.svg' 以用作所有条目的默认图标,但我不需要(每个条目都需要不同的图标)。

到目前为止我还发现我可以添加带有图标的自定义项目如下:

'items' => [
    ['', ''],
    ['Limited access', 5, 'overlay-locked'],
    ['Inactive', 3, 'overlay-info'],
    ['Old', 2, 'overlay-readonly'],
    ['Active', 1, 'overlay-approved'],
],

但是我如何知道图标名称保存在哪个数据库列中,以便我可以直接从数据库加载此数据?

我很确定,目前您不能在 TYPO3 中执行此操作,但您可以使用 userFunction。在那里你可以为图标添加 class。

'config' => [
    'type' => 'user',
    'userFunc' => YYY\XXX\TCA\TcaReferenceField::class . '->render',
]

代码应该是这样的:

public function render(array $configuration, UserElement $userElement) {
    $row = $configuration['row'];

    // Do some Magic here.

    $select = '<label style="font-weight: 400;">' . self::MESSAGE_FIELD_LABEL;
    $select .= '<select name="' . $configuration['itemFormElName'] . '" class="form-control form-control-adapt" ' .
    'onchange=\'' . $configuration['fieldChangeFunc']['alert'] . '\'>';
    $select .= '<option value=""></option>';
    foreach ($contentElementUids as $siteName => $contentElementUid) {
        $isSelected = ($contentElementUid === (int) $configuration['itemFormElValue']);
        $select .= '<option ' . ($isSelected ? 'selected' : '') . ' value="' . $contentElementUid . '">' .
        $siteName . '</option>';
    }
    $select .= '</select></label>';

    return $select;
}