这是从旧图像处理到基于 FAL 的参考图像的变化。在 DCE 的早期版本中,文件名已保存在其中,tt_content.pi_flexform
并且有一个预定义/配置的路径,应该在其中搜索该文件。一段时间以来,在 TYPO3 中,文件是通过 FAL 处理的,因此与表条目的关系sys_file
...
几周前,a 为客户迁移了一些 DCE 元素。没有编写升级向导,而是使用了一些 PHP 行。
第一步:导出相关数据
在 DCE 中导出内容元素和文件名的“uid”。
对于 UID=2 的 DCE,文件字段称为“图像”,可以通过以下方式完成:
SELECT ExtractValue(pi_flexform, '//field[@index="settings.image"]/value') as filename, `uid`
FROM `tt_content`
WHERE CType='dce_dceuid2' AND ExtractValue(pi_flexform, '//field[@index="settings.image"]/value')!='';
将结果导出为 CSV。
第 2 步:创建关系sys_file_reference
并更新tt_content
现在我们必须管理对数据库的更改:
sys_file
在 DCE 和-entries之间创建 FAL 关系(以 -records 的形式sys_file_reference
)
- 更新
pi_flexform
现有 DCE 内容元素
- 更新旧式 DCE 的结构
对于这些步骤,我使用 PHP 函数生成了 SQL 查询:
function process(string $csv, string $CType, string $fieldName = 'image'): void
{
foreach (explode(chr(10), $csv) as $line) {
[$fileName, $uid] = explode(';', $line);
if ($fileName && $fileName !== '""') {
$uid = trim($uid);
echo htmlentities("INSERT INTO sys_file_reference (uid_local, uid_foreign, tablenames, fieldname, table_local) VALUES((SELECT uid FROM sys_file WHERE identifier=\"/_migrated_/pics/" . $fileName . "\"), $uid, 'tt_content', '" . $fieldName . "', 'sys_file');",
ENT_QUOTES | ENT_HTML5) . chr(10);
}
}
echo htmlentities('UPDATE tt_content SET pi_flexform=UpdateXML(`pi_flexform`, \'//field[@index="settings.' . $fieldName . '"]/value\', \'<value index=\"vDEF\">1</value>\') WHERE uid=437 AND CType=\'' . $CType . '\' AND ExtractValue(pi_flexform, \'//field[@index="settings.' . $fieldName . '"]/value\')!=\'\';',
ENT_QUOTES | ENT_HTML5) . chr(10);
$configuration = '<config>
<type>inline</type>
<foreign_table>sys_file_reference</foreign_table>
<foreign_field>uid_foreign</foreign_field>
<foreign_sortby>sorting_foreign</foreign_sortby>
<foreign_table_field>tablenames</foreign_table_field>
<foreign_match_fields>
<fieldname>{$variable}</fieldname>
</foreign_match_fields>
<foreign_label>uid_local</foreign_label>
<foreign_selector>uid_local</foreign_selector>
<overrideChildTca>
<columns>
<uid_local>
<config>
<appearance>
<elementBrowserType>file</elementBrowserType>
<elementBrowserAllowed>gif,jpg,jpeg,png</elementBrowserAllowed>
</appearance>
</config>
</uid_local>
</columns>
<types type="array">
<numIndex index="2">
<showitem>--palette--;LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:sys_file_reference.imageoverlayPalette;imageoverlayPalette,--palette--;;filePalette</showitem>
</numIndex>
</types>
</overrideChildTca>
<minitems>0</minitems>
<maxitems>1</maxitems>
<appearance>
<useSortable>1</useSortable>
<headerThumbnail>
<field>uid_local</field>
<width>45c</width>
<height>45</height>
</headerThumbnail>
<enabledControls>
<info>1</info>
<dragdrop>1</dragdrop>
<hide>1</hide>
<new>0</new>
<sort>0</sort>
<delete>1</delete>
</enabledControls>
<createNewRelationLinkTitle>LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:images.addFileReference</createNewRelationLinkTitle>
</appearance>
<behaviour>
<allowLanguageSynchronization>1</allowLanguageSynchronization>
</behaviour>
<dce_load_schema>1</dce_load_schema>
<dce_get_fal_objects>1</dce_get_fal_objects>
</config>
';
echo 'UPDATE tx_dce_domain_model_dcefield SET configuration=\'' . htmlentities($configuration, ENT_QUOTES | ENT_HTML5) . '\' WHERE variable=\'' . $fieldName . '\' AND parent_dce=' . str_replace('dce_dceuid', '', $CType) . ';' . chr(10);
}
现在,我们需要将 CSV 与代码结合起来:
$csv = 'image_1.jpg;82
typo3_box.jpg;904';
process($csv, 'dce_dceuid2', 'image');
这不会改变任何东西,而只会打印出必要的 SQL 查询,这些查询可以被审查、复制和触发。