【问题标题】:TYPO3: Caching issue with new fields in tx_news extensionTYPO3:tx_news 扩展中的新字段的缓存问题
【发布时间】:2020-11-19 09:49:47
【问题描述】:

我创建了一个新扩展程序来向新闻扩展程序添加一些字段。
在后端一切正常,我可以向字段添加值,并且它们正确保存在数据库中。

当我清除缓存并重建 PHP 自动加载信息时,它会显示在前端,但几个小时后新字段会神奇地消失。

我已经使用扩展生成器创建了扩展并手动添加了该字段。
我多次阅读ProxyClass generator 信息,但看不到失败。

看来我需要在缓存或其他地方连接类。
我真的很绝望。

ext:albr_news_new_fields/Classes/Domain/Model/News.php

namespace Albr\AlbrNewsNewFields\Domain\Model;
class News extends \GeorgRinger\News\Domain\Model\News {
/**
     * titulo1
     * 
     * @var string
     */
    protected $titulo1 = '';

ext:albr_news_new_fields/ext_localconf.php

defined('TYPO3_MODE') or die();

$GLOBALS['TYPO3_CONF_VARS']['EXT']['news']['classes']['Domain/Model/News'][] = 'albr_news_new_fields';

\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Object\Container\Container::class)
    ->registerImplementation(\GeorgRinger\News\Domain\Model\News::class,
        \Albr\AlbrNewsNewFields\Domain\Model\News::class);

ext:albr_news_new_fields/ext_tables.php

call_user_func(
    function()
    {
        \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile('albr_news_new_fields', 'Configuration/TypoScript', 'Nuevos campos tx_news');
    }
);

$tempColumns = Array (
    'titulo1' => [
        'exclude' => true,
        'label' => 'LLL:EXT:albr_news_new_fields/Resources/Private/Language/locallang_db.xlf:titulo1',
        'description' => 'LLL:EXT:albr_news_new_fields/Resources/Private/Language/locallang_db.xlf:titulo1.description',
        'config' => [
            'type' => 'input',
            'size' => 50,
            'eval' => 'trim'
…

ext:albr_news_new_fields/Configuration/Typoscript/setup.typoscript

plugin.tx_news {
        persistence {
                classes {
                        GeorgRinger\News\Domain\Model\News {
                                subclasses {
                                        # three different classes are used for each news type
                                        # 0 == default news
                                        0 = Albr\AlbrNewsNewFields\Domain\Model\News
                                }
                        }
                        Albr\AlbrNewsNewFields\Domain\Model\NewsDefault {
                                mapping {
                                        recordType = 0
                                        tableName = tx_news_domain_model_news
                                }
                        }
                        Albr\AlbrNewsNewFields\Domain\Model\News {
                                mapping {
                                        recordType = 0
                                        tableName = tx_news_domain_model_news
                                }
                        }
                }
        }
}

config.tx_extbase {
        persistence {
                classes {
                        GeorgRinger\News\Domain\Model\News {
                                subclasses {
                                        GeorgRinger\News\Domain\Model\News = Albr\AlbrNewsNewFields\Domain\Model\News
                                }
                        }
                        Albr\AlbrNewsNewFields\Domain\Model\News {
                                mapping {
                                        tableName = tx_news_domain_model_news
                                }
                        }   
                }
        }
}

我正在使用:TYPO3 9.5.22 和新闻 7.3.1

【问题讨论】:

  • 嗨,我猜你调用方法 ExtensionManagementUtility::addToAllTCAtypes() 来添加你的新字段。这些新字段必须在文件 Configuration/TCA/Overrides/tx_news_domain_model_news.php 而不是 ext_tables.php 中。
  • 非常感谢!我清理了 ext_tables.php 并将所有 TCA 定义移动到 Configuration/TCA/Overrides/tx_news_domain_model_news.php 与 ExtensionManagementUtility::addToAllTCAtypes() 现在它对我来说很有意义。但是现在我在后端和前端都看不到这些字段。试图卸载/安装/清除缓存/转储......仍然缺少一些东西
  • 一团糟!经过一个小时检查它为什么不起作用后,问题是文件最后有一个空格。现在似乎一切看起来都正常了,看看几个小时后它是否还能正常工作。

标签: php typo3 typo3-9.x tx-news


【解决方案1】:

【讨论】:

  • 哦,我在页面中看到了这个:ext_tables.php 没有被缓存。配置/TCA 中的文件被缓存。 这可能是问题所在。改变了,看起来很有希望,让我们等几个小时看看缓存会发生什么。非常感谢您为我指明了这个方向。
  • 请记住,在 v10 docs.typo3.org/c/typo3/cms-core/master/en-us/Changelog/10.0/… 中,TypoScript 不再支持 Extbase 持久性配置
  • 这是正确的答案,在 'Configuration/TCA/Overrides/tx_news_domain_model_news.php' 中写下非常感谢。
【解决方案2】:

我猜这个问题是因为你覆盖了 tx_news 记录类型 0。

你最好有这样的东西:

plugin.tx_news {
    persistence {
        classes {
            GeorgRinger\News\Domain\Model\News {
                subclasses {
                    3 = Albr\AlbrNewsNewFields\Domain\Model\News
                }
            }
            Albr\AlbrNewsNewFields\Domain\Model\News {
                mapping {
                    recordType = 3
                    tableName = tx_news_domain_model_news
                }
            }
        }
    }
}

然后,在 Configuration/TCA/Overrides/tx_news_domain_model_news.php 中定义一种新类型的记录,其中包含您的新字段:

$GLOBALS['TCA']['tx_news_domain_model_news']['types']['3'] = [
    'showitem' => '
            --palette--;;paletteCore,title,titulo1,--palette--;;paletteSlug,teaser,
            --palette--;;paletteDate,
            bodytext,
        --div--;' . $ll . 'tx_news_domain_model_news.content_elements,
            content_elements,
        --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.media,
            fal_media,fal_related_files,
        --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories,
            categories,
        --div--;' . $ll . 'tx_news_domain_model_news.tabs.relations,
            related,related_from,
            related_links,tags,
        --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.tabs.metadata,
            --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.palettes.editorial;paletteAuthor,
            --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.palettes.metatags;metatags,
            --palette--;' . $ll . 'tx_news_domain_model_news.palettes.alternativeTitles;alternativeTitles,
        --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language,
            --palette--;;paletteLanguage,
        --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access,
            --palette--;;paletteHidden,
            --palette--;;paletteAccess,
        --div--;' . $ll . 'notes,
            notes,
        --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.tabs.extended,'
];

查看 news/Configuration/TCA/tx_news_domain_model_news.php

【讨论】:

  • 非常感谢,这可能是答案,需要等待几个小时才能看到缓存发生了什么。将在此处发布。
  • 我明白这是为了创造一种新的新闻类型,而不是触碰原创。但是,如果我更愿意将其保留为类型 0 来覆盖它,那将是值得的,对吧?
  • 是的,这是用你的新领域创造另一种类型的新闻。我更改了帖子以向您显示确切的代码。您不必等待,只需清除系统缓存即可。我写了另一个答案来告诉你如何保持记录类型 = 0
  • 非常感谢弗洛里安!我试图让新字段首先在前端和后端工作,然后我将创建新类型,这对我来说似乎是一个非常好的解决方案。非常感谢。
【解决方案3】:

如果你想保持记录类型=0,那么,我建议你这样做:

plugin.tx_news {
    persistence {
        classes {
            Albr\AlbrNewsNewFields\Domain\Model\News {
                mapping {
                    recordType = 0
                    tableName = tx_news_domain_model_news
                }
            }
        }
    }
}

并且在 Configuration/TCA/Overrides/tx_news_domain_model_news.php 中,覆盖 type = 0 :

$GLOBALS['TCA']['tx_news_domain_model_news']['types']['0'] = array_replace_recursive(
    $GLOBALS['TCA']['tt_content']['types']['0'],
    [
        'showitem' => '
                --palette--;;paletteCore,title,titulo1,--palette--;;paletteSlug,teaser,
                --palette--;;paletteDate,
                bodytext,
            --div--;' . $ll . 'tx_news_domain_model_news.content_elements,
                content_elements,
            --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.media,
                fal_media,fal_related_files,
            --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:categories,
                categories,
            --div--;' . $ll . 'tx_news_domain_model_news.tabs.relations,
                related,related_from,
                related_links,tags,
            --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.tabs.metadata,
                --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.palettes.editorial;paletteAuthor,
                --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.palettes.metatags;metatags,
                --palette--;' . $ll . 'tx_news_domain_model_news.palettes.alternativeTitles;alternativeTitles,
            --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:language,
                --palette--;;paletteLanguage,
            --div--;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs.xlf:access,
                --palette--;;paletteHidden,
                --palette--;;paletteAccess,
            --div--;' . $ll . 'notes,
                notes,
            --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_tca.xlf:pages.tabs.extended,'
    ]
);

在 ext_emconf.php 中设置 tt_news 依赖项:

$EM_CONF[$_EXTKEY] = [
    ...
    'constraints' => [
        'depends' => [
            'typo3' => '9.5.0-9.5.99',
            'tt_news' => '7.3.1-7.3.99',
        ],
        'conflicts' => [],
        'suggests' => [],
    ],
];

【讨论】:

  • 非常感谢,认为我现在走在正确的道路上。
  • 这就是问题所在。首先,我需要将所有 TCA 声明放在 Configuration / TCA / Overrides 中,而不是像我在某处看到的那样放在 ext_tables.php 中。但我的错也是我使用的文件名:tx_news_domain_model_news.php 末尾有一个空格,这就是它没有加载的原因。我希望如果有人发生类似的事情,它可以提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
相关资源
最近更新 更多