【问题标题】:Issues with DCE on TYPO3 upgradeTYPO3 升级上的 DCE 问题
【发布时间】:2021-08-18 05:59:18
【问题描述】:

我已经将typo3从9.5.5升级到10.4.19,DCE从2.03.x升级到2.6.2

DCE 升级后,图片上传字段配置似乎更改错误(https://nimb.ws/slTyH8)。图片不在这些字段中,而在 Frontend 中存在图片,即缓存。

我已尝试将 DCE 的旧配置更改为新配置。现在该字段还可以,但是网站已刷新,旧图像已消失。

我有 200 多页。所以不可能重新上传。我已经上传了我的备份,现在我处于之前的状态。

检查了安装工具,很遗憾,DCE 没有升级向导。如何在不丢失图像的情况下使其正确?

帮帮我!

【问题讨论】:

    标签: typo3 typo3-10.x tx-dce


    【解决方案1】:

    这是从旧图像处理到基于 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

    现在我们必须管理对数据库的更改:

    1. 在 DCE 和 sys_file-entries 之间创建 FAL 关系(以 sys_file_reference-records 的形式)
    2. 更新现有 DCE 内容元素的 pi_flexform
    3. 更新旧式 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 查询,这些查询可以被审查、复制和触发。

    【讨论】:

      【解决方案2】:

      感谢大家提供这些详细的解释。

      但是我们找到了另一种解决方法。在分析问题时,图像的旧配置字段名称为&lt;fieldname&gt;{$bannerimage}&lt;/fieldname&gt;,并且在数据库中 sys_file_reference 表的字段名称包含与 '{$bannerimage} 相同的变量

      我们为解决这个问题所做的工作是:

      将镜像配置更新为最新的conf,然后将&lt;fieldname&gt;{$variable}&lt;/fieldname&gt;替换为&lt;fieldname&gt;bannerimage&lt;/fieldname&gt; 在数据库中也是如此。字段名从{$bannerimage} 更改为bannerimage 这解决了所有问题而不会丢失图像。

      【讨论】:

        猜你喜欢
        • 2022-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        • 2016-05-26
        相关资源
        最近更新 更多